给定深度预渲染渲染器,我有给定片段可能包含的最小深度值 - 因此,考虑任何比指示更远的片段是没有意义的。
现在,我有一个写入 gl_FragDepth
的着色器,但保证写入的值大于或等于其多边形面的深度值。我如何仍然执行深度预测试(即,如果片段深度比缓冲区值更远,则在不执行着色器的情况下丢弃),但允许我写入一个不同于(大于)插值面深度的值(如果它通过了预测试)测试?
最佳答案
从 OpenGL 4.2 (GLSL 4.20) 开始,您正在寻找的功能可作为 gl_FragDepth
上的布局限定符使用。它允许您指定您将如何修改片段着色器中的深度输出的意图。例如,以下指定您将只更改深度值以使其更大:
layout (depth_greater) out float gl_FragDepth;
这将允许在片段着色器中修改深度时仍然使用早期深度测试。如果您不遵循使用此限定符建立的“契约(Contract)”,您将获得未定义的行为。例如,使用上面的限定符,如果您使深度变小,则原本可见的片段可能会被消除。
该功能基于 GL_AMD_conservative_depth和 GL_ARB_conservative_depth扩展。如果您想将它与低于 4.2 的 OpenGL 版本一起使用,您可以检查是否存在这些扩展,如果可用,则以其中一种扩展形式使用它。
关于c++ - 写入 gl_FragDepth,同时仍然执行深度预测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637989/