next up previous contents
Next: Shader Up: GLSL Previous: Kommunikation Applikation und Shader   Contents


Praxis: Kommunikation Applikation und Shader

Nun wollen wir wie in 4.6 beschrieben eine Uniform-Variable von unserer Applikation an den Shader weitergeben. Dazu muss erst die Position der Variablen im Speicher gefunden werden, dabei müssen wir darauf achten dass dies erst geschieht nachdem wir den Shader übersetzt und gelinkt haben, bei einigen Treibern ist es sogar notwendig dass der Shader dazu gebunden ist.

Ziel ist es dem Shader eine Variable vom Typ GLfloat zukommen zu lassen welche innerhalb einer Sekunde von 0.0f auf 1.0f steigt um dann erneut bei 0.0f zu beginnen. So ist es dem Shader möglich sein Verhalten über die Zeit unabhängig von der Ablaufgeschwindigkeit der Applikation zu verändern. Zu diesem Zweck definieren wir eine neue Funktion - sendTime() - und rufen diese in renderScene() nach dem Binden der Shader mittels bindShaders auf:


\begin{lstlisting}[name=shader.cpp - sendTime]
void sendTime() {
// determine ...
...ER_SEC;
// pass it to the shade
glUniform1fARB(loc, sec);
}
\end{lstlisting}

Die Variable welche wir dem Shader zur Verfügung stellen soll timeElapsed heißen. Die Ermittlung der Position dieser Variablen geschieht mittels der Funktion glGetUniformLocationARB, welche ein Handle nimmt in welchem die Variable deklariert wurde und einen nullterminierten String der den Namen der Variablen enthält. Nach einiger - zugegebenermaßen sehr rudimentärer - Fehlerbehandlung berechnen wir mittels der in time.h definierten Funktion clock den Wert welchen wir an den Shader übermitteln wollen und sende ihn schließlich mittels der Funktion glUniform1fARB an den Shader.

Auf diese und ähnlich Weise können auch andere Typen von Variablen gesetzt werden, das gezeigte soll aber an dieser Stelle ausreichen.


next up previous contents
Next: Shader Up: GLSL Previous: Kommunikation Applikation und Shader   Contents
2005-10-25 Michael Bayer - nightspawn.com