标签: 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?
答案 0 :(得分:1)
我建议使用GLSL函数mix和step。
mix
step
mix根据范围[0.0,1.0]中的浮点插值a在2个值之间进行插值。如果a等于0.0,则返回第一个值,如果a等于1.0,则返回第二个值。
a
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返回第一个值或返回第二个值。