根据 GLSL 中向量的特定分量执行最小-最大的最快方法?

vuo*_*ov4 3 shader glsl

我需要在我的 GLSL 代码中多次调用这种函数。

vec2 minx(vec2 a, vec2 b) {
    if (a.x < b.x) return a;
    else return b;
}
Run Code Online (Sandbox Code Playgroud)

我担心过度分支。有没有办法避免 if-else 结构?

Rab*_*d76 7

我建议使用 GLSL 函数mixstep.

mixa根据[0.0, 1.0] 范围内的浮点插值值在 2 个值之间进行插值。如果a等于 0.0,则返回第一个值;如果a等于 1.0,则返回第二个值。

step测试某个值是否小于边缘值。如果小于则返回 0.0,否则返回 1.0。

如果您结合这两个函数,您的代码将如下所示:

vec2 minx(vec2 a, vec2 b)
{
    return mix( a, b, step( b.x, a.x ) );
}
Run Code Online (Sandbox Code Playgroud)

请注意, 的结果step要么正好是 0.0,要么正好是 1.0,这导致mix要么返回第一个值,要么返回第二个值。