shader blur: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: =blur= Zurück zur Shadersammlung {|{{Prettytable_B1}} width=100% !width=60%|Beschreibung !width=20%|Autor !width=20%|Version |- |dieser Shader dient dazu ein scree...) |
Flo (Diskussion | Beiträge) K (→Code: GLSlang Quelltext war als C++ markiert.) |
||
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 22: | Zeile 22: | ||
==Beschreibung== | ==Beschreibung== | ||
Der Shader macht mehrere Lookups auf die übergebene Textur mit einem -in einem Array- definierten Abstand zueinander. | Der Shader macht mehrere Lookups auf die übergebene Textur mit einem -in einem Array- definierten Abstand zueinander. | ||
− | So kann man auch andere Verteilungen realisieren (z.B. Gauss). | + | So kann man auch andere Verteilungen realisieren (z.B. Gauss, Normalverteilung). |
Der daraus berechnete Durchschnitt wird dann als Fragment ausgegeben. | Der daraus berechnete Durchschnitt wird dann als Fragment ausgegeben. | ||
Zeile 28: | Zeile 28: | ||
− | Ich habe im nachhinein noch ein paar Verschönerungen am Quelltext vorgenommen. Deswegen könnten noch | + | Ich habe im nachhinein noch ein paar Verschönerungen am originalen (funktionierenden) Quelltext vorgenommen. Deswegen könnten noch Tipp-/Syntaxfehler vorhanden sein. |
==Besondere Vorraussetzungen== | ==Besondere Vorraussetzungen== | ||
− | Ich habe diesen Shader mit dem FBO benutzt, weshalb die Auflösung/Texelgröße ein | + | Ich habe diesen Shader mit dem FBO benutzt, weshalb die Auflösung/Texelgröße ein Seitenverhältnis ungleich 1 hat. |
==Code== | ==Code== | ||
Vertex Shader | Vertex Shader | ||
− | < | + | <source lang="glsl"> |
void main(void) | void main(void) | ||
{ | { | ||
Zeile 41: | Zeile 41: | ||
gl_Position = ftransform(); | gl_Position = ftransform(); | ||
} | } | ||
− | </ | + | </source> |
Fragment Shader (vertikal) | Fragment Shader (vertikal) | ||
− | < | + | <source lang="glsl"> |
uniform sampler2D Texture0; | uniform sampler2D Texture0; | ||
uniform float strength; | uniform float strength; | ||
Zeile 68: | Zeile 68: | ||
for (int i = 0; i < num; i++) | for (int i = 0; i < num; i++) | ||
{ | { | ||
− | curPos = vec2( gl_TexCoord[0].y + data[i].x * texelSize.y ); | + | curPos = vec2( gl_TexCoord[0].x, gl_TexCoord[0].y + data[i].x * texelSize.y ); |
curColor = texture2D( Texture0, curPos ) * data[i].y; | curColor = texture2D( Texture0, curPos ) * data[i].y; | ||
blur += curColor; | blur += curColor; | ||
Zeile 75: | Zeile 75: | ||
gl_FragColor = blur; | gl_FragColor = blur; | ||
} | } | ||
− | </ | + | </source> |
Fragment Shader (horizontal) | Fragment Shader (horizontal) | ||
− | <cpp> | + | <source lang="cpp"> |
uniform sampler2D Texture0; | uniform sampler2D Texture0; | ||
uniform float strength; | uniform float strength; | ||
Zeile 102: | Zeile 102: | ||
for (int i = 0; i < num; i++) | for (int i = 0; i < num; i++) | ||
{ | { | ||
− | curPos = vec2( gl_TexCoord[0].x + data[i].x * texelSize.x ); | + | curPos = vec2( gl_TexCoord[0].x + data[i].x * texelSize.x, gl_TexCoord[0].y ); |
curColor = texture2D( Texture0, curPos ) * data[i].y; | curColor = texture2D( Texture0, curPos ) * data[i].y; | ||
blur += curColor; | blur += curColor; | ||
Zeile 109: | Zeile 109: | ||
gl_FragColor = blur; | gl_FragColor = blur; | ||
} | } | ||
− | </ | + | </source> |
Aktuelle Version vom 10. März 2009, 21:52 Uhr
Inhaltsverzeichnis
blur
Zurück zur Shadersammlung
Beschreibung | Autor | Version |
---|---|---|
dieser Shader dient dazu ein screenaligned Quad geblurred zu rendern. | damadmax | 0.1 |
Bilder
Text und Bilder folgen
Beschreibung
Der Shader macht mehrere Lookups auf die übergebene Textur mit einem -in einem Array- definierten Abstand zueinander. So kann man auch andere Verteilungen realisieren (z.B. Gauss, Normalverteilung). Der daraus berechnete Durchschnitt wird dann als Fragment ausgegeben.
Jetzt könnte man natürlich hingehen und sowohl horizontal als auch vertikal in einem Renderdurchgang realisieren. Allerdings wären dass dann bei einer Größe von 5x5 satte 25 Abfragen insgesamt. Mit zwei Durchläufen, verteilt auf horizontal und vertikal, sind es lediglich 10.
Ich habe im nachhinein noch ein paar Verschönerungen am originalen (funktionierenden) Quelltext vorgenommen. Deswegen könnten noch Tipp-/Syntaxfehler vorhanden sein.
Besondere Vorraussetzungen
Ich habe diesen Shader mit dem FBO benutzt, weshalb die Auflösung/Texelgröße ein Seitenverhältnis ungleich 1 hat.
Code
Vertex Shader
void main(void)
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
Fragment Shader (vertikal)
uniform sampler2D Texture0;
uniform float strength;
vec2 data[5];
vec2 texelSize = vec2(1.0) / vec2(640.0, 480.0); // resolution hardcoded
int num = 5;
void main()
{
// vec2 data( offset, weight )
data[0] = vec2(-2.0, strength * 0.3);
data[1] = vec2(-1.0, strength * 0.6);
data[2] = vec2( 0.0, strength);
data[3] = vec2( 1.0, strength * 0.6);
data[4] = vec2( 2.0, strength * 0.3);
vec4 blur;
vec2 curPos;
vec4 curColor;
for (int i = 0; i < num; i++)
{
curPos = vec2( gl_TexCoord[0].x, gl_TexCoord[0].y + data[i].x * texelSize.y );
curColor = texture2D( Texture0, curPos ) * data[i].y;
blur += curColor;
}
blur /= float(num); // calc average
gl_FragColor = blur;
}
Fragment Shader (horizontal)
uniform sampler2D Texture0;
uniform float strength;
vec2 data[5];
vec2 texelSize = vec2(1.0) / vec2(640.0, 480.0); // resolution hardcoded
int num = 5;
void main()
{
// vec2 data( offset, weight )
data[0] = vec2(-2.0, strength * 0.3);
data[1] = vec2(-1.0, strength * 0.6);
data[2] = vec2( 0.0, strength);
data[3] = vec2( 1.0, strength * 0.6);
data[4] = vec2( 2.0, strength * 0.3);
vec4 blur;
vec2 curPos;
vec4 curColor;
for (int i = 0; i < num; i++)
{
curPos = vec2( gl_TexCoord[0].x + data[i].x * texelSize.x, gl_TexCoord[0].y );
curColor = texture2D( Texture0, curPos ) * data[i].y;
blur += curColor;
}
blur /= float(num); // calc average
gl_FragColor = blur;
}