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

时间:2016-02-07 01:40:46

标签: hlsl

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

1 个答案:

答案 0 :(得分:0)

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