设置 gl_FragDepth 导致延迟?

Setting gl_FragDepth causes lag?

我设计了一组非常基本的深度着色器,用于将深度渲染到我的阴影贴图深度纹理。 这是我使用的深度片段着色器的代码:

#version 330 core

in vec3 FragPos;
uniform vec3 lightPos;
uniform float farPlane;

void main()
{
    float depth = length(FragPos - lightPos);
    depth /= farPlane;
    gl_FragDepth = depth;
}

这段代码并不多,它只是简单地计算了一个片段和光源之间的距离,通过除以光的远平面距离来归一化该值,并将结果设置为gl_FragDepth。

代码运行没有任何错误。我在场景中仅使用两个对象和一个点光源来测试渲染器。后来拉了个大内景,FPS从60-70左右掉到30-40

我尝试使用 Nvidia Nsights 进行一些 GPU 分析,发现我的阴影通道的 glDrawElements 花费了 4 毫秒。我将问题归零到上面编写的片段着色器中的最后一行代码 gl_FragDepth = depth.

我发现,如果我删除表达式 gl_FragDepth = depth,FPS 会跃升至 70 秒,绘制调用仅需 1 毫秒。请注意,其他所有内容均未受影响。

如何设置 gl_FragDepth 值导致性能低下?

写入 gl_FragDepthdisable early fragment tests:

Therefore, an implementation is free to apply early fragment tests if the Fragment Shader being used does not do anything that would impact the results of those tests. So if a fragment shader writes to gl_FragDepth, thus changing the fragment's depth value, then early testing cannot take place, since the test must use the new computed value.