常见shader原理及实现(二)模糊

卷积,滤波,线性时不变系统……事实证明,图像处理和信号系统两门课都还给了老师 -__-

在图像处理中卷积的意义,嗯……很复杂,姑且理解为加权平均运算吧:把一个点的像素值用它周围的点的像素值的加权平均代替。

下面介绍的高斯模糊计算方式便用到卷积,其卷积内核为

 1  4  7  4 1                                                    
 4 16 26 16 4                                                    
 7 26 41 26 7      
 4 16 26 16 4                                                    
 1  4  7  4 1 

每个像素点周围5X5点按次矩阵加权平均即得输出值。

Fragment Shader见下:

varying vec2 uv;
uniform sampler2D sampler2d;
uniform float dis;//模糊半径
void main (void)
{
    vec2 u_TextureCoordOffset[25];
    
    u_TextureCoordOffset=vec2[](
        vec2(-2. * dis,2. * dis),vec2(-1. * dis,2. * dis),vec2(0. * dis,2. * dis),vec2(1. * dis,2. * dis),vec2(2. * dis,2. * dis),
        vec2(-2. * dis,1. * dis),vec2(-1. * dis,1. * dis),vec2(0. * dis,1. * dis),vec2(1. * dis,1. * dis),vec2(2. * dis,1. * dis),
        vec2(-2. * dis,0. * dis),vec2(-1. * dis,0. * dis),vec2(0. * dis,0. * dis),vec2(1. * dis,0. * dis),vec2(2. * dis,0. * dis),
        vec2(-2. * dis,-1. * dis),vec2(-1. * dis,-1. * dis),vec2(0. * dis,-1. * dis),vec2(1. * dis,-1. * dis),vec2(2. * dis,-1. * dis),
        vec2(-2. * dis,-2. * dis),vec2(-1. * dis,-2. * dis),vec2(0. * dis,-2. * dis),vec2(1. * dis,-2. * dis),vec2(2. * dis,-2. * dis)
    );
    
    vec4 sample[25];                                                                                                                        
    for (int i = 0; i < 25; i++)                                    
    {                                                                
        sample[i] = texture2D(sampler2d, uv.st + u_TextureCoordOffset[i]/512.0);                                
    }                  
                                                                    
    gl_FragColor = (                                                
        (1.0  * (sample[0] + sample[4]  + sample[20] + sample[24])) +    
        (4.0  * (sample[1] + sample[3]  + sample[5]  + sample[9] + sample[15] + sample[19] + sample[21] + sample[23])) +        
        (7.0  * (sample[2] + sample[10] + sample[14] + sample[22])) +    
        (16.0 * (sample[6] + sample[8]  + sample[16] + sample[18])) +    
        (26.0 * (sample[7] + sample[11] + sample[13] + sample[17])) +    
        (41.0 * sample[12])                                                
    ) / 273.0;
}

模糊半径:1

依次为:原图,模糊半径1,模糊半径2,模糊半径5

 

posted on 2015-06-11 16:49  wonderday  阅读(2877)  评论(0编辑  收藏  举报

导航