lee*_*mes 6 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);
Run Code Online (Sandbox Code Playgroud)
在第二个渲染过程中,我目前只尝试"调试"所有纹理的内容.因此,我使用以下值设置着色器:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, <texture>);
glUniform1i(texLocation, 0);
Run Code Online (Sandbox Code Playgroud)
让着色器程序只需将纹理复制到屏幕:
uniform sampler2D tex;
in vec2 texCoord;
out vec4 fragColor;
void main() {
fragColor = texture2D(tex, texCoord);
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
当<texture>上面指的是我的一个颜色纹理时,我看到在第一个渲染过程中渲染的颜色输出,这是我所期望的.
当<texture>上面指深度模板纹理时,着色器不做任何事情(我看到用于清除屏幕的颜色).
将深度模板纹理复制到CPU并进行检查时,我会按预期在打包的24 + 8位数据中看到深度和模板信息.
我没有使用模板作为纹理的经验,但您可能想看看以下扩展:
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中不包含这些选项......