shader blur2: Unterschied zwischen den Versionen
Aus DGL Wiki
(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 - | + | 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 - | + | texCoord = vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + float(i - 3) / float(textureHeight)); |
} | } | ||
Version vom 23. Dezember 2009, 16:45 Uhr
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.
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;
}