在执行深度预测试的同时写入 gl_FragDepth
Posted
技术标签:
【中文标题】在执行深度预测试的同时写入 gl_FragDepth【英文标题】:Write gl_FragDepth while still executing depth pre-test 【发布时间】:2015-04-14 21:48:43 【问题描述】:给定一个深度预传递渲染器,我有一个给定片段可能包含的最小深度值 - 因此,考虑任何比指定更远的片段是没有意义的。
现在,我有一个写入gl_FragDepth
的着色器,但保证写入的值大于或等于其多边形面的深度值。我怎样才能仍然执行深度预测试(即,如果片段深度比缓冲区值更远,则在不执行着色器的情况下丢弃),但如果它通过了预测试,则允许我写入与插值面深度不同(更大)的值测试?
【问题讨论】:
OpenGL 不支持从片段着色器中的深度缓冲区读取数据,除非您的硬件支持 this 相对较新的扩展(仅针对 OpenGL ES)。所以基本上没有办法做到这一点。我想知道你为什么要这样做。 【参考方案1】:从 OpenGL 4.2 (GLSL 4.20) 开始,您正在寻找的功能可在 gl_FragDepth
上作为布局限定符使用。它允许您指定您将如何修改片段着色器中的深度输出的意图。例如,以下指定您仅将深度值更改为更大:
layout (depth_greater) out float gl_FragDepth;
这将允许在片段着色器中修改深度时仍使用早期深度测试。如果您不遵循使用此限定符建立的“合同”,您将获得未定义的行为。例如,使用上面的限定符,如果您将深度变小,则可能会消除原本可见的片段。
该功能基于GL_AMD_conservative_depth 和GL_ARB_conservative_depth 扩展。如果您想将它与低于 4.2 的 OpenGL 版本一起使用,您可以检查这些扩展是否存在,并在其可用的扩展形式之一中使用它。
【讨论】:
以上是关于在执行深度预测试的同时写入 gl_FragDepth的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript——作用域和预解析,深度理解代码执行程序