Grundlagen OpenGL Shading Language

Einführung: Wie läuft ein GPU Programm ab ?

Speicherlayout CPU – GPU [20]
  • Texturen werden an die Grafikkarte gesendet.
  • Vertex Daten (Position, Normalen, Farbe etc.) werden übermittelt.
  • Der Vertex Shader, den wir programmieren können, erhält diese Daten. Dort können wir z.B. Vertices von Objektkoordinaten in Welt-Koordinaten transformieren.
  • Der Fragment Shader, den wir auch programmieren können, berechnet Farbwerte jedes Pixels der Dreiecke. Wie die Farbwerte berechnet werden, ist uns überlassen!
    Zu jedem Vertex Shader (Geometrie der Ecken) gehört ein entsprechender Fragment Shader (Farbe pro Pixel).

Aufgaben Vertex Shader

Kontrolle über die Position von Vertices Benutzerdefiniertes Lighting (per Vertex) Benutzerdefiniertes Skinning/Blending Beliebige Vertexberechnung (z.B. Fischauge) Beschleuningung komplexer Vertex Operationen, Partikelsysteme.

Aufgaben Fragment Shader

Farbe pro Pixel berechnen Texturierung Benutzerdefiniertes Lighting (per Fragment) Nebel u.v.m.

Minimales Vertex Programm

Eingabe: Beliebige Vertex Attribute, ev. «globale» Variablen
Ausgabe: Transformierte Vertex Attribute:

  • erforderlich: Position in Clip Koordinaten (homogen)
  • Farbe (front/back, primary/secondary)
  • Fog Koordinaten
  • Textur Koordinaten
  • Point Size

Ein Vertex Programm kann keine Vertices generieren oder zerstören!

Standardmässig sind keine topologischen Informationen vorhanden! (Kanten, Nachbar…)

Beispiel: Minimales Vertex Programm GLSL
Ein Vertex wird von Objekt Koordinaten in Clip Koordinaten transformiert.

void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Minimales Fragment Programm

Eingabe: Interpolierte Daten vom Vertex Shader, ev. «globale» Variablen
Ausgabe: Farbwert Pixel

Beispiel: Minimales Fragment Programm GLSL
Jeder Pixel wird rot.

void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
×