我知道if-else语句的计算效率很高的方法是mix
和step
组合,如下例所示:
procTexel = mix(tA, tB, step(1.250, time))
如何使用矩形,如何,我如何检查纹理像素是否在纹理坐标内的所需矩形区域内(让我们说vec4(0.5, 0.5, 0.55, 0.55)
)?这是一个简单的if-elseif-else检查,还是有更好的方法?
编辑:vec4
我称之为'矩形区域'关注vec4(xmin, ymin, xmax, ymax)
。
答案 0 :(得分:4)
GLSL函数step(edge, x)
如果x < edge
则返回0.0,而其他则返回1.0。
这意味着,那是
的结果step(edge, x)
等于
x >= edge ? 1.0 : 0.0
以下代码行将变量float in_range
设置为1.0,如果 x >= a
和 x <= b
,则将变量设置为0.0 else :
float in_range = step(a, x) * step(x, b);
注意,这仅适用于a <= b
。
如果您要测试,如果vec2 v
位于由2个向量vec2 v_min
和vec2 v_max
定义的矩形中,则可以这样做:
vec2 range_test = step(v_min, v) * step(v, v_max);
float in_rect = range_test.x * range_test.y;
当然,这仅适用于v_min.x <= v_max.x
和v_min.y <= v_max.y
。
这意味着,您可以像这样编写代码:
vec2 tex_coord = ....;
vec4 rect = vec4(xmin, ymin, xmax, ymax);
vec2 in_rect = step(rect.xy, tex_coord) * step(tex_coord, rect.zw);
procTexel = mix(tA, tB, in_rect.x * in_rect.y);