Конференция "Игры" » Удаление тектстуры [Delphi, Windows]
 
  • Hortik (27.03.08 21:03) [0]
    Удаление тектстуры.
    1)Когда я зугружаю текстуру, если она не нужна на определенном этапе программы надо ли ее удалять?
    2)Как это сделать в OpenGL?
  • @!!ex © (27.03.08 21:14) [1]
    1)
    Только тебе видно, надо ее удалять или не надо. Все зависит от архитектуры движка и от того, что за текстура.
    Например, если сначала грузится летний левел, а следом зимний, то имеет смысл грохнуть все летние текстуры, чтобы не жрали оперативу.
    Лично я пока не сталкивался с необходимостью удаления текстур(в ближайшее время столкнусь).
    Есть идея выставлять время жизни текстуры(например, грузится обычная моделька, ейным текстурам выставляется время жизни 10 минут, если в течении 10 минут она ниразу не биндится, текстура грохается, а при следубщем бинде грузится заново), должно нормально работать. ПРавда для эффективности работы стоит при первом запуске конвертить картинки в какой нить формат, который быстро грузится, чтобы подгрузка небыла визуально заметна.

    2)
    procedure glDeleteTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
  • Hortik (27.03.08 21:25) [2]
    Да, я это  и имел ввиду .
    Один уровень пройден, то переходя на сдедующий необходимо удалить все текстуры предыдущего уровня. Правильно я считаю.?

    Еше вопрос. Видел, пишут менеджеры текстур, Зачем?
    Можно просто удалить текстуру командой  opengl32.
  • @!!ex © (27.03.08 21:38) [3]
    > [2] Hortik   (27.03.08 21:25)

    Менеджер текстур пишут, что менеджить текстуры. :)
    Просто загрузка текстур на сколь либо сложном проекте не канает.
    Например, есть у мну на сцене 20 разных домиков.
    И все они используют для стен деревянную текстуру. Одну и туже.
    Как ты будешь контролировать, сколько раз надо грузит ьтекстуру?

    В менеджере это делается на раз, хранится имя файла, при запросе ищется. нашли - тупо отдаем ID, не нашли - создаем.
    Опять же, наднях реализовал анимированные текстуры.
    Десяток строчек изменений в менеджере текстур, движок и не узнал, что появился новый тип текстур.
    ТОже самое с введением времени жизни текстур, движок и не узнает о том, что появилось время жизни текстуры, он просто ее биндит, а менеджер решает че с ней делать, грузить, удалять, в свап кинуть или еще че.
    Тоже самое с перехзодом на другой API. Движку накласть на то, что такое текстура с точки зрения API. У движка есть ID и все. Я могу сейчас полностью переписать менеджер текстур под DX, и двиг об этом не узнает. Т.к. со всем работает через менеджер.

    Объяснил? :)
  • Hortik (27.03.08 21:55) [4]
    Спасибо за совет. :)
    Вроде пока понял.
    Пошел я мучать текстурные менеджеры..........
  • Hortik (27.03.08 22:10) [5]
    Вопросик ...
    Почему компилятор пишет что непонятный индификатор
    GL_TEXTURE_MAX_ANISOTROPY_EXT
  • @!!ex © (27.03.08 22:26) [6]
    > [5] Hortik   (27.03.08 22:10)
    > GL_TEXTURE_MAX_ANISOTROPY_EXT

    Потому что эта константа не является частью стандарта OpenGL 1.0(хедеры для коего поставляются для Delphi)
    Хочешь использовать - пиши свой модуль(я так делаю, просто дописываю в него расширения, которая мне нужны, это позволяет жестче контролировать используемые технологии), либо найди в нете более свежий хедер(OpenGL 2.0 - свежий) и его используй.
  • Hortik (27.03.08 22:49) [7]
    glDeleteTextures(1, @ID);

    И для этой функции пишет то же самое. Для нее тоже нужны хедеры
  • Hortik (27.03.08 23:04) [8]
    работает :)
  • Hortik (27.03.08 23:42) [9]
    Еще вопросик по фильтрации...

    Хотел протестить отличия фильтрации  BILINEAR ,TRILINEAR , ANISOTROPY
    Все четыри спрайта одинаковы. почему я не вижу разницы.
    Вот код который создает текстуру.


    glGenTextures(1, Texture);
     glBindTexture(GL_TEXTURE_2D, Texture);
     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

     case Filter of
             F_NONE :
               begin
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
               end;
             F_BILINEAR :
               begin
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
               end;
             F_TRILINEAR :
               begin
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
               end;
             F_ANISOTROPY :
               begin
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, GL_max_aniso);
               end;
    end;

     if Format = GL_RGBA then
       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
     else
       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData);

     result := Texture;

  • XProger © (28.03.08 02:58) [10]
    Hortik, :)
    НЕ видишь разницы потому как не понимаешь когда эта разница будет заметна. Анизотропная фильтрация в отличии от остальных зависит от наклона плоскости к направлению взгляда :)
  • Elec3C © (28.03.08 03:14) [11]
    с менеджерами текстур намного легче работать - экономит память + удобно работать!
  • Hortik (28.03.08 16:03) [12]
    Не понимаю разницу в фильтрациях
    Обьясните мне пожалуйста.
  • @!!ex © (28.03.08 16:09) [13]
    > [12] Hortik   (28.03.08 16:03)

    GL_NEAREST - не фильтрует текстуру. Тупо возвращает значение текселя как есть.
    GL_LINEAR - фильтрует линейно. если координата попадает между двух текстелей, то берутся значения текстелей и интерполируются.
    GL_LINEAR_MIPMAP_LINEAR - не в курсе, но по логике генерит MipMap уровни с линейной фильтрацией.
  • Hortik (28.03.08 16:40) [14]
    Так для двухмепнрй спратовой игрушки не имет смысла ипользовать  BILINEAR ,TRILINEAR , ANISOTROPY фильтрацию так как игрок разницу не увидит .
    так ли это ?
  • XProger © (28.03.08 16:46) [15]
    Hortik, для 2д игрушки имеет смысл лишь билинейная фильтрация. И то в случае если спрайт будет изменять свои размеры на отличные от размера текстуры на экране.
  • Sapersky (28.03.08 17:05) [16]
    Не понимаю разницу в фильтрациях

    http://www.ixbt.com/video/anisotropic.html

    GL_LINEAR_MIPMAP_LINEAR - не в курсе, но по логике генерит MipMap уровни

    Генерит мип-уровни gluBuild2DMipmaps (помнится, уже обсуждали разницу в скорости между gluBuild2DMipmaps и glTexImage2D, которая не генерит).  GL_LINEAR_MIPMAP_LINEAR задаёт метод их использования (все варианты расписаны в стандартной справке по GL).

    для 2д игрушки имеет смысл лишь билинейная фильтрация.

    TRILINEAR возможно тоже, если предполагается сильное (более чем в 2 раза) уменьшение спрайта. Ну или лучше, наверное, GL_LINEAR_MIPMAP_NEAREST, т.е. без смешивания мип-уровней.
  • @!!ex © (28.03.08 17:27) [17]
    > [16] Sapersky   (28.03.08 17:05)

    А! Точно! Поэтому и написал, что не в курсе - есть воспоминание, что что-то обсуждали.
    В теме про Виртуальный десктоп
 
Конференция "Игры" » Удаление тектстуры [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]