2015-07-16 5 views
1

Из того, что я прочитал, чтобы образец текстуры трафарета в затенении, мне нужно, чтобы установить GL_DEPTH_STENCIL_TEXTURE_MODE, так что я сделал это:Как использовать GL_ARB_stencil_texturing

glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_COMPONENTS); 

, но я получаю недопустимое перечисление ... Почему это так?

ответ

3

Согласно man page, правильное значение перечисления для этого вызова будет GL_STENCIL_COMPONENT, не GL_STENCIL_COMPONENTS (обратите внимание на заднюю S).

Как оказалось, страница руководства неверна. К сожалению, это не является чем-то необычным. Если вы посмотрите в спецификации (например, таблица 8.17 на стр. 225 в документе спецификации OpenGL 4.5), допустимыми значениями для DEPTH_STENCIL_TEXTURE_MODE являются GL_DEPTH_COMPONENT и GL_STENCIL_INDEX.

Исходя из этого, вызов должен быть:

glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX); 

Эта функция требует OpenGL 4.3 или выше.

GL_STENCIL_COMPONENTS является действительным аргументом для glGetInternvalFormativ(), но не для glTexParameteri().

+0

Ah..see Мне было интересно об этом, так как это страница для упомянутого расширения, но я не мог найти GL_STENCIL_COMPONENT в любом месте glext.h. У меня есть, поэтому я подумал, что, возможно, они переименовали его или что-то в этом роде. Например, это не в заголовке [this] (https://www.opengl.org/registry/api/GL/glext.h), который имеет определения для 4.3 ... –

+0

Вы не знаете, где он определен для вас? Кажется, я нигде не знаю, как это определить! –

+0

@RamonJohannessen Хороший звонок. Оказывается, что страница пользователя сломана, и этого значения на самом деле не существует. См. Новую версию ответа. –

0

Я предполагаю, что вы только инициализировали функции из файла dll файла opengl32.dll и добавляли только gl.h или, возможно, glu.h заголовки. Эти заголовки не загружают функции из графического драйвера только из внешнего файла библиотеки прямых ссылок. Если вы выполняете функции, определенные в opengl32.dll, вы не можете найти все функции, которые вы можете использовать, например функции, связанные с буферами вершин. И тем не менее некоторая константа не может быть определена в gl.h, которую вы можете ссылаться, например GL_DEPTH_STENCIL_TEXTURE_MODE. Эти функции могут быть загружены соответствующим методом загрузки в соответствии с операционной системой, в окнах вы можете использовать wglGetProcAddress. Для получения дополнительной информации см. Статью this. Также эти константы могут быть определены где-то в другом месте.

К счастью, для вас это уже сделано , если вы ищете GL_DEPTH_STENCIL_TEXTURE_MODE в glew.h, вы можете найти 0x90EA, назначенный ему. Если вы хотите использовать только константы, которые вам не нужно инициализировать GLEW, но если вы это сделаете, вам необходимо хотя бы позвонить glewInit.