next up previous contents
Next: zurueck zur Flagge Up: Lighting Previous: Lighting   Contents

GLSL per Pixel Lighting

Zu erst der Vertex Shader:


\begin{lstlisting}[name=perpixel.avs]
varying vec4 diffuse, ambient;
varying vec...
...par
// transform position
gl_Position = ftransform();
\par
}
\end{lstlisting}

Die Variablen normal und lightDir sollten noch aus den letzten Shadern bekannt sein, neu ist halfVector. Diese Variable dient der Übergabe des normalisierten Halbvektors - dem Vektor der genau zwischen Vektor vom Augenpunkt zum Vertex (eye vector) und dem Lichtvektor liegt - an den Fragment Shader. Der Halbvektor wird zur Berechnung des spekulaeren Lichtanteils (specular component) genutzt, eine Vereinfachung des Phong-Beleuchtungsmodelles welche zu erst beschrieben in [4]. Des weiteren deklarieren wir vier-komponentige Vektoren diffuse ambient die jeweils den diffusen und den ambienten Anteil des Lichtes in diesem Vertex speichern sollen.

Im eigentlichen Programm berechnen wir zunachst die Normale, die Lichtrichtung und den eben beschriebenen Halbvektor. Dann wird der diffuse Lichtanteil berechnet nachdem wir die diffuse Farbe des Materiales mit dem diffusen Anteil der Lichtquelle multiplizieren. Der ambiente Lichtanteil berechnet sich folglich ganz nach Phong aus der ambienten Farbe des Materiales multipliziert mit der Summe der ambienten Lichtanteile der Lichtquelle und des globalen Lichtmodells welches von der Applikation vorgegeben wird.

Schliesslich transformieren wir nur noch die Position des Vertexes auf bekannte Weise.

Der Fragment Shader ist der bis jetzt komplizierteste:


\begin{lstlisting}[name=perpixel.afs]
varying vec4 diffuse, ambient;
varying vec...
...s);
color += diffuse * NdotL;
}
\par
gl_FragColor = color;
}
\end{lstlisting}

Nachdem wir die im Vertex Shader geschriebenen Variablen bekannt gemacht haben kommen wir zur eigentlichen main-Funktion. Dort deklarieren wir einige lokale Variablen welche wir im weiteren Verlauf brauchen werden und da wir die varying Variablen nicht im Fragment Shader beschreiben koennen kopieren wir die interpolierte Normale und ambiente Farbe in ebenfalls lokale Variablen.

Nun da die Vorarbeit geleistet ist kommen wir zur eigentlichen Fragmentfarbe. Dazu berechnen wir zunachst das Punktprodukt zwischen der Normalen und der Lichtrichtung. Falls das Punktprodukt groesser ist als 0 muessen wir mehr tun als nur die ambiente Farbe zu setzen: In diesem Fall addieren wir zum ambienten Lichtanteil die nach Blinn berechneten spekulaeren und die diffusen Farben.

Fuehren wir nun diese beiden Shader auf unserem teapot aus (./gltut shader/lighting/perpixel.avs shader/lighting/perpixel.afs) ist das Ergebnis (Abb. 5.5) doch schon recht ansehnlich.

Figure 5.5: Per Pixel Lighting
Image perpixel


next up previous contents
Next: zurueck zur Flagge Up: Lighting Previous: Lighting   Contents
2005-10-25 Michael Bayer - nightspawn.com