3

誰かがこれらの IF ステートメントの使用を避ける方法を知っていますか?

float v = 9999.0;
if (a.x > 0.0 && a.x < v) { v = a.x; }
if (a.y > 0.0 && a.y < v) { v = a.y; }
if (a.z > 0.0 && a.z < v) { v = a.z; }

最初は次の行を使用しましたが、ゼロに等しくない場合の最小値のみが必要であることに気付きました。

float v = min(a.x, min(a.y, a.z));

また、a.xyz は常にゼロ以上であり、少なくとも 1 つのコンポーネントがゼロより大きいと仮定します。

4

1 に答える 1

2

次のような構成を使用できます

vec3 b=a+10000.0*step(0.0, -a);
float v=min(b.x, min(b.y, b.z));

また、(コードと同様に) 最小要素が < 10000 であることを前提としています。step は、値がエッジ (この場合は 0.0) を下回っている場合にのみ 0.0 を返すように定義されているためstep(0,0, -a)、優先的に選択されたことに注意してください。(1.0-step(0.0, a))等しいです。実際には、小さなイプシロン値を使用することをお勧めします。

于 2013-10-17T19:22:47.360 に答える