我正试图在我的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。使用这种方法很糟糕。
我的问题是:
在一帧中多次切换两个FBO会导致性能问题吗?
有没有更好的方法在Android设备上进行乒乓呈现。
答案 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的模糊将难以察觉。模糊是模糊量与图像大小的比率。它是一种黑客和斜线方法,但它的快速和简单,没有算法。
祝你好运