opengl - 如何仅在某个矩形区域内更改纹理中的纹素?

时间:2018-01-09 08:31:01

标签: opengl opengl-es glsl

我知道if-else语句的计算效率很高的方法是mixstep组合,如下例所示:

procTexel = mix(tA, tB, step(1.250, time))

如何使用矩形,如何,我如何检查纹理像素是否在纹理坐标内的所需矩形区域内(让我们说vec4(0.5, 0.5, 0.55, 0.55))?这是一个简单的if-elseif-else检查,还是有更好的方法?

编辑:vec4我称之为'矩形区域&#​​39;关注vec4(xmin, ymin, xmax, ymax)

1 个答案:

答案 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_minvec2 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.xv_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);