Как избежать вызовов glBindTexture ()? - PullRequest
2 голосов
/ 11 сентября 2010

Моя игра рендерит множество кубов, которые случайным образом имеют 1 из 12 текстур.Я уже Z упорядочил геометрию, поэтому я не могу просто визуализировать все кубы с texture1, затем 2, 3 и т. Д., Потому что это победит z-упорядочение.Я уже слежу за предыдущими текстурами, и они ==, тогда я не вызываю glbindtexture, но это слишком много вызовов для этого.Что еще я могу сделать?

Спасибо

Ответы [ 3 ]

1 голос
/ 11 сентября 2010

Максимальным и быстрым способом было бы иметь массив текстур (нормальных или кубических карт). Затем динамически извлекайте фрагмент текстуры в соответствии с идентификатором, хранящимся в данных каждого экземпляра куба / или данных грани куба (если вам нужна другая текстура для каждого грани куба), используя встроенную в GLSL gl_InstanceID или gl_PrimitiveID.

В этой реализации вы бы связали массив текстур только один раз.

Это, конечно, потребовало бы использования расширений gpu_shader4 и texture_array:

Я использовал этот механизм (используя D3D10, но принцип также применим), и он работал очень хорошо.

Мне пришлось нанести на спрайты (3D-точки с постоянным размером экрана 9x9 или 15x15 пикселей IIRC) разные текстуры, каждый из которых по-разному означает для пользователя.

Edit:

Если вы не чувствуете себя комфортно со всеми шейдерами, я бы просто сортировал кубы по текстурам, а не Z упорядочивал геометрию. Затем измерьте прирост производительности.

Также я бы попытался добавить проход до Z, где вы рендерите все свои кубы только в буфере Z, затем рендеринге нормальной сцены и посмотрите, не ускоряет ли это вещи (если фрагменты связаны, это может помочь).

1 голос
/ 11 сентября 2010

Вы можете упаковать свои текстуры в одну текстуру и соответственно сместить координаты текстуры

glMatrixMode(GL_TEXTURE) также позволит вам выполнять преобразования в пространстве текстуры (чтобы избежать изменения всех координат текстуры)

0 голосов
/ 11 сентября 2010

Также от NVIDIA: Bindless Graphics

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...