如何利用GL_ARB_stencil_texturing



根据我所读到的,为了在着色器中采样模板纹理,我需要设置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_COMPONENTGL_STENCIL_INDEX

基于此,调用应该是:
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);

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

GL_STENCIL_COMPONENTSglGetInternvalFormativ()的有效参数,但不适合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

相关内容

  • 没有找到相关文章