c++ - 写入 gl_FragDepth,同时仍然执行深度预测试

标签 c++ opengl rendering

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

现在,我有一个写入 gl_FragDepth 的着色器,但保证写入的值大于或等于其多边形面的深度值。我如何仍然执行深度预测试(即,如果片段深度比缓冲区值更远,则在不执行着色器的情况下丢弃),但允许我写入一个不同于(大于)插值面深度的值(如果它通过了预测试)测试?

最佳答案

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

layout (depth_greater) out float gl_FragDepth;

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

该功能基于 GL_AMD_conservative_depthGL_ARB_conservative_depth扩展。如果您想将它与低于 4.2 的 OpenGL 版本一起使用,您可以检查是否存在这些扩展,如果可用,则以其中一种扩展形式使用它。

关于c++ - 写入 gl_FragDepth,同时仍然执行深度预测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637989/

相关文章:

ios - 将 UIView.transform 设置为任意平移 CGAffineTransform 不会执行任何操作

javascript - 如何使 p5.js 中的背景透明但继续隐藏绘制在背景上的元素?

c++ - 使用Lua和C++管理堆栈

c++ - 线程本身终止时如何删除boost线程对象?

opengl - 我真正需要多少个着色器程序?

c++ - Opengl/Glut - 使倾斜变得平滑

c++ - 带有 C++ 程序控制台输入的 Sublime Text

C++ 参数堆与堆栈

c++ - 无法识别 glMatrixMode() 或 GL_PROJECTION 并提供所有需要的库

ajax - Richfaces 使用 a4j 呈现 :ajax