Каково правильное поведение, когда 1D и 2D текстура связаны в OpenGL? - PullRequest
11 голосов
/ 07 мая 2010

Скажем, у вас есть что-то вроде этого:

glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...

Что такое правильное поведение OpenGL? Чтобы нарисовать 1d текстуру, 2d или оба? Для каждой активной текстуры есть несколько текстур, которые могут быть привязаны к ней одновременно (например, 1d, 2d, 3d карта куба и т. Д.)?

Ответы [ 3 ]

13 голосов
/ 07 мая 2010

Состояние 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.

0 голосов
/ 07 мая 2010

Применяемая текстура является последней из указанных в подпрограмме BindTexture.

Из спецификации:

Новый объект текстуры, связанный с цель есть, и остается текстура размерности и типа, указанного в цели пока он не будет удален. .... если связывание выполнено успешно, без изменения состояния связанного объекта текстуры, и любая предыдущая привязка к цели нарушена .

Действительно, в вашем примере будет применена 1D текстура, так как она «перезаписывает» состояние активного текстурного блока.

0 голосов
/ 07 мая 2010

Я думаю, что 1d текстура будет нарисована. Насколько я знаю, каждый текстурный блок может иметь только одну текстуру, привязанную за раз. Количество измерений текстуры на самом деле не учитывается.

Чтобы привязать более одной текстуры, нужно активировать более одного текстурного блока (используя glActiveTexture), например:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, my2dTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, my1dTex);

Это вытекает из моих знаний OpenGL 2.1, поэтому, пожалуйста, исправьте меня, если они представили какое-то необычное новое расширение текстуры в более поздней версии!

...