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的优化

猜你喜欢

转载自blog.csdn.net/js0907/article/details/117533745