Shader有专门语言用来编写,常见类型有DirectX的HLSL,OpenGL的GLSL以及NVIDIA的Cg,为了优化shader代码,我们需要知道代码从被编写到被执行的流程,知道什么样的代码是不好的。
注意点:
- 避免if、switch分支语,for循环语句,特别是循环次数可变的
- if-else分支的最差情况可能是有1/n的利用率。
- 尽量使用统一的控制流,不要使用分支。
- 一些用于优化的指令,[branch],[flatten],[loop],[unroll]
- branch,shader会根据判断语句只执行当前情况的代码
- flatten,shader会执行全部情况的分支代码,然后再根据判断条件获得结果
- unroll,for循环是展开的,直到循环条件终止
- loop,for循环不展开
- 减少纹理采样次数
- 减少复杂数学函数调用
- 少用复杂计算的函数,反三角函数
- 使用合适数据精度
- 用fixed替代float
- Shader LOD:给不同性能的设备提供高中低配置的Shader版本
代码示例:
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
if (col.a > 0.5) {
col.r = 1;
}
return col;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
col.r = col.a > 0.5 ? col.r : 1;
return col;
}