HLSL着色器的优化

时间:2014-02-04 19:22:42

标签: optimization xna shader hlsl

我正在尝试为我的XNA游戏优化我的地形着色器,因为它似乎消耗了大量的资源。它在我的计算机上大约需要10到20 FPS,我的地形是512 * 512个顶点,所以PixelShader被调用很多次。

我已经看到分支正在使用一些资源,我的着色器中有3/4条件。 我该怎么做才能绕过他们?三元运算符是否比条件更有效?

例如:

float a = (b == x) ? c : d;

float a;
if(b == x)
    a = c;
else
    c = d;

如果使用算术运算效率更高,我还会多次使用lerp和clamp函数吗?

这是我的代码效率较低的部分:

    float fog;
    if(FogWaterActivated && input.WorldPosition.y-0.1 < FogWaterHeight)
    {
        if(!IsUnderWater)
            fog = clamp(input.Depth*0.005*(FogWaterHeight - input.WorldPosition.y), 0, 1);
        else
            fog = clamp(input.Depth*0.02, 0, 1);

        return float4(lerp(lerp( output * light, FogColorWater, fog), ShoreColor, shore), 1);
    }
    else
    {
        fog = clamp((input.Depth*0.01 - FogStart) / (FogEnd - FogStart), 0, 0.8);
        return float4(lerp(lerp( output * light, FogColor, fog), ShoreColor, shore), 1);
    }

谢谢!

1 个答案:

答案 0 :(得分:1)

任何时候你都可以预先计算对着色器常量的操作,这样做会更好。通过将逆转换为着色器来移除除法运算是另一个有用的提示,因为除法通常比乘法慢。

在你的情况下,预先计算(1 /(FogEnd - FogStart)),并乘以你的倒数第二行代码。