纹理查找与分支的相对成本



在寻找有关着色器编码最佳实践的信息时,我对性能问题以及为什么甚至某些技术比其他技术更好是空的。更具体地说,分支与纹理查找。在具有动态流控制的着色器模型 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?

这在很大程度上取决于您的 GPU 架构,但通常纹理查找比动态分支慢几倍。

最新更新