如何提高OpenGL ES中乒乓渲染(模糊)的性能

时间:2013-01-22 09:33:55

标签: android performance opengl-es opengl-es-2.0

我正试图在我的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设备上进行乒乓呈现。

1 个答案:

答案 0 :(得分:2)

您应该只使用一个缓冲区并同时在两个方向上模糊它们。

这是我使用的标准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;
        }

Feed匀度blur_Size宽度或高度(更大)。如果那太多模糊或只是调整你输入的数量。但宽度和高度是一个很好的起点。数字越大,模糊越多。也尝试平均两者。如果图像真的是矩形,那么模糊可能太大了。

60x60图像上的60是模糊的1:1,但如果你的图像是512x512,那么60的模糊将难以察觉。模糊是模糊量与图像大小的比率。

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

祝你好运