设置gl_FragDepth会导致延迟?

问题描述 投票:0回答:1

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

#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 = 深度,FPS 会跳到 70 秒,而绘制调用只需要 1 毫秒。请注意,其他一切都未受影响。

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

opengl glsl depth-buffer shadow-mapping
1个回答
3
投票

写入

gl_FragDepth
禁用早期片段测试:

因此,如果所使用的片段着色器没有执行任何会影响这些测试结果的操作,则实现可以自由地应用早期片段测试。因此,如果片段着色器写入 gl_FragDepth,从而更改片段的深度值,则无法进行早期测试,因为测试必须使用新的计算值。

© www.soinside.com 2019 - 2024. All rights reserved.