根据我所读到的,为了在着色器中采样模板纹理,我需要设置GL_DEPTH_STENCIL_TEXTURE_MODE
,所以我这样做:
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_COMPONENTS);
但是我得到一个无效的枚举…为什么会这样?
根据手册页,这个调用的正确enum值应该是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,但如果要初始化GLEW,则至少必须调用glewInit
。