Каково корректное поведение, когда и 1D и 2D структура связываются в OpenGL?

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

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

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

11
задан Chris 6 May 2010 в 22:27
поделиться

3 ответа

Состояние 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 Texture Application в спецификации GL 1.5).

Cube > 3D > 2D > 1D

Так что в вашем случае, если обе цели текстуры включены, будет использоваться 2D-цель.

В качестве примечания, обратите внимание, что шейдеру все равно, включена ли цель текстуры или нет...

Редактировать добавить:

И для тех, кто действительно хочет разобраться в деталях, у вас всегда есть текстура, связанная с каждой целью * каждого блока. Имя 0 (по умолчанию для состояния привязки) соответствует серии объектов текстуры, по одному на цель. glBindTexture(GL_TEXTURE_2D, 0) и glBindTexture(GL_TEXTURE_1D, 0) оба связывают текстуру, но не одну и ту же...

Это исторический момент, заданный для соответствия поведению GL 1.0, где текстурных объектов еще не существовало. Однако я не уверен, что с этим сделала депривация в GL3.0.

13
ответ дан 3 December 2019 в 08:54
поделиться

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

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

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

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

0
ответ дан 3 December 2019 в 08:54
поделиться

Применяемая текстура - это последняя, указанная в процедуре BindTexture.

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

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

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

0
ответ дан 3 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: