unity-shader-GPU优化_step函数替代if-else
GPU并不擅长 if-else 判断语句的计算, 使用 unity 优化过函数 step 绝大部分情况下可以替代 if-else 达到相同的效果
参考: Shader中if和for的效率问题以及使用策略 - https://zhuanlan.zhihu.com/p/33260382
前篇
这里 带边缘颜色的 溶解 效果为例
相关函数
函数 | 功能 |
---|---|
sign(x) | x > 0, res=1; x = 0, res = 0; x < 0; res = -1 约束 值 只能是 -1, 0, 1 |
saturate(x) | x < 0, res = 0 x > 1, res = 1 0 < x < 1, res = x 约束值 只能是 [0, 1] |
step(a, b) | 如果 a <= b,返回 1 ;否则,返回 0 。 |
lerp(a, b, f) | 计算 或者 的值。即在下限 a 和上限 b 之间进行插值, f 表示权值。注意,如果 a 和 b 是向量,则权值 f 必须是标量或者等长的向量。 展开后等价于 a(1-f) + b*f; |
测试代码
简单粗暴上代码
1 | Shader "test/Unlit-Texture-Dissolve" { |
shader graph 中使用
积雪 效果
step 函数使用的频率非常高, 常用于条件的判断 (替代 if-else, 更优于gpu并行计算). 之前也总结过 unity-shader-GPU优化_step函数替代if-else.
step(a, b) : 如果 a <= b,返回 1 ;否则,返回 0
官方示例中的 积雪 效果
- snow direction : (0, 1, 0), 也就是y轴正方向
- snow depth : 0, 这一步step也就是判断哪些 面 的 法线 与 (0, 1, 0) 的夹角小于 90 度