我正在尝试在Android上使用OpenGL ES 2.0实现模糊过滤器。 这是我正在使用的代码:
varying highp vec2 fragTexCoord;
highp vec2 u_Scale;
uniform sampler2D s_texture;
highp vec2 gaussFilter[7];
uniform highp float radius;
highp vec4 boxVerBlur(){
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 vec4 color = vec4(0,0,0,1);
u_Scale = vec2( 1.0/radius, 0 );
for( int i = 0; i < 7; i++ )
{
color += texture2D( s_texture, vec2(
fragTexCoord.x + gaussFilter[i].x*u_Scale.x,
fragTexCoord.y + gaussFilter[i].x*u_Scale.y )) * gaussFilter[i].y;
}
return color;
}
void main(void)
{
gl_FragColor = boxVerBlur();
}
在“三星Galaxy S”上它按预期工作。然而,当我在“三星Galaxy Ace”上运行相同的应用程序时,它会产生更明亮的纹理而没有模糊效果。
Galaxy S的结果:
Galaxy ACE的结果:
答案 0 :(得分:0)
我假设通过gaussFilter1和gaussFilter2你的意思是gaussFilter [1]和gaussFilter [2]。
我注意到你的代码唯一的问题是你要添加alpha,尝试只添加rgb:
color.rgb += texture2D( s_texture, vec2(
fragTexCoord.x + gaussFilter[i].x*u_Scale.x,
fragTexCoord.y + gaussFilter[i].x*u_Scale.y )).rgb * gaussFilter[i].y;
它不应该引起你的问题,但是值得一试,即使它没有解决问题,你也会为每个纹理访问节省不必要的金额。