我想做的事情:
我正在渲染网格,每个网格有一个渲染过程,在每个网格的FBO中存储颜色和深度。每个网格FBO的深度分量有32位。
最后,渲染一个填充四边形的屏幕,每个FBO的颜色被写入最终FBO到out vec4 fragColor
,深度到gl_FragDepth
,layout(depth_any) out float gl_FragDepth
。深度函数设置为GL_LEQUAL
。
如果两个网格相同,我希望看到由于GL_LEQUAL
而最后混合到场景中的网格。但我得到的是噪音,最后一个网格的一些片段通过了深度测试,有些不是。
基本上我只是将深度值从一个FBO复制到另一个FBO,这似乎会导致错误。
为了访问深度组件,我尝试了两者,将纹理绑定为sampler2D
和sampler2DShadow
。
作为测试我做了以下事情: 使用深度测试再次渲染所有网格,而不是全屏四边形,以便仅将相应FBO的幸存片段的颜色值写入最终FBO。 这给出了两个网格相同的情况下的预期结果。
从深度组件纹理读取并写入gl_FragDepth
时,精度损失从何而来?
修改
全屏四方法
此图片按以下方式制作:
gl_FragDepth
。我尝试了两种方法,从手动计算的输出和标准深度附件中获取深度值。此结果如上图所示。
屏幕填充四边形的第二次运行有一些片段没有通过GL_LEQUAL
的深度测试,这可以看到清晰的颜色。
网格方法
此图像的生成方式几乎与全屏四边形方法相同。唯一的区别在于步骤3和5.现在,渲染原始网格本身而不是四边形,以生成用于访问FBO_A和FBO_B的片段。
这意味着,片段着色器将颜色写入FBO_final,深度由管道自动写入,而不是写入片段着色器中的gl_FragDepth
。结果是正确的。
实际上我发现网格方法要快得多,它会给出预期的结果。无论如何,我仍然对另一种方法失败的原因感到好奇。