OpenGL之图片效果处理(四)

上一章节,给大家介绍了图片色彩处理,这一章节,我给大家介绍一下图片效果处理。

图片效果处理包括:这里主要讲图片模糊处理(高斯模糊,马赛克,膨胀,腐蚀,增强对比度)。

原理:通过对采样点进行处理,是采样点和周围点之间产生某种数学联系,改变采样点的色值,从而达到预期效果。

具体实现,主要改变片元着色器里面gl_FragColor的值来达到效果,这里列出具体的计算过程,其它同上一章内容:

1、高斯模糊:

            float  block=150.0;
            float  delta=1.0/block;
            vec4 color=vec4(0.0);
            //权重
            float factor[9];
            factor[0]=1.0; factor[1]=1.0; factor[2]=1.0;
            factor[3]=1.0; factor[4]=1.0; factor[5]=1.0;
            factor[6]=1.0; factor[7]=1.0; factor[8]=1.0;
              for(int i=-1;i<=1;i++){//三次
               for(int j=-1;j<=1;j++){//三次
                 float x=max(0.0,aCoordinate.x+float(i)*delta);
                 float y=max(0.0,aCoordinate.y+float(i)*delta);
                 color+= texture2D(vTexture,vec2(x,y)*factor[(i+1)*3+(j+1)]);
               }
              }
            color=color/9.0;

            gl_FragColor=vec4(vec3(color),1.0);

2、马赛克效果:

                //把图像进行分割分割成若干份,然后用马赛克填充
                 vec2 texSize =vec2(400.0,400.0);
                 vec2 mosaicSize=vec2(8.0,8.0);
                 //混合纹理
                 vec2 intXY=vec2(aCoordinate.x*texSize.x,aCoordinate.y*texSize.y);
                 vec2  XYmosaic=vec2(floor(intXY.x/mosaicSize.x)*mosaicSize.x
                                ,floor(intXY.y/mosaicSize.y)*mosaicSize.y);
                 vec2  Umosaic=vec2( XYmosaic.x/texSize.x,XYmosaic.y/texSize.y);

                gl_FragColor = texture2D( vTexture,Umosaic);

3、膨胀效果:

      //寻找周围点
            float  block=500.0;
            float  delta=1.0/block;
              vec4 maxColor=vec4(-1.0);
            for(int i=-1;i<=1;i++){//三次
                for(int j=-1;j<=1;j++){//三次
                  float x=(aCoordinate.x+float(i)*delta);
                  float y=(aCoordinate.y+float(i)*delta);
                    //寻找最亮点,代替周围点
                  maxColor=max(maxColor,texture2D(vTexture,vec2(x,y)));
                }
            }

            gl_FragColor=maxColor;

4、腐蚀效果:

 //寻找周围点
                    float  block=500.0;
                    float  delta=1.0/block;
                      vec4 maxColor=vec4(1.0);
                    for(int i=-1;i<=1;i++){//三次
                        for(int j=-1;j<=1;j++){//三次
                          float x=(aCoordinate.x+float(i)*delta);
                          float y=(aCoordinate.y+float(i)*delta);
                            //寻找最暗点,代替周围点
                          maxColor=min(texture2D(vTexture,vec2(x,y)),maxColor);
                        }
                    }

                    gl_FragColor=maxColor;

5、增强对比度:

    float a=0.5;
     vec3 y=nColor.rgb;
     vec3 x=vec3(0.0,0.0,0.0);
    //   增强对比度函数:mix(x,y,a)=x*(1-a)+y*a
     gl_FragColor =  vec4(mix(x,y,a),1.0);

猜你喜欢

转载自blog.csdn.net/qq_33275597/article/details/80871063