1) use constant or dynamic uniforms.
使用constant或dynamic uniforms存储在不同帧间不变的值。每帧计算时的优先级也是:外部统一计算 > 顶点着色器 > 片元着色器
2) do multiply calculation, put single value before vector
把half/fixed这样的值和vector这样的值相乘时,要把它们放在前面。如果把它们放在后面就会自动转化成vector
3) avoid discard and alphatest. alway focus overdraw
在片元着色器中透明度测试并不是个好想法,因为这会和移动平台广泛使用的Early-Z冲突。Early-Z是指把深度测试提前到了片元着色器之前。不能透明度测试并丢弃片元后就要重点关注下overdraw
4) keep calculation on vertex shader
计算尽量在顶点着色器中完成。因为片元着色器中去做的话会相差好几个量级的。
5) specify a write mask for a vector
需要为多少分量赋值就只写对应分量,不用整个赋值。
6) avoid branching on no-uniform value because unpredictable
避免依赖实时计算值的分支语法。因为GPU无法通过预测优化。uniform和常量值应该表现稍好。
7) check function discard/floor impact on your render model
这些函数在不同的渲染平台上可能会有较大差别
8) minimize texture fetch
尽量少用纹理取色,也就是尽量让各个通道充分使用。
9) use build-in blend other than manually blend with alpha
用内置混合功能而不是自己去手写。
10) use MaterialPropertyBlock instead material SetFloat/SetColor, because it will copy the material
使用MaterialPropertyBlock。而不是修改材质的属性,因为修改会拷贝出新的复制。
11) avoid expensive math functions(pow exp log cos sin tan),conside use pre-calculate lookup texture
尽量不用这些耗费很高的函数。考虑把它们先计算好写入查询纹理中。使用时查询纹理。计算光衰减的就是这样计算的。
12) pick lowest possible number precision format
用尽量低的精度,由低到高是 fixed-half-float
13) multi-component calculation "pos.xy *= 2" don't calculate x y separately
多个分量的统一计算写在一起,而不是分多次写