在着色器程序中访问深度模板纹理

时间:2013-10-03 21:31:01

标签: opengl textures rendering glsl depth-buffer

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

在第一个渲染过程中,我不仅渲染颜色和深度信息,还使用模板操作来计算对象。我为此使用了一个多渲染目标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位数据中看到深度和模板信息。

1 个答案:

答案 0 :(得分: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 ......