Хорошо, так что эти текстуры действительно меня смущают. Я смотрел на этот учебник (который я считаю замечательным), особенно изображение с надписью "Вы можете определить до 32 единиц текстуры, но всего 8 текстур за шейдер.". Как я понимаю, здесь, как это работает:
Вы активируете блок текстуры. Затем вы привязываете объект текстуры (аналогичный кубам "Данные текстуры" на изображении) к определенной цели внутри этого устройства. Итак, glGenTextures, чтобы сделать объекты и получить их имена, а затем glBindTexture, чтобы связать эту текстуру с TEXTURE_2D или что-то (на данный момент меня не интересуют другие цели). Затем вы можете указать данные текстуры с помощью glTexImage2D.
Теперь. Я использую 3 шейдерных программы, каждая из которых требует различных текстур. Вот что я хочу сделать:
На этапе инициализации я просматриваю каждую из своих текстурных единиц и выхожу
- glActiveTexture
- glBindTexture (работает с активной текстурной единицей)
- glTexImage2D (работает с текущим связанным объектом)
а для шейдеров - glUniform, чтобы соответствовать униформе в каждом шейдере к значению "i", указанному в GL_TEXTUREi glActiveTexture. Мне нужно всего четыре текстуры, и они довольно маленькие.
Теперь, во время рендеринга, я должен иметь возможность переключать программы в порядке, и все работает, правильно? У каждой программы уже есть единое целое, указывающее, какой блок использовать, и каждая единица уже имеет объект, привязанный к своей цели TEXTURE_2D, и каждый объект имеет данные, указанные glTexImage2D, правильно? Итак, в моей функции рендеринга не требуется привязка или активация единиц? По крайней мере, так, как я это понял, но я получаю неправильные текстуры в неправильных местах.
Кроме того, в одной из моих программ я хочу переключиться между тремя текстурами для одной поверхности. Поэтому я решил, что загружаю каждую текстуру в объект и привязываю каждый объект к единице, а затем во время рендеринга я могу просто glUniform сообщить программе, какую текстурную единицу использовать.
Итак, мне интересно, не понял ли я фундаментальную структуру текстурирования в OpenGL, или истекает ли привязка объектов к единицам при переключении программ или что-то в этом роде. Или нужно привязать текстуру несколько раз - но когда и почему?