关于避免GLSL中的IF

时间:2013-10-17 16:28:59

标签: opengl glsl

有人知道如何避免使用这些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; }

最初我使用了以下几行但后来我意识到我只想要最小值iff它不等于零。

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

我还假设a.xyz总是大于或等于零,至少是大于零的一个组件。

1 个答案:

答案 0 :(得分:2)

你可以使用像

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

也假定(如你的代码那样)你的最小元素是&lt; 10000.请注意,选择step(0,0, -a)以支持(1.0-step(0.0, a)),因为步骤被定义为仅当值低于边缘时返回0.0(在这种情况下为0.0),而不是相等。在实践中,使用小的epsilon值可能仍然是一个好主意。