这里记录一下前辈总结的几点经验:
1.step(a,x):x<a,返回值为0;x>=a,返回值为1。此函数可用于替换shader中if逻辑判断语句。
2.if会严重破坏管线,除非if内有大量的计算/采样,否则都不用用if;而且有些计算,如需要mip测量的采样,偏导数放入if内,if直接失效。
3.?:不是if的缩写,当两值取一个时,编译结果是不同的。
4.能用saturate就用saturate,能用max/min时就用max/min,实在不行再考虑clamp,比如,常见的光照结果要防负数,直接max(color,0)就行了;如果单个光照结果防负数则是saturate(dot()),这两个函数连用是一条指令;如果同时用到frac和floor,则要先用frac,因为floor是frac和-的复合指令。
5.sqrt/pow的计算结果尽量设计在分母上,因为指令计算出来的为倒数。
6.乘法和加法同时存在要先乘法后加法,这也是一条指令。
7.如果 一个参数只出现在分母上,那传入是最好先求倒,因为GPU是没有除法的。
8.normalize不要滥用,只在确定需要归一化的地方用,因为编译器是没法给优化掉的。
9.乱用pow是肯定不行的,虽然写成pow(2.0,x)会帮你优化成exp2(x)。
10.能用exp2都不用exp,因为exp是以e为底数的,增加了一次乘法。
11.对一个float2|3|4求平方和,可以用dot(x,x)。
12.同样一条指令,对NV的优化不如A明显,因为NV的后续GPU都是一元计算。