4 Stimmen

Fragment-Shader-Weichzeichnung ... wie funktioniert das?

uniform sampler2D sampler0;
uniform vec2 tc_offset[9];
void blur()
{
  vec4 sample[9];
  for(int i = 0; i < 9; ++i)
    sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]);

  gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] +
      (2.0 * sample[3]) + sample[4] + 2.0 * sample[5] +
      sample[6] + 2.0 * sample[7] + sample[8] ) / 13.0;
}

Wie funktioniert die Zeile sample[i] = texture2D(sample0, ...)?

Um ein Bild unscharf zu machen, muss ich zuerst das Bild erzeugen, aber hier versuche ich irgendwie, genau das Bild abzufragen, das ich erzeuge. Wie funktioniert das?

6voto

Alexander Gessler Punkte 44223

Er wendet einen Unschärfekern auf das Bild an. tc_offset muss von der Anwendung richtig initialisiert werden, um einen 3x3-Bereich von Abtastpunkten um die tatsächliche Texturkoordinate herum zu bilden:

0   0   0
0   x   0
0   0   0

(unter der Annahme, dass x die ursprüngliche Koordinate ist). Der Offset für die obere linke Abtaststelle wäre -1/width,-1/height . Der Offset für den Mittelpunkt muss sorgfältig an der Texelmitte ausgerichtet werden (das Off-by-0,5-Problem). Außerdem kann der bilineare Hardware-Filter verwendet werden, um den Grad der Unschärfe kostengünstig zu erhöhen (durch Abtasten zwischen den Texeln).

Der Rest des Shaders skaliert die Samples nach ihrem Abstand. Normalerweise wird auch dies vorberechnet:

for(int i = 0; i < NUM_SAMPLES; ++i) {
    result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
}

5voto

jcoder Punkte 28716

Eine Möglichkeit besteht darin, das Originalbild so zu generieren, dass es auf eine Textur und nicht auf den Bildschirm gerendert wird. Und dann zeichnen Sie ein Vollbild-Quad mit diesem Shader und die Textur als Eingabe, um das Bild nachzubearbeiten.

4voto

Chris Dodd Punkte 109402

Um ein unscharfes Bild zu erstellen, müssen Sie zunächst ein Bild erstellen und es dann unscharf machen. Dieser Shader macht (nur) den zweiten Schritt, indem er ein Bild nimmt, das zuvor erzeugt wurde, und es unscharf macht. An anderer Stelle ist zusätzlicher Code erforderlich, um das ursprüngliche, nicht unscharfe Bild zu erzeugen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X