写入gl_FragDepth后执行着色器

时间:2015-07-30 08:45:00

标签: opengl glsl

给定片段着色器,修改片段的原始深度并写入gl_FragDepth。 如果此时深度测试失败,写入gl_Fragdepth后的代码是否仍然会被执行?

示例:

in float depth;
layout(depth_less) out float gl_FragDepth;
void main() {
  float newDepth = depth - someModification;
  gl_FragDepth = newDepth;
  A();
}

如果A大于newDepth中的当前值,会gl_FragDepth执行吗?

如果是这样,在不使用自定义深度缓冲区的情况下,停止着色器在A中进行不必要的计算的替代方法是什么?

1 个答案:

答案 0 :(得分:1)

在您的示例中,A()将始终执行,只要它对任何输出值有贡献,例如:一种颜色(否则,编译器会将其作为优化删除)。深度测试是通常在片段着色器之后执行的每个样本操作。 Under special circumstances,可以在片段着色器之前进行此测试,但这需要片段着色器本身不写入gl_FragDepth。

您做的修改是统一的还是每个片段不同?如果它是均匀的,您可以在几何着色器中执行 - 只需将深度修改应用于整个基元。然后你可以使用early-z。如果它基于每个片段,您可以尝试将当前深度渲染目标绑定为readonly image,获取存储的深度值,在着色器中执行手动比较,并在片段失败时丢弃该片段。但是,我既不知道你是否可以将当前绑定的帧缓冲区渲染目标实际绑定为图像,即使是只读,也不知道这是否会比执行A()更多或更少。