基于GLSL中矢量的特定成分,最快的方法来做min-max?

时间:2017-08-09 17:29:02

标签: glsl

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

vec2 minx(vec2 a, vec2 b) {
    if (a.x < b.x) return a;
    else return b;
}

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

1 个答案:

答案 0 :(得分:1)

我建议使用GLSL函数mixstep

mix根据范围[0.0,1.0]中的浮点插值a在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 ) );
}

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