🚶‍♂️

シェーダーでif/elseのような条件分岐を書く

に公開

wgslなどシェーダー言語を書くときにif/elseを使って条件分岐を行うべきではないといわれています(諸説あり)。
何かしらの事情でif/elseを使えないが条件分岐したいときのために、mix/stepで代用する方法を紹介します。

mixとstepで条件分岐

mix(A, B, step(edge, x))とするとif文で条件を(x > edge)としたときと同等のことができます。真(x > edge)ならA、偽(x <= edge)ならBです。
例えば0から9までの任意の数字が5よりも大きいか評価したいとします。すると

conditions.wgsl
const num = 0 // can be 0, 1, 2, .. 9
var result = mix("num <= 5", "num > 5", step(5.0, num))
// equivalent to ↓
var result_if_statement = if (num > 5.0) {
        "num > 5"
    } else {
        "num <= 5"
    }

といったように書けます。mixの第一、第二引数にさらにmix/stepを入れ子すれば複雑な条件分岐ができます。

参考

https://qiita.com/yuichiroharai/items/6e378cd128279ac9a2f0

Discussion