Я видел много примеров для жесткого кодирования количества текстурных единиц в программе. Например:
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, object1BaseImage);
glActiveTexture(GL_TEXTURE0 + 2);
glBindTexture(GL_TEXTURE_2D, object1NormalMap);
glActiveTexture(GL_TEXTURE0 + 4);
glBindTexture(GL_TEXTURE_2D, shadowMap);
Проблема в том, что две одновременно используемые текстуры могут конфликтовать друг с другом при использовании одного и того же текстурного блока при рендеринге сцены. Мой вопрос заключается в том, как автоматически выделить текстурный блок в OpenGL путем реализации класса или функции? поскольку есть много различных констант, которые определяют, сколько объектов сэмплера я могу использовать:
GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,
GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS,
GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS,
GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS,
GL_MAX_TEXTURE_IMAGE_UNITS and
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.
Меня смущают константы, разве не должно быть постоянной GL_MAX_FRAGMENT_TEXTURE_IMAGE_UNITS
? Я думаю, мне нужно получить максимальное количество текстурных единиц при выделении.
Так что есть два вопросы:
GL_MAX_FRAGMENT_TEXTURE_IMAGE_UNITS
,Есть идеи? фрагмент кода был бы очень признателен.
Как написать класс или функцию автоматически выделить текстурный блок, используя константы.
Это просто: нет.
«Распределение» текстурных единиц изображения обычно выполняется соглашением, установленным программа(ы) вы собираетесь использовать. Вы решаете, что единица 0 — это то место, куда идет диффузная текстура; если конкретная сетка&шейдер не имеет диффузной текстуры, вы не помещаете что-то в блок 0. Блок 12 может быть тем, куда идут карты теней.
Вот почему shading_language_420pack позволяет установить текстурный блок непосредственно внутри шейдера. Даже без этого вы должны обычно устанавливать текстурный блок сэмплера после компиляции шейдера и не перемещать его.
Нет смысла менять состояние программы, когда это не нужно.
На оборудовании 3.3+ у вас есть не менее 48 текстурных блоков. Вы вряд ли выбежите.
поскольку есть много различных констант, которые определяют, сколько объектов сэмплера я могу использовать:
Нет, есть один константа, определяющая, сколько «объектов сэмплера» вы можете использовать: GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
, Это жесткое ограничение на общее количество единиц текстурного изображения, которое предоставляет OpenGL. glActiveTexture
занимает число между GL_TEXTURE0
а также GL_TEXTURE0+GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
,
Отдельные — это максимальное количество типов сэмплеров GLSL, которые могут быть активны в этап одного шейдера. Что касается того, который вы используете для фрагментных шейдеров, это GL_MAX_TEXTURE_IMAGE_UNITS
, Это по старым причинам, так как изначально только фрагментные шейдеры могли получить доступ к текстурам.
Других решений пока нет …