shader blur2: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „=Blur= Zurück zur Shadersammlung {|{{Prettytable_B1}} width=100% !width=60%|Beschreibung !width=20%|Autor !width=20%|Version |- |Post-Processing-Shader zum v…“)
 
Zeile 73: Zeile 73:
 
if (horizontal) {
 
if (horizontal) {
 
 
texCoord = vec2(gl_TexCoord[0].x + float(i - 4) / float(textureWidth), gl_TexCoord[0].y);
+
texCoord = vec2(gl_TexCoord[0].x + float(i - 3) / float(textureWidth), gl_TexCoord[0].y);
 
} else {
 
} else {
 
 
texCoord = vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + float(i - 4) / float(textureHeight));
+
texCoord = vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + float(i - 3) / float(textureHeight));
 
}
 
}
 
 

Version vom 23. Dezember 2009, 16:45 Uhr

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.

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;

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