バッファを1つだけ使用し、一度に両方向にぼかします。
これが私が使用している標準の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を幅または高さ(どちらか大きい方)にフィードします。ぼかしが多すぎたり少なすぎたりする場合は、フィードする数を調整するだけです。ただし、幅と高さから始めることをお勧めします。数値が大きいほど、ぼやけが大きくなります。また、2つを平均してみてください。画像が本当に長方形の場合、ぼかしが大きすぎる可能性があります。
60x60画像の60は1:1のぼかしですが、画像が512x512の場合、60のぼかしはほとんど目立たなくなります。ぼかしは、画像サイズに対するぼかし量の比率です。
そのハックアンドスラッシュ方式ですが、アルゴリズムがなく、すばやく簡単です。
幸運を祈ります