在寻找有关着色器编码最佳做法的信息时,我会在性能问题上出现空洞,为什么甚至某些技术比其他技术更好。更具体地说,分支与纹理查找。在具有动态流控制的Shader模型3中,当输出是纹素靠近在一起时,它被认为是有效的分支,但我真的没有任何细节来支持何时或何时不执行它的阈值。所以我的问题是,纹理查找相对于分支实例的成本是多少?分支什么时候展开(如果我正确使用该术语)并运行所有可能性以使其效率低下?
我在这里也包含了一些示例代码,尽管我对理论而不是示例的细节更感兴趣。
// Is something like this faster:
float4 final;
float4 t1 = tex2D(_Tex1, IN.uv_Tex1);
float4 t2 = tex2D(_Tex2, IN.uv_Tex2);
final = lerp(t1, t2, smoothstep(-1, 1, IN.worldPos.y));
// Or this:
float final;
if (IN.worldPos.y < -1)
{
final = tex2D(_Tex1, IN.uv_Tex1);
}
else if (IN.worldPos.y > 1)
{
final = tex2D(_Tex2, IN.uv_Tex2);
}
else
{
final = lerp(tex2D(_Tex1, IN.uv_Tex1),
tex2D(_Tex2, IN.uv_Tex2),
smoothstep(-1, 1, IN.worldPos.y));
}
// And would it be the same if they were more complex lookups:
float4 t1 = (tex2D(_Tex1, mul(rot, IN.uv_Tex1*0.5))
+tex2D(_Tex1, IN.uv_Tex1))*0.5;
float4 t2 = (tex2D(_Tex2, mul(rot, IN.uv_Tex2*0.5))
+tex2D(_Tex2, IN.uv_Tex2))*0.5;
// What is the relative cost of branching to texture lookups?
答案 0 :(得分:0)
这在很大程度上取决于您的GPU架构,但通常纹理查找比动态分支慢几倍。