您应该只使用一个缓冲区并同时在两个方向上模糊它们。
这是我使用的标准 OpenGL 着色器,发现它非常简单。
uniform sampler2D texture_map;
uniform float blur;
uniform float blur_Size;
float blurSize = 1.0/blur_Size; // I've chosen this size because this will result in that every step will be one pixel wide if the texture is of size 512x512
void main() {
if (blur!=0.0){
vec4 sum = vec4(0.0);
// blur in y (vertical)
// take nine samples, with the distance blurSize between them
sum += texture2D(texture_map, vec2(texcoord.x - 4.0*blurSize, texcoord.y)) * 0.05;
sum += texture2D(texture_map, vec2(texcoord.x - 3.0*blurSize, texcoord.y)) * 0.09;
sum += texture2D(texture_map, vec2(texcoord.x - 2.0*blurSize, texcoord.y)) * 0.12;
sum += texture2D(texture_map, vec2(texcoord.x - blurSize, texcoord.y)) * 0.15;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y)) * 0.16;
sum += texture2D(texture_map, vec2(texcoord.x + blurSize, texcoord.y)) * 0.15;
sum += texture2D(texture_map, vec2(texcoord.x + 2.0*blurSize, texcoord.y)) * 0.12;
sum += texture2D(texture_map, vec2(texcoord.x + 3.0*blurSize, texcoord.y)) * 0.09;
sum += texture2D(texture_map, vec2(texcoord.x + 4.0*blurSize, texcoord.y)) * 0.05;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y - 4.0*blurSize)) * 0.05;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y - 3.0*blurSize)) * 0.09;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y - 2.0*blurSize)) * 0.12;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y - blurSize)) * 0.15;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y)) * 0.16;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y + blurSize)) * 0.15;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y + 2.0*blurSize)) * 0.12;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y + 3.0*blurSize)) * 0.09;
sum += texture2D(texture_map, vec2(texcoord.x, texcoord.y + 4.0*blurSize)) * 0.05;
gl_FragColor = sum/2.0;
}
馈送统一的 blur_Size 宽度或高度(以较大者为准)。如果那太模糊或太少,只需调整您输入的数字。但宽度和高度是一个很好的起点。数字越大越模糊。也尝试平均两者。如果图像真的是矩形的,你的模糊可能太大了。
60x60 图像上的 60 是 1:1 模糊,但如果您的图像是 512x512,则 60 的模糊几乎不会引起注意。模糊是模糊量与图像大小的比率。
它是一种黑客和斜线方法,但它快速简单,没有算法。
祝你好运