常见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

 

转载于:https://www.cnblogs.com/wonderday/p/4569552.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值