UnityShader几个纪要

这里记录一下前辈总结的几点经验:

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都是一元计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值