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 总是大于或等于零,至少是大于零的分量之一。

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, -a)选择了有利于(1.0-step(0.0, a))step 被定义为仅当值低于边缘(在本例中为 0.0)时才返回 0.0,而不是如果它是平等的。实际上,使用较小的 epsilon 值可能仍然是一个好主意。

于 2013-10-17T19:22:47.360 回答