本文转载自: http://blog.csdn.net/chenxuezhi123/article/details/45338127 向原作者致敬~~~
Shader可优化的几个方面:
》优化变量类型;half 放UV值和颜色值,fixed用于光照计算、颜色、单位向量等;
- float — 完整的 32 位浮点格式,适合用于顶点变换,但性能最慢。
- half — 简化的 16 位浮点格式,适用于纹理 UV 坐标,颜色值等。比 float 大约快两倍。
- fixed — 10位定点格式,适合光照计算、颜色和其它高性能操作,速度大约比 float 快 4 倍
》充分利用内置光照模型;
》共享UV,使用了Main Texture的UV坐标来代替法线贴图的UV坐标;
》开启特定的某些渲染工作,让Shader只工作在特定的渲染器上;
》减少处理的光源个数
把其他所有光源当成了顶点光源,而在计算像素颜色时只计算一个主平行光作为像素光源。
》使用近似值代替精确值;
》减少或压缩贴图;
移动平台的Shader优化
一,排除延迟渲染的pass(通道)。
二,不支持unity自带的贴图系统提供的光照贴图;
三,添加noforwardadd,只对一个方向光进行逐像素文理运算,其他所有灯光都被强制转换成逐顶点的光照;
四,使用半角向量(half vector)作为视线方向并用于高光计算,因为半角向量是基于逐顶点计算的;
1.复杂的数学函数(如 pow,exp,log,cos,sin,tan 等等)会大大增加 GPU 负担,所以一个好的经验法则是,此类运算在每个像素中不得超过一个。考虑在合适时使用查找纹理作为替代选择。
2.alpha 测试运算会让片段速度变慢。(on PowerVR GPUs found in iOS and some Android devices)
3.编写自定义的着色器时,应始终指定浮点变量精度。为获得最佳性能,挑选精度尽可能小的浮点格式至关重要。很多台式机 GPU 均完全忽略运算精确,但是它对于大量移动 GPU 的性能具有重大影响。
4.大部分shader都有_Color属性,但如果你并没有使用,那么就应该去掉,避免无谓的计算。
5.通用的表面着色器虽然通用,但性能其实并不好。因为我们没有光照,所以我建议采用顶点着色器和片段着色器。
参考:unity3d移动平台性能优化专题(8):shader优化
【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader
【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader