在执行深度预测试的同时写入 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的主要内容,如果未能解决你的问题,请参考以下文章

深度学习之openvino预训练模型测试

postman—断言

什么是spool系统,什么是预输入,什么是缓输出?

JavaScript——作用域和预解析,深度理解代码执行程序

OpenGL如何在模板测试失败且深度测试成功时写入模板缓冲区?

翻译11 Unity 透明渲染