写入 gl_FragDepth 的同时仍然执行深度预测试

Write gl_FragDepth while still executing depth pre-test

给定深度预渲染渲染器,我有给定片段可能包含的最小深度值 - 因此,考虑任何比指定更远的片段是没有意义的。

现在,我有一个写入 gl_FragDepth 的着色器,但保证写入的值大于或等于其多边形面的深度值。我如何仍然执行深度预测试(即,如果片段深度比缓冲区值更远,则在不执行着色器的情况下丢弃),但允许我写入一个不同于(大于)插值面深度的值(如果它通过了预测试)测试?

从 OpenGL 4.2 (GLSL 4.20) 开始,您正在寻找的功能可作为 gl_FragDepth 上的布局限定符使用。它允许您指定您将如何修改片段着色器中的深度输出的意图。例如,以下指定您将只更改深度值以使其更大:

layout (depth_greater) out float gl_FragDepth;

这将允许在片段着色器中修改深度时仍然使用早期深度测试。如果您不遵循使用此限定符建立的 "contract",您将得到未定义的行为。例如,使用上面的限定符,如果您使深度变小,则原本可见的片段可能会被消除。

该功能基于 GL_AMD_conservative_depth and GL_ARB_conservative_depth 扩展。如果您想将它与低于 4.2 的 OpenGL 版本一起使用,您可以检查是否存在这些扩展,如果可用,则以其中一种扩展形式使用它。