shader blur2

Aus DGL Wiki
Version vom 24. Dezember 2009, 00:33 Uhr von Skeptiker (Diskussion | Beiträge) (Verhalten an Rändern eingefügt, Array konstant gemacht.)

Wechseln zu: Navigation, Suche

Blur

Zurück zur Shadersammlung

Beschreibung Autor Version
Post-Processing-Shader zum verwischen der Szene. Skeptiker 1.0

Bilder

Vorher
Nachher

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;
}