在执行深度预测试的同时编写gl_FragDepth

4
给定深度预先通行渲染器,我有给定片段可能包含的最小深度值,因此考虑任何更远的片段是没有意义的。
现在,我有一个着色器,它写入gl_FragDepth,但保证写入大于或等于其多边形面的深度值。 如何执行深度预测试(即,如果片段深度比缓冲区值更远,则舍弃而不执行着色器),但允许我在通过预测试时编写不同(更大)的值?

OpenGL不支持在片段着色器中从深度缓冲区读取,除非您的硬件支持这个相对较新的扩展(仅针对OpenGL ES)。所以基本上没有办法做到这一点。我想知道为什么你要这样做。 - sbabbi
1个回答

8

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

layout (depth_greater) out float gl_FragDepth;

这将允许在片段着色器中修改深度时仍然使用早期深度测试。如果您不遵循此限定符所建立的“契约”,则会出现未定义的行为。例如,对于上面的限定符,如果使深度变小,则可能会消除本来可见的片段。
该功能基于GL_AMD_conservative_depthGL_ARB_conservative_depth扩展。如果您想在低于4.2版本的OpenGL中使用它,可以检查这些扩展的存在,并在其扩展形式之一中使用它(如果可用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接