Каково правильное поведение, когда как 1D, так и 2D-текстура связаны в OpenGL?
Скажите, что у вас есть что-то вроде этого:
glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...
Каково правильное поведение OpenGL? Чтобы нарисовать 1d текстуру, 2d или оба? Для каждой активной текстуры есть фактически несколько текстур, которые могут быть привязаны к ней в одно и то же время (т.е. Карта 1d, 2d, 3d куба и т.д.)?
Ответы
Ответ 1
Состояние GL для привязок - это одно имя текстуры для каждой цели (то есть 1D/2D/3D/куб). Поэтому при вызове
glBindTexture(GL_TEXTURE_2D, my2dTex)
glBindTexture(GL_TEXTURE_1D, my1dTex)
GL запомнит обе настройки.
Теперь ответ, который будет использовать один GL, зависит от того, включен ли шейдер.
Если шейдер включен, GL будет использовать все, что говорит шейдер. (на основе sampler1d/sampler2d...).
Если шейдер не включен, сначала он зависит от того, какой вызов glEnable был выполнен.
glEnable(GL_TEXTURE_2D)
glEnable(GL_TEXTURE_1D)
Если оба параметра включены, в спецификации есть правило статического приоритета (приложение текстуры 3.8.15 в спецификации GL 1.5).
Cube > 3D > 2D > 1D
Итак, в вашем случае, если оба целевых объекта текстуры включены, будет использоваться 2D файл.
В качестве заметки обратите внимание, как шейдер не заботится о том, включена ли цель текстуры...
Изменить для добавления:
И для людей, которые действительно хотят получить подробные сведения, у вас всегда есть текстура, привязанная к каждой цели * каждой единицы. Имя 0 (по умолчанию для состояния привязки) соответствует ряду объектов текстуры, по одному на цель. glBindTexture(GL_TEXTURE_2D, 0)
и glBindTexture(GL_TEXTURE_1D, 0)
связывают текстуру, но не одну...
Это историческое значение, указанное в соответствии с поведением GL 1.0, где объекты текстуры еще не существовали. Я не уверен, что это было в GL3.0 с этим.
Ответ 2
Я думаю, что 1d текстура будет нарисована. Насколько мне известно, каждая текстурная единица может иметь только одну текстуру за раз. Количество размеров текстуры на самом деле не входит в нее.
Чтобы иметь более одной границы текстуры, вам нужно активировать более одного блока текстуры (используя glActiveTexture), например:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, my2dTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, my1dTex);
Это связано с моими знаниями OpenGL 2.1, поэтому, пожалуйста, исправьте меня, если они представили какое-то новое новое расширение текстуры в более поздней версии!
Ответ 3
Приложенная текстура является последней, указанной с помощью процедуры BindTexture.
Из спецификации:
Новый объект текстуры, привязанный к target является и остается текстурой размерности и типа, заданных целевым пока он не будет удален..... Если привязка успешно не изменяется в состояние связанного объекта текстуры, и любая предыдущая привязка к цели нарушена.
Действительно, в вашем примере будет применена 1D-текстура, так как она "перезаписывает" состояние активной текстурной единицы.