OpenGL 帧缓冲区分离模板纹理

3

我找不到有关帧缓冲对象的单独模板纹理的任何文档。基本上,这是我目前的情况:

glBindTexture(GL_TEXTURE_2D, this->mTextures[FRAMEBUFFER_STENCIL_TEXTURE]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, width, height, 0, GL_RED_INTEGER, GL_INT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,  GL_TEXTURE_2D, this->mTextures[FRAMEBUFFER_STENCIL_TEXTURE],    0);

但这会导致创建错误。我的格式有问题还是其他原因?

1个回答

3

是的,这些格式值对于模板纹理来说是错误的。你需要使用特定的模板枚举来指定 internalFormat format 。对于8位模板纹理,调用应该像这样:

glTexImage2D(GL_TEXTURE_2D, 0, GL_STENCIL_INDEX8,
             width, height, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, 0);

正如评论中所指出的那样,纯模板纹理只在OpenGL 4.4及更高版本中可用。

另一种方法是分配一个深度/模板纹理,只需不使用深度部分即可。但是,从深度/模板纹理的模板部分进行采样需要OpenGL 4.3或更高版本,因此仅将版本要求降低了一个次要版本。


非常感谢您的回答。我尝试了,但仍然不幸崩溃。我在OpenGL官方文档中找到了这个,但似乎只适用于OpenGL 4.4及以上版本... 我使用的是OpenGL 2,所以我只能使用深度和模板缓冲纹理吗? - Jas
@Jas OpenGL 2.x 没有帧缓冲对象,因此这些都不适用于它。 - Reto Koradi
我正在使用着色器版本130,这些版本应该是用于OpenGL 2的,但我确实可以访问帧缓冲对象。 - Jas
@Jas:好的,在我们继续之前,你必须知道你实际使用的是什么。OpenGL 2.0的实现不支持GLSL 1.30着色器。它会在#version 130声明处出错。因此,你需要确定你实际拥有的是什么。 - Nicol Bolas
GLSL 1.30与OpenGL 3.0相配套。我不知道模板纹理像4.4一样新。然而,查阅资料后发现,从深度/模板纹理的模板部分采样需要4.3,因此这将是从纹理采样模板值所需的最低版本。 - Reto Koradi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接