原理参考自的 BugRunner 博客
原图:
效果图:
- void main(void)
- {
- vec2 uv = gl_FragCoord.xy / sketchSize.xy;
- vec3 c = texture2D(Tex, uv).rgb;
- // 声明与初始化
- const int kSize = (MSIZE-1)/2;
- float kernel[MSIZE]; // 2*kSize + 1
- vec3 final_colour = vec3(0.0);
- float Z = 0.0;
- // 1-D:kernel[0 - 2*kSize + 1]
- // kernel[kSize] 权重最大
- for (int j = 0; j <= kSize; ++j)
- {
- kernel[kSize+j] = kernel[kSize-j] = normpdf(float(j), SIGMA);
- }
- vec3 cc;
- float factor;
- for (int i=-kSize; i <= kSize; ++i)
- {
- for (int j=-kSize; j <= kSize; ++j)
- {
- vec2 newUV = vec2(( gl_FragCoord.xy + vec2(float(i),float(j)) ) / sketchSize.xy);
- cc = texture2D(Tex, newUV).rgb;
- // 颜色权重 * 1-D 距离权重 * 1-D 距离权重
- factor = normpdf3(cc-c, BSIGMA) * kernel[kSize+j]*kernel[kSize+i];
- // 用于归一化权重
- Z += factor;
- final_colour += factor*cc;
- }
- }
- gl_FragColor = vec4(final_colour/Z, 1.0);
- }