如何利用GL_ARB_stencil_texturing

时间:2015-07-16 08:58:40

标签: opengl opengl-4 stencils opengl-extensions

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

glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_COMPONENTS);

但是我的枚举无效......为什么会这样?

2 个答案:

答案 0 :(得分:4)

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

事实证明,手册页错了。不幸的是,这并不罕见。如果您在规范中查找(例如,OpenGL 4.5规范文档中的第225页的表8.17),GL_DEPTH_COMPONENT的有效值为GL_STENCIL_INDEXglTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);

基于此,呼叫应该是:

GL_STENCIL_COMPONENTS

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

glGetInternvalFormativ()glTexParameteri()的有效参数,但不适用于a { background-image:url('myimage.jpg'); } a:hover { background-image:url('myotherimage.jpg'); }

答案 1 :(得分:0)

我假设您只从核心dll文件opengl32.dll中初始化函数,并且只添加了gl.h或者可能是glu.h标头。这些标头不仅从外部直接链接库文件加载图形驱动程序中的函数。如果您浏览opengl32.dll中定义的函数,则可能找不到您可能想要使用的所有函数,例如与顶点缓冲区相关的函数。然而,在您可能引用的gl.h中可能没有定义某些常量,例如GL_DEPTH_STENCIL_TEXTURE_MODE。这些函数可以根据操作系统通过适当的加载方法加载,在Windows中可以使用wglGetProcAddress。有关详细信息,请阅读this文章。这些常量也可以在其他地方定义。

幸运的是,已经有GLEW已经完成了这项工作,如果你在glew.h中搜索GL_DEPTH_STENCIL_TEXTURE_MODE,你可能会发现分配给它的0x90EA。如果你只想使用你不必初始化GLEW的常数,但是如果你这样做,你至少要打电话给glewInit