If statement GLSL-如果需要,请进行优化

If statement GLSL-如果需要,请进行优化,if-statement,glsl,shader,If Statement,Glsl,Shader,我有GLSL mobile shader(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; float b=texture2D(t,texCoord).r;

我有GLSL mobile shader(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;  
float b=texture2D(t,texCoord).r;
浮点数s=0.0;
如果(b>240.0)s=b-2322.2;
如果(b>90.0)s=b-74.0;
否则,如果(b<10.0)s=b/10.0;
否则s=b-10.0;
会很慢吗?我知道,应该避免着色器中的分支。
有没有办法,如何重写它以删除ifs?

我建议使用GLSL函数和

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

测试值是否小于边值。如果小于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) );

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

根据我使用
步骤
混合
的经验,即使“踩”制服,速度也总是较慢,您的代码需要始终执行所有操作,只留下两个可以优化的LERP,而OPs原始代码只有机会执行一个操作。暂且不提这一点,我认为正确的答案应该是“在目标硬件上配置文件,并在必要时进行优化”,尽管我高度怀疑这是过早优化的情况。因为这是针对移动着色器的,我没有所有可能的目标设备。