如何利用 GL_ARB_stencil_texturing

How to utilize GL_ARB_stencil_texturing

据我所知,要在着色器中对模板纹理进行采样,我需要设置 GL_DEPTH_STENCIL_TEXTURE_MODE,所以我这样做了:

glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_COMPONENTS);

但是我得到了一个无效的枚举...为什么会这样?

我假设您仅从核心 dll 文件 opengl32.dll 中初始化了函数,并且仅添加了 gl.h 或 glu.h headers。这些 headers 不从图形 driver 仅从外部直接 link 库文件加载函数。如果您浏览 opengl32.dll 中定义的函数,您可能找不到您可能想要使用的所有函数,例如与顶点缓冲区相关的函数。尽管如此,您可能引用的 gl.h 中可能没有定义某些常量,例如 GL_DEPTH_STENCIL_TEXTURE_MODE。这些函数可以根据操作系统使用合适的加载方式加载,在windows中可以使用wglGetProcAddress。如需更多信息,请阅读 this 文章。这些常量也可以在其他地方定义。

幸运的是,GLEW 已经为您完成了这项工作,如果您在 glew.h 中搜索 GL_DEPTH_STENCIL_TEXTURE_MODE,您可能会找到分配给它的 0x90EA。如果您只想使用常量,则不必初始化 GLEW,但如果这样做,您至少必须调用 glewInit.

根据 man page,此调用的正确枚举值应该是 GL_STENCIL_COMPONENT,而不是 GL_STENCIL_COMPONENTS(注意尾随 S)。

事实证明,手册页是错误的。不幸的是,这并不罕见。如果您在规范中查找它(例如 OpenGL 4.5 规范文档中第 225 页的 table 8.17),DEPTH_STENCIL_TEXTURE_MODE 的有效值为 GL_DEPTH_COMPONENTGL_STENCIL_INDEX

据此,调用应为:

glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);

此功能需要 OpenGL 4.3 或更高版本。

GL_STENCIL_COMPONENTSglGetInternvalFormativ() 的有效参数,但不是 glTexParameteri().