🚶♂️
シェーダーで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を入れ子すれば複雑な条件分岐ができます。
参考
Discussion