取一张透明纹理覆盖在屏幕上,然后写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) );最后一步,把这张纹理拉伸到和屏幕相同尺寸~

解决方案 »

  1.   

    思路我也明白的,但是就是shader代码写不出来,貌似您提供的确实有误
      

  2.   


    话说:这个vec4(1.)*是什么东东?PS:难点在于怎么去掉当前像素点的像素。
      

  3.   

    vec4是一个四维向量,vec4(1.)是给这个四维向量的每个值都赋值为1.0,当然你也可以赋值为任意你想要的颜色关键代码为帮你重新写一下
    比如你要框的区域是半透明,红色,那么颜色可以是 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 则显示为全透明,这样就符合要求了,如果要描边还要判断左边点是不是正好位于矩形边框上,代码会稍微复杂点
      

  4.   

    当然,如果都变成255还是有办法的,启用混合就行了,但是如果我想把这个区域内的
    所有像素均变为灰色,这个就很难了,不知道opengl 有没有提供这方面的功能