Bri*_*ian 6 iphone opengl-es ipad ios 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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:盒子模糊可能是要走的路.这是着色器的框模糊版本:
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;
Run Code Online (Sandbox Code Playgroud)
这是盒子模糊输出(注意它只是一个水平模糊,但它可能足够我想要的):

Dan*_*iel 10
该着色器需要运行两次以使其工作,您调用的blurSize应该是a vec2,其值应该是vec2(0, 1.0/height)垂直模糊和vec2(1.0/width, 0)水平模糊.
见http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=240334
做两次模糊背后的想法是它将大大减少纹理查找的数量,并希望提高速度.内核大小为7x7的两遍模糊将需要14次纹理查找,但如果它在嵌套循环中完成,则需要进行49次纹理查找.
| 归档时间: |
|
| 查看次数: |
13687 次 |
| 最近记录: |