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

时间:2015-04-14 21:48:43

标签: c++ opengl rendering

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

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

1 个答案:

答案 0 :(得分:8)

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

layout (depth_greater) out float gl_FragDepth;

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

该功能基于GL_AMD_conservative_depthGL_ARB_conservative_depth扩展程序。如果您想在OpenGL版本低于4.2的情况下使用它,您可以检查这些扩展名是否存在,并在其中一个扩展表单中使用它(如果可用)。