写入gl_FragDepth。精密?

时间:2016-05-09 09:45:42

标签: opengl glsl

我想做的事情:

  1. 一次渲染一个场景的每个网格
  2. 将每个过程的结果混合到相对于每个网格深度的最终图像中。
  3. 我正在渲染网格,每个网格有一个渲染过程,在每个网格的FBO中存储颜色和深度。每个网格FBO的深度分量有32位。

    最后,渲染一个填充四边形的屏幕,每个FBO的颜色被写入最终FBO到out vec4 fragColor,深度到gl_FragDepthlayout(depth_any) out float gl_FragDepth。深度函数设置为GL_LEQUAL

    如果两个网格相同,我希望看到由于GL_LEQUAL而最后混合到场景中的网格。但我得到的是噪音,最后一个网格的一些片段通过了深度测试,有些不是。

    基本上我只是将深度值从一个FBO复制到另一个FBO,这似乎会导致错误。 为了访问深度组件,我尝试了两者,将纹理绑定为sampler2Dsampler2DShadow

    作为测试我做了以下事情: 使用深度测试再次渲染所有网格,而不是全屏四边形,以便仅将相应FBO的幸存片段的颜色值写入最终FBO。 这给出了两个网格相同的情况下的预期结果。

    从深度组件纹理读取并写入gl_FragDepth时,精度损失从何而来?

    修改

    全屏四方法img

    此图片按以下方式制作:

    1. 您看到的灰色网格呈现两次,相同 着色器和模型视图投影的相同输入。没有其他 制服会影响顶点变换。黑色轮廓线可以忽略。
    2. 两个网格都有自己的FBO(FBO_A和FBO_B),其中包含用于输出变量颜色和深度以及深度附件的纹理。除了标准深度附件之外,每个像素的深度在片段着色器中计算并写入2D纹理(具有不变的限定符)。
    3. 在第二步中,将屏幕填充四边形渲染为FBO_final。 FBO_A的颜色值被写入颜色输出,FBO_A的深度值被写入gl_FragDepth。我尝试了两种方法,从手动计算的输出和标准深度附件中获取深度值。
    4. 现在对FBO_final的颜色进行了一些后期处理,但要突出显示错误,只需将颜色清除为白色即可。 FBO_final的深度未被清除。
    5. 再次渲染屏幕填充四边形,这次以与3中相同的方式访问FBO_B。
    6. 此结果如上图所示。 屏幕填充四边形的第二次运行有一些片段没有通过GL_LEQUAL的深度测试,这可以看到清晰的颜色。

      网格方法img

      此图像的生成方式几乎与全屏四边形方法相同。唯一的区别在于步骤3和5.现在,渲染原始网格本身而不是四边形,以生成用于访问FBO_A和FBO_B的片段。

      这意味着,片段着色器将颜色写入FBO_final,深度由管道自动写入,而不是写入片段着色器中的gl_FragDepth。结果是正确的。

      实际上我发现网格方法要快得多,它会给出预期的结果。无论如何,我仍然对另一种方法失败的原因感到好奇。

0 个答案:

没有答案