shader blur2
Inhaltsverzeichnis
Blur
Zurück zur Shadersammlung
Beschreibung | Autor | Version |
---|---|---|
Post-Processing-Shader zum verwischen der Szene. | Skeptiker | 1.0 |
Bilder
Beschreibung
Dieser Shader verwischt die Szene.
textureWidth gibt die Breite der Textur an.
textureHeight gibt die Höhe der Textur an.
horizontal true wenn horizontal verwischt werden soll, false wenn vertikal verwischt werden soll.
texture0 muss in der Regel nicht explizit angegeben werden.
Der Shader wurde bewusst einfach gehalten, mit einigen kniffen kann man hier mit Sicherheit mehr Performance rausholen.
Da der Shader für jedes Texel der Textur die unmittelbaren nachbar Texel abtastet muss das Verhalten an den Rändern der Textur definiert werden, hier empfiehlt sich die Einstellung GL_CLAMP_TO_EDGE oder GL_CLAMP_TO_BORDER.
Besondere Vorraussetzungen
Es handelt sich um einen Post-Processing-Shader, die Szene muss daher vorher in eine Textur gerendert werden. Anschließend muss diese Textur gebunden werden und als Fullscreen-Quad mit diesem Shader gerendert werden. Hier bietet sich ein FrameBufferObject an.
Code
Vertex Shader
#version 120
void main() {
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Fragment Shader
#version 120
uniform sampler2D texture0;
uniform int textureWidth;
uniform int textureHeight;
uniform bool horizontal;
const float gaussFilter[7] = float[7](
0.015625,
0.09375,
0.234375,
0.3125,
0.234375,
0.09375,
0.015625
);
void main() {
vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
for (int i = 0; i < 7; i++) {
vec2 texCoord;
if (horizontal) {
texCoord = vec2(gl_TexCoord[0].x + float(i - 3) / float(textureWidth), gl_TexCoord[0].y);
} else {
texCoord = vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + float(i - 3) / float(textureHeight));
}
color += texture2D(texture0, texCoord) * gaussFilter[i];
}
gl_FragColor = color;
}