Максимальным и быстрым способом было бы иметь массив текстур (нормальных или кубических карт). Затем динамически извлекайте фрагмент текстуры в соответствии с идентификатором, хранящимся в данных каждого экземпляра куба / или данных грани куба (если вам нужна другая текстура для каждого грани куба), используя встроенную в GLSL gl_InstanceID
или gl_PrimitiveID
.
В этой реализации вы бы связали массив текстур только один раз.
Это, конечно, потребовало бы использования расширений gpu_shader4 и texture_array:
Я использовал этот механизм (используя D3D10, но принцип также применим), и он работал очень хорошо.
Мне пришлось нанести на спрайты (3D-точки с постоянным размером экрана 9x9 или 15x15 пикселей IIRC) разные текстуры, каждый из которых по-разному означает для пользователя.
Edit:
Если вы не чувствуете себя комфортно со всеми шейдерами, я бы просто сортировал кубы по текстурам, а не Z упорядочивал геометрию. Затем измерьте прирост производительности.
Также я бы попытался добавить проход до Z, где вы рендерите все свои кубы только в буфере Z, затем рендеринге нормальной сцены и посмотрите, не ускоряет ли это вещи (если фрагменты связаны, это может помочь).