【问题标题】:Fastest way to do min-max based on specific component of vectors in GLSL?基于 GLSL 中向量的特定分量进行 min-max 的最快方法?
【发布时间】:2017-08-09 17:29:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: glsl shader


    【解决方案1】:

    我建议使用 GLSL 函数 mixstep

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

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

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

    vec2 minx(vec2 a, vec2 b)
    {
        return mix( a, b, step( b.x, a.x ) );
    }
    

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

    【讨论】:

    • 太棒了!谢谢。
    猜你喜欢
    • 2014-03-11
    • 2022-07-14
    • 1970-01-01
    • 2021-08-05
    • 2019-12-24
    • 2017-11-10
    • 2019-06-02
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多