floatの値が0から1の範囲内ならA、範囲外ならBを返す処理が欲しかった。 通常であればこのようにif文で作ることができます。 if (x >= 0.0 && x <= 1.0) { return A; } else { return B; }しかし、シェーダにおいてはif文を使ってしまうとGPUの並列処理を阻害することになり、パフォーマンスが大きく落ちます。 そこでif文を使わない方法を考えることにしました。 結論だけ見たい方はこちら 方針最初に思いついたのはこれです。 int isInRange = 1 - (int)(abs(x - 0.5) + 0.5);abs(x – 0.5)のところで絶対値が0.5に満たない場合は、+0.5しても1にならないので、int型にキャストすることで0か1に分けることができます。 最後に書きますが0か1に分けることでlerpを使用して目的の値を取得で
![if文を使わずに値が0から1の範囲内に収まっているか調べる【シェーダ最適化】|アマガミナブログ](https://cdn-ak-scissors.b.st-hatena.com/image/square/c1a23123aa52397e8bae71a32f3915dc080a5a1f/height=288;version=1;width=512/https%3A%2F%2Famagamina.jp%2Fblog%2Fwp-content%2Fuploads%2F2019%2F07%2Fno-if-range.jpg)