Estoy tratando de escribir un sombreado de desenfoque para el iPad. Lo tengo funcionando, pero no estoy muy contento con los resultados. Obtengo velocidades de cuadros muy entrecortadas y el desenfoque parece basura cuando la cantidad de desenfoque es alta.El sombreador de fragmentos OpenGL ES 2.0 para desenfocar es lento y de baja calidad
¿Alguna idea sobre cómo mejorar las cosas?
un ejemplo de salida:
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;
}
Editar: Un borrón cuadro puede ser el camino a seguir. Aquí está una versión de caja desenfoque del shader:
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;
Aquí está la salida de la caja de desenfoque (tenga en cuenta que es sólo un desenfoque horizontal, pero podría ser suficiente para lo que quiero):
Sí, creo que fue mi error al adaptar el código. Gracias. Creo que realmente no necesito un Gaussian completo para mis propósitos, por lo que la simple imagen borrosa funcionaría lo suficientemente bien y sería más rápido. – Brian