为什么需要优化:
在CPU编程中,对条件语句的路基进行了优化,只会执行其中一个分支。
但是这种优化对于GPU编程来说是无效的。在fragment Shader上,每条指令需要操作上百个像素,如果有些像素采取一个分支,而另外一些采取另一个分支,这时fragment Shader的处理方式是:所有片段都会执行所有的分支,但是只会将片段采取的分支写入到寄存器中。
因此在GPU编程中,if else, switch case等条件语句和太复杂的逻辑是不推荐的。
怎么优化:
使用step()、ceil()、clamp()、lerp()等函数进行替换。用阶梯函数的思维来构建条件语句。
step(a, b): b小于a返回0,否则,返回1。
ceil(x):对输入参数向上取整。例如:ceil(float(1.3)) ,其返回值为 2.0。
floor(x):对输入参数向xia取整。例如:floor(float(1.3)) ,其返回值为 1.0。
clamp(x, a, b):如果 x 值小于 a,则返回 a;如果 x 值大于 b,返回 b;否则,返回 x。
lerp(a, b, w):a与b为同类形,即都是float或者float2之类的,lerp函数返回的结果也是与ab同类型的值。
w是比重,在0到1之间。当w为0时返回a,为1时返回b,在0-1之间时,以比重w将ab进行线性插值计算。