Каково правильное поведение, когда как 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-текстура, так как она "перезаписывает" состояние активной текстурной единицы.