一、计算量优化
对不影响最终效果但仍在计算的删除;
尽量在脚本中计算然后传递给着色器,如果不可以的话尽量从像素着色器移动顶点着色器中计算。因为通常像素着色器执行的次数多于顶点着色器。
二、Surface Shader
Surface Shader方便用户快捷的处理照明,高效的产生底层的vertex和fragment shader。适合编写与光照交互的着色器。Surface Shader有一些选项可以用来优化。
优化:
approxview使用逐顶点而不是逐像素的规范化观察向量,确切的说是规范化的时候对观察方向是逐顶点的。
镜面反射着色器类型使用halfasview更快,因为halfasview使用一个介于光照方向和观察方向之间的half vector来代替真正的观察方向。
noforwardadd着色器仅完全支持前向渲染中的一个定向光源。其余的光源仍然可以有逐顶点光照或球谐的效果。减少了着色器大小,即使存在多个灯光始终只渲染一次。
noambient禁用着色器的环境光和球谐光照。
三、精度优化
float(32bits),half(16bits)
和fixed(11bits)
世界空间位置和纹理坐标,使用float
精度。
其他一切(矢量,HDR颜色等),首先使用half精度
,必要时增加精度。移动GPU具有实际half精度
支持。通常更快,并且使用更少的功率来进行计算。
纹理数据的非常简单的操作,使用fixed
精度。
四、减少指令数量
除法写成除数的倒数。
简化表达式,比如将去除括号,将多项乘法分成多个加法,会简单指令周期。
sign函数如果不需要x=0的情况,可以自己实现。
使用纹理读取的方式减轻运算量。
(持续更新)