根据我的阅读,要在着色器中对模板纹理进行采样,我需要设置GL_DEPTH_STENCIL_TEXTURE_MODE
,所以我这样做了:
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_COMPONENTS);
但我得到一个无效的枚举......为什么会这样?
根据我的阅读,要在着色器中对模板纹理进行采样,我需要设置GL_DEPTH_STENCIL_TEXTURE_MODE
,所以我这样做了:
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_COMPONENTS);
但我得到一个无效的枚举......为什么会这样?
根据手册页,此调用的正确枚举值将是GL_STENCIL_COMPONENT
,而不是GL_STENCIL_COMPONENTS
(注意尾随S
)。
事实证明,手册页是错误的。不幸的是,这并不罕见。如果您在规范中查找它(例如,OpenGL 4.5 规范文档中第 225 页上的表 8.17),有效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()
。
我假设您仅从核心 dll 文件 opengl32.dll 中初始化函数,并且仅添加了 gl.h 或 glu.h 标头。这些头文件不会仅从外部直接链接库文件从图形驱动程序加载函数。如果您浏览 opengl32.dll 中定义的函数,您可能找不到您可能想要使用的所有函数,例如与顶点缓冲区相关的函数。尽管如此,某些常量可能未在您可能引用的 gl.h 中定义,例如 GL_DEPTH_STENCIL_TEXTURE_MODE。这些函数可以根据操作系统,通过适当的加载方式加载,在windows中可以使用wglGetProcAddress
。如需更多信息,请阅读本文。这些常量也可以在其他地方定义。
幸运的是,GLEW已经为您完成了这项工作,如果您在 glew.h 中搜索 GL_DEPTH_STENCIL_TEXTURE_MODE,您可能会找到分配给它的 0x90EA。如果您只想使用常量,则不必初始化 GLEW,但如果这样做,您至少必须调用glewInit
.