取一张透明纹理覆盖在屏幕上,然后写shader渲染这张透明纹理,通过uniform传入 矩形区域的起点坐标以及长宽(相对于屏幕的)
比如起点是,x,y,矩形长宽是width,height,纹理坐标是uv
shader里这么写
gl_FragColor = vec4(1.)*( step(x,uv.x) + step(uv.x,x+width) )*( step(y,uv.y) + step(uv.y,y+height) );最后一步,把这张纹理拉伸到和屏幕相同尺寸~
比如起点是,x,y,矩形长宽是width,height,纹理坐标是uv
shader里这么写
gl_FragColor = vec4(1.)*( step(x,uv.x) + step(uv.x,x+width) )*( step(y,uv.y) + step(uv.y,y+height) );最后一步,把这张纹理拉伸到和屏幕相同尺寸~
话说:这个vec4(1.)*是什么东东?PS:难点在于怎么去掉当前像素点的像素。
比如你要框的区域是半透明,红色,那么颜色可以是 vec4(1.0,0.0,0.0,0.5);然后框的4个顶点是 (a,b) (c,b)
(a,d) (c,d) // 这4个顶点的坐标也是要传入shader内
vev2 uv = v_texCoord.xy // v_texCoord 是 外部传入的贴图像素点坐标,当然也可以按当前屏幕的像素点坐标来算
gl_FragColor = vec4(1.0, 0.0, 0.0, 0.5) * step(a,uv.x)*step(uv.x,c)*step(uv.y,b)*step(d,uv.y);
//
step(a,uv.x)*step(uv.x,c)*step(uv.y,b)*step(d,uv.y)
的结果是,如果当前像素点的坐标uv位于矩形内则唯1,否则为0这样在矩形内的颜色就显示为你设定的颜色 vec4(1.0, 0.0, 0.0, 0.5);
其他区域因为*0 则显示为全透明,这样就符合要求了,如果要描边还要判断左边点是不是正好位于矩形边框上,代码会稍微复杂点
所有像素均变为灰色,这个就很难了,不知道opengl 有没有提供这方面的功能