shader blur

Aus DGL Wiki
Version vom 12. August 2008, 17:10 Uhr von Damadmax (Diskussion | Beiträge) (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...)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

blur

Zurück zur Shadersammlung

Beschreibung Autor Version
dieser Shader dient dazu ein screenaligned Quad geblurred zu rendern. damadmax 0.1

Bilder

Datei:Beispielbild.jpg
Bildbeschreibung
Datei:Beispielbild.jpg
Bildbeschreibung

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). 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 Quelltext vorgenommen. Deswegen könnten noch Tippfehler vorhanden sein.

Besondere Vorraussetzungen

Ich habe diesen Shader mit dem FBO benutzt, weshalb die Auflösung/Texelgröße ein ungleiches Seitenverhältnis 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].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 );
    curColor = texture2D( Texture0, curPos ) * data[i].y;
    blur    += curColor;
  }
  blur /= float(num);  // calc average
  gl_FragColor = blur;
}