Ich versuche, einen Unschärfe-Shader für das iPad zu schreiben. Ich habe es funktioniert, aber ich bin nicht sehr glücklich mit den Ergebnissen. Ich bekomme sehr choppy Bildraten und die Unschärfe sieht wie Mist aus, wenn Unschärfe hoch ist.OpenGL ES 2.0 Fragment Shader zu verwischen ist langsam und von geringer Qualität
Irgendwelche Ideen, wie man Dinge verbessert?
Einige Beispielausgabe:
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;
}
Edit: Eine Schachtel Unschärfe kann der Weg zu gehen. Hier ist ein Feld Unschärfe Version des Shaders:
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;
Hier wird die Box Unschärfe Ausgang (beachten Sie, es ist nur eine horizontale Unschärfe, aber es könnte für genug sein, was ich will):
Ja, ich denke, das war mein Fehler bei der Anpassung des Codes. Vielen Dank. Ich denke, dass ich für meine Zwecke nicht wirklich einen vollen Gaussian brauche, also könnte die einfache Box-Unschärfe gut genug funktionieren und schneller sein. – Brian