我正在尝试为我的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);
}
谢谢!
答案 0 :(得分:1)
任何时候你都可以预先计算对着色器常量的操作,这样做会更好。通过将逆转换为着色器来移除除法运算是另一个有用的提示,因为除法通常比乘法慢。
在你的情况下,预先计算(1 /(FogEnd - FogStart)),并乘以你的倒数第二行代码。