【发布时间】:2013-10-10 18:20:45
【问题描述】:
似乎很难找到有关如何在连续渲染通道的着色器中访问深度和模板缓冲区的信息。
在第一次渲染过程中,我不仅渲染颜色和深度信息,还使用模板操作来计算对象。为此,我使用了多渲染目标 FBO,并附加了颜色缓冲区和组合深度模板缓冲区。所有这些都是纹理的形式(不涉及渲染缓冲区对象)。
在第二次渲染过程中(渲染到屏幕时),我想访问先前计算的基于每个像素的模板索引(但不一定是我当时正在绘制的相同像素),就像你想要的那样访问之前渲染的颜色缓冲区以应用一些后期处理效果。
但我未能将第二遍中的深度模板纹理作为制服绑定到我的着色器程序。至少只从中读取黑色值,所以我猜它没有正确绑定。
是否可以将深度模板纹理绑定到纹理单元以在着色器程序中使用?使用“普通”采样器是否无法访问深度和模板纹理?是否可以使用一些“特殊”采样器?是取决于贴图上设置的插值模式还是类似的设置?
如果不是,在这两个渲染通道之间将模板信息复制到单独的颜色纹理中的最佳(最快)方法是什么?可能涉及使用模板测试绘制单一颜色的第三次渲染通道(我只需要在最终渲染通道中使用 binary 版本的模板缓冲区,准确地说,我需要测试该值是否为零)。
中间 FBO 使用的纹理设置如下:
// The textures for color information (GL_COLOR_ATTACHMENT*):
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
// The texture for depth and stencil information (GL_DEPTH_STENCIL_ATTACHMENT*):
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0);
在第二个渲染过程中,我目前只尝试“调试”所有纹理的内容。因此,我使用这些值设置着色器:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, <texture>);
glUniform1i(texLocation, 0);
让着色器程序简单地将纹理复制到屏幕上:
uniform sampler2D tex;
in vec2 texCoord;
out vec4 fragColor;
void main() {
fragColor = texture2D(tex, texCoord);
}
结果如下:
当上面的
<texture>引用我的一个颜色纹理时,我看到在第一个渲染通道中渲染的颜色输出,这是我所期望的。当
<texture>上面提到深度模板纹理时,着色器不做任何事情(我看到了我清除屏幕时使用的颜色)。在将深度模板纹理复制到 CPU 并对其进行检查时,我可以在打包的 24 + 8 位数据中看到深度和模板信息。
【问题讨论】:
标签: opengl textures rendering glsl depth-buffer