GLSL Unter Open GL
← GLSL Basissyntax | ● | GLSL Anwendungsbeispiel →
Wie erzeugt und benutzt man Shader unter OpenGL?
Compilieren eines Shaders
- Man erzeugt eine String-Variable, die den Shader als Inhalt hat.
- Ein (leerer) Shader wird mit glCreateShader (<typ>) erzeugt. Typ ist entweder GL_VERTEX_SHADER oder GL_FRAGMENT_SHADER.
- Das Ergebnis dieses Aufrufs ist ein Handle - ein Integer-Wert (genauer: GLuint), der für das selber geschriebene Programm keinerlei Bedeutung hat, aber in anderen Aufrufen wieder an OpenGL übergeben wird (man kann sich eine aufsteigende Nummer für jeden erzeugten Shader vorstellen, d.h. sie werden durchnummeriert).
- Mit glShaderSource (<Shader-Handle>, 1, <Zeiger auf Zeiger auf String>, NULL) legt man den Shader-Quelltext auf den String fest. Achtung: Zeiger auf Zeiger, also noch “&” vor der Stringvariablen.
- Mit glCompileShader (<Shader-Handle>) wird der Shader endlich compiliert.
Linken der Shader
Um Vertex- und Fragment-Shader benutzen zu können werden diese zu einem Programm gelinkt:
- Ein (leeres) Programm wird mit glCreateProgram () erzeugt. Das Ergebnis ist wieder ein Handle. Dieses benötigt man für die eigentliche Benutzung der Shader.
- Mit glAttachShader (<Program-Handle>, <Shader-Handle>) wird ein Shader zu dem Programm hinzugefügt.
- Nachdem man mindestens ein Vertex- und ein Fragment-Shader hinzugefügt hat, wird mit glLinkProgram (<Program-Handle>) das Programm gelinkt.
Wenn Fehler in den Shadern auftauchen, wird kein korrektes Programm erstellt, und nichts funktioniert. Die Fehlerbehandlung ist in OpenGL etwas aufwändig, deshalb im Praktikum besser die Framework-Funktionen benutzen.
Im Framework werden diese Schritte mit lglCompileGLSLProgram(<source>) für beide Shader vereinfacht.
Benutzen der Shader
- Ein gelinktes Programm kann mit glUseProgram (<Program-Handle>) aktiviert werden; ab sofort werden alle Vertices durch den Vertex-Shader, und nach der Rasterisierung die Fragmente durch den Fragment-Shader geschleust.
Mit glUseProgram (0) kann wieder die Fixed-Function-Pipeline aktiviert, d.h. die Shader deaktiviert werden.
← GLSL Basissyntax | ● | GLSL Anwendungsbeispiel →