7

我正在尝试在我的 Android 设备上使用 OpenGL ES 进行高斯模糊。我使用中提到的方法

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

我的应用程序中有两个帧缓冲区(A 和 B)。把A画到B画一维模糊,把B画到A画一维模糊。只模糊一个图像就可以了,它可能会赶上50fps。但是如果更多的图像被模糊,即使非常小,FPS 也会下降到 4~5。使用这种方法很糟糕。

我的问题是:

  1. 是否在一帧中多次切换两个 FBO 导致的性能问题?

  2. 有没有更好的方法在 Android 设备上进行乒乓渲染。

4

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 宽度或高度(以较大者为准)。如果那太模糊或太少,只需调整您输入的数字。但宽度和高度是一个很好的起点。数字越大越模糊。也尝试平均两者。如果图像真的是矩形的,你的模糊可能太大了。

60x60 图像上的 60 是 1:1 模糊,但如果您的图像是 512x512,则 60 的模糊几乎不会引起注意。模糊是模糊量与图像大小的比率。

它是一种黑客和斜线方法,但它快速简单,没有算法。

祝你好运

于 2013-02-01T10:03:01.433 回答