7

AndroidデバイスのOpenGLESでガウスぼかしを実行しようとしています。私はで言及されている方法を使用します

http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/

私のアプリには2つのフレームバッファー(AとB)があります。AをBに描画して一方の次元をぼかし、BをAに描画してもう一方の次元をぼかします。1つの画像だけをぼかしても、50fpsに追いつく可能性があります。しかし、非常に小さい場合でも、より多くの画像がぼやけている場合、FPSは4〜5に低下します。このアプローチを使用するのはひどいです。

私の質問は次のとおりです。

  1. 1つのフレームで2つのFBOを複数回切り替えることによってパフォーマンスの問題が発生しますか?

  2. Androidデバイスでピンポンレンダリングを行うためのより良い方法はありますか?

4

1 に答える 1

1

バッファを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のぼかしはほとんど目立たなくなります。ぼかしは、画像サイズに対するぼかし量の比率です。

そのハックアンドスラッシュ方式ですが、アルゴリズムがなく、すばやく簡単です。

幸運を祈ります

于 2013-02-01T10:03:01.433 に答える