GLSL - 优化if-else

时间:2017-12-01 16:32:07

标签: if-statement glsl

我有GLSL移动着色器(ES 2.0),里面我有这个:

float b = texture2D(t, texCoord).r;
float s = 0.0;
if (b > 240.0) s = b - 2322.2;
else if (b > 90.0) s = b - 74.0;    
else if (b < 10.0) s = b / 10.0;
else s = b - 10.0;  

会慢吗?我知道,应该避免使用着色器分支。 有什么办法,如何重写这个以删除ifs?

1 个答案:

答案 0 :(得分:1)

我建议使用GLSL函数mixstep

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

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

如果将两个函数组合在一起,您的代码将如下所示:

float b = texture2D(t, texCoord).r;
float s = mix(
    mix( b/10.0, b-10.0,   step(10.0, b) ),
    mix( b-74.0, b-2322.2, step(240.0, b) ),
    step(90.0, b) );

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