问题描述
我设计了一组非常基本的深度着色器,用于将深度渲染到我的阴影贴图深度纹理。 这是我使用的深度片段着色器的代码:
#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会跳到70s,而绘制调用仅花费1 ms。请注意,其他所有内容都保持不变。
设置gl_FragDepth值如何导致性能降低?
解决方法
写到gl_FragDepth
将disable early fragment tests:
因此,如果所使用的片段着色器不做任何会影响那些测试结果的事情,则实现可以自由地应用早期片段测试。因此,如果片段着色器写入gl_FragDepth,从而更改了片段的深度值,则无法进行早期测试,因为测试必须使用新的计算值。