next up previous contents
Next: Vergleich OpenGL und Direct3D Up: wehende Flagge Previous: wehende Flagge   Contents

GLSL waving flag Shader

Unsere Flagge soll innerhalb einer Sekunde einmal komplett durchschwingen, sprich wir wollen innerhalb dieser Zeitspanne die Sinusfunktion um eine komplette Periode verschieben. Hierzu muss lediglich der Vertex Shader aus 5.7.1 ein wenig angepasst werden:


\begin{lstlisting}[name=flagwave.avs]
const float PI = float(4.0f * atan(1.0f));...
...ient);
\par
gl_Position = gl_ModelViewProjectionMatrix * v;
}
\end{lstlisting}

Nachdem wir uns $\pi$ als Konstante definiert haben deklarieren wir die spaeter von der Applikation gesetzte uniform-Variable timeElapsed. Nun ist die einzige noch durchzufuehrende Aenderung die Berechnung der Verschiebung unserer Sinuskurve (offset) welche dann sowohl zum Setzen der neuen Position als auch zur Berechnung unserer - immernoch falscher - Normalen eingesetzt wird.

Diesen Vertex Shader kann man nun mit jedem unserer Fragment Shader zusammen benutzen, auch wenn bei den beleuchtenden Shadern gerade in der Bewegung doch sehr auffaelt dass die Normalen nicht korrekt gesetzt werden.


2005-10-25 Michael Bayer - nightspawn.com