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

Pre*_*sor 4 c++ opengl rendering

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

现在,我有一个写入的着色器gl_FragDepth,但是保证写入一个大于或等于其多边形面深度值的值.我怎样才能执行深度预测试(即,如果片段深度比缓冲区值更远,在没有着色器执行的情况下丢弃),但是如果它通过预先设置,则允许我写出与插值面深度不同(更大)的值测试?

Ret*_*adi 8

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

layout (depth_greater) out float gl_FragDepth;
Run Code Online (Sandbox Code Playgroud)

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

该功能基于GL_AMD_conservative_depthGL_ARB_conservative_depth扩展.如果要在低于4.2的OpenGL版本中使用它,可以检查是否存在这些扩展,并在其中一个扩展表单中使用它(如果可用).