将模板缓冲区可视化为纹理

4
我正在尝试将模板缓冲区放入一个纹理中以便在延迟渲染器中使用。
我使用glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[color1], 0);获得其他颜色和深度附件,结果是正确的。Correct Rendering without Stencil Buffer 但是,当我尝试使用glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT ,GL_TEXTURE_2D, textures[stencil], 0);将我的模板缓冲区附加到一张纹理时,我会得到一个混乱的结果,就好像FBO没有清除它的缓冲区一样。 Incorrect, Garbled Rendering 我不知道问题出在哪里。我怀疑这可能是设置模板纹理的问题...
//Stencil Texture Initialization

glBindTexture(GL_TEXTURE_2D, textures[stencil]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glTexImage2D( GL_TEXTURE_2D, 0, GL_STENCIL_INDEX8, 512, 512, 0, GL_STENCIL_INDEX, GL_BYTE, 0);

我在设置中没有收到任何错误代码,所以我不知道问题出在哪里。
编辑:也许我做错了。如果有人知道如何将模板缓冲区写入纹理,请告诉我一个可行的方法,我并不在意用不同的代码来写。我只需要一个能用的方法。
1个回答

7
GL_STENCIL_INDEX8

永远不要使用这个。如果你需要模板缓冲区,始终使用压缩的深度/模板图像,例如GL_DEPTH24_STENCIL8。你应该将它附加到GL_DEPTH_STENCIL_ATTACHMENT点。


哇,Nicol,看来我总是可以指望你回答我的问题。在这种情况下,我该如何将两个不同的纹理合并成一个,其中一个显示深度,另一个显示模板。 - Chase Walden
@Chase:你不需要关心使用了多少个纹理,重点是能够捕获到这个模板。只要你有所需的数据,使用了多少个纹理就不重要了。 - Nicol Bolas
@ChaseWalden:你为什么想要它们分开? - datenwolf
@datenwolf,这样我就可以将单个纹理渲染到屏幕上进行调试。 - Chase Walden
@ChaseWalden:嗯,除非你有最近的ARB_stencil_texturing扩展的访问权限,否则你无法从着色器中读取任何类型的模板纹理。因此,你不能将其渲染到屏幕上以供任何目的使用。即使你有模板纹理的访问权限,你也不需要使用单独的纹理来绘制它到屏幕上。你可以在深度模式下绘制它,然后切换并在模板模式下绘制它。 - Nicol Bolas
显示剩余5条评论

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