设置gl_FragDepth是否会导致滞后



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

#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秒,而draw调用只需要1毫秒。注意,其他一切都没有受到影响。

设置gl_FragDepth值怎么会导致性能低下?

写入gl_FragDepth将禁用早期片段测试:

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

相关内容

  • 没有找到相关文章

最新更新