OpenGL ES 2.0片段着色器模糊速度慢,质量差

我正在尝试为iPad写一个模糊着色器。 我有它的工作,但我不是很高兴的结果。 我得到非常不连贯的帧率,模糊量高时,模糊看起来像废话。

任何想法如何改善事情?

一些示例输出:

替代文字

uniform sampler2D texture; varying mediump vec2 fragTexCoord; varying mediump vec3 eyespaceNormal; varying highp float blurAmount; void main(void) { highp vec2 gaussFilter[7]; gaussFilter[0] = vec2(-3.0, 0.015625); gaussFilter[1] = vec2(-2.0, 0.09375); gaussFilter[2] = vec2(-1.0, 0.234375); gaussFilter[3] = vec2(0.0, 0.3125); gaussFilter[4] = vec2(1.0, 0.234375); gaussFilter[5] = vec2(2.0, 0.09375); gaussFilter[6] = vec2(3.0, 0.015625); highp float blurSize = blurAmount * 1.0; ///////////////////////////////////////////////// // 7x1 gaussian blur fragment shader ///////////////////////////////////////////////// highp vec4 color = vec4(0,0,0,1); for( int i = 0; i < 7; i++ ) { color += texture2D( texture, vec2( fragTexCoord.x+gaussFilter[i].x*blurSize, fragTexCoord.y+gaussFilter[i].x*blurSize ) )*gaussFilter[i].y; } gl_FragColor = color; } 

编辑:框模糊可能是要走的路。 这里是着色器的一个框模糊版本:

 highp vec4 color = vec4(0,0,0,1); color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - 4.0*blurAmount)) * 0.05; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - 3.0*blurAmount)) * 0.09; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - 2.0*blurAmount)) * 0.12; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y - blurAmount)) * 0.15; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y)) * 0.16; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + blurAmount)) * 0.15; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + 2.0*blurAmount)) * 0.12; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + 3.0*blurAmount)) * 0.09; color += texture2D(texture, vec2(fragTexCoord.x, fragTexCoord.y + 4.0*blurAmount)) * 0.05; gl_FragColor = color; 

这里是框模糊输出(注意它只是一个水平的模糊,但它可能已经足够我想要的): 替代文字

该着色器需要运行两次才能正常工作,所谓的blurSize应该是vec2 ,对于垂直模糊应该是vec2(0, 1.0/height) ,对于水平模糊应该是vec2(1.0/width, 0)

http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=240334

做两遍模糊的想法是,它会大大减less纹理查找的次数,并希望提高速度。 内核大小为7×7的两遍模糊将需要14个纹理查找,但是如果在嵌套循环中完成,则需要执行49个纹理查找。

做两个或两个以上的框模糊通行证提高质量非常接近高斯模糊,同时保持性能相对较高。 盒子模糊也可以相对容易地加快。 看看http://web.archive.org/web/20060718054020/http://www.acm.uiuc.edu/siggraph/workshops/wjarosz_convolution_2001.pdf

无论如何,在大多数移动的场景中,您可以通过屏幕截图显示低保真的渲染。

目前还不清楚你的代码在做什么。 你正在使用的纹理2Dbuild议一个2Dfilter。 然而你的卷积matrix有一个维度,你只循环一次。 我可能是错的,但似乎对angular地应用模糊。 如果它是二维filter,则需要分别用x和y两个(嵌套)循环来覆盖二维区域。

而关于variablesblurSize – 它的名字有点误导。 模糊的大小取决于您的卷积matrix。 你的是7个像素宽。 这决定了大小。 这个variables更像是一个模糊的“强度”,它只能消除卷积matrix的影响。 如果赋予太高的价值,将出现文物。

我不是专家,除了“hello world”mandelbrot之外没有写像素着色器。 如果我没有错,比模糊着色器是最糟糕的加速之一。 我看到的大多数实时模糊都是盒子模糊的 。 尝试从这里移植一些代码: gameDev线程 。