7

似乎很难找到有关如何在连续渲染通道的着色器中访问深度和模板缓冲区的信息。

在第一次渲染过程中,我不仅渲染颜色和深度信息,还使用模板操作来计算对象。为此,我使用了多渲染目标 FBO,并附加了颜色缓冲区和组合深度模板缓冲区。所有这些都是纹理的形式(不涉及渲染缓冲区对象)。

在第二个渲染过程中(渲染到屏幕时),我想访问先前计算的每个像素的模板索引(但不一定是我当时正在绘制的相同像素),类似于您想访问先前渲染的颜色缓冲区以应用一些后期处理效果。

但是我未能将第二遍中的深度模板纹理作为制服绑定到我的着色器程序。至少只从中读取黑色值,所以我它没有正确绑定。

  • 是否可以将深度模板纹理绑定到纹理单元以在着色器程序中使用?使用“普通”采样器是否无法访问深度和模板纹理?是否可以使用一些“特殊”采样器?它是否取决于纹理上设置的插值模式或类似设置?

  • 如果不是,在这两个渲染通道之间将模板信息复制到单独的颜色纹理中的最佳(最快)方法是什么?可能涉及使用模板测试绘制单一颜色的第三次渲染通道(我只需要在最终渲染通道中使用二进制版本的模板缓冲区,准确地说,我需要测试该值是否为零)。

中间 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 位数据中看到了深度和模板信息,正如预期的那样。

4

1 回答 1

2

我没有使用模板作为纹理的经验,但您可能想看看以下扩展:

http://www.opengl.org/registry/specs/ARB/stencil_texturing.txt

另一种选择可能是使用创建纹理视图

http://www.opengl.org/registry/specs/ARB/texture_view.txt

或者您可以在没有模板缓冲区的情况下计算对象,可能使用 MRT 并在第二个渲染目标上使用添加混合:

http://www.opengl.org/registry/specs/EXT/draw_buffers2.txt

但恐怕这些选项不包含在纯 GL3.3 中......

于 2013-10-03T21:49:31.293 回答