shader中的if和else的耗费的深层解析:

if 和 else的分支 具体和移动GPU的硬件有关 : 更详细理解
(一)
if 和 else 条件判断用来实现代码按条件跳转执行:

(1)正常的if else 语句使用 bool 来进行判定操作,该bool 值可以通过使用逻辑和比较运算符来生成。。

(2)但是 : 向量运算的bool 结果不能直接使用,因为这些运算结果是一个向量值,而不是bool值

(二)
基于“ 执行代码后才产生的值” 去进行判定的条件分支,当编译成汇编指令后,用两种方法中的一种来表达:

(1)预侦测

编译器会对 if-else 条件表达式两部分都执行并求值

然后执行一个比较指令,去选择使用 if-else 条件表达式的if部分 或者是 else 部分 的结果

(2)动态分支(高端GPU可以生成)

而动态分支代码是由着色器程序中的执行流程去明确的控制

所以它可以用来跳过一些不需要计算和存储器访问的操作

优势: 当 if - else 内的代码段比较复杂时,使用动态分支 ,效果大大的好!!!

(三)
(1)
#if 预处理条件指令

使用预处理条件指令, 会在编译着色器前就已经明确 被#if 指令包含的代码块是要被包含进去还是剔除出来。

(2)unity中的内置指令:

flatten、branch 。

编译器默认生成的是 flatten 形式的指令

flatten 把分支所有侧的逻辑都执行一遍,根据判断条件选择其中一个结果;而 branch 则是一次执行分支中的一侧逻辑。

知乎中关于if能否节省shader性能的解释

if的优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值