【UE4 图形学】材质Shader中尽量避免使用if,能够提升性能的原因

本文深入探讨了GPU的warp内部SIMD模式下分支发散的问题,及其对并行处理效率的影响。通过具体示例展示了如何利用内置指令如max、lerp和step来替代传统的if语句,从而实现Shader性能的显著提升。

原因

GPU的warp内部是按照SIMD(Single Instruction Multiple Data)单指令多数据流模式执行的,也就是说同时只能处理一条指令,当出现分支指令时,只能先执行True的指令,再执行False的指令,这样导致的指令串行执行现象叫做Branch Divergence,它会影响GPU并行化处理的执行效率,降低程序性能。

在Shader中使用if往往就会导致分支指令的出现,因而如果能通过其他手段,常用方式是使用其他的内置指令替代if,就能做到性能优化。

举个栗子:

if(a>b)
  x = a;
else
  x = b;

使用内置指令max替换

x = max(a,b);

if(m>n)
  x = a;
else
  x = b;

使用lerp+step替换

x = lerp(a,b,step(m,n));

注:材质中优化相关还有,divide节点用乘法代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值