常见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,模糊半径2,模糊半径5
posted on 2015-06-11 16:49 wonderday 阅读(2877) 评论(0) 编辑 收藏 举报