Computergrafik

Einfache Standard-Codesequenz

Interpolierte Parameter | | Native Standard-Codesequenz

Mit dem LGL-Framework kann man einen GLSL Shader wie folgt einsetzen (die Funktionalität kann natürlich verändert werden, wofür die Variablennamen usw. angepasst werden müssen):

Shader

  • Simpler Vertex-Shader
#version 120
uniform   mat4  mvp;                 // Standard: ModelViewProjection-Matrix
uniform   float scale;               // Nicht Standard: uniformer Scalierungsparameter
attribute vec4  vertex_position;     // Standard: der übergebene Vertex
attribute vec4  vertex_color;        // Standard: das Per-Vertex Attribut für die Farbe
varying   vec4  frag_color;          // Um Farbe an Fragment-Shader zu übergeben
void main ()
{
  gl_Position = mvp * (vertex_position * scale);
  frag_color  = vertex_color;
}
  • Simpler Fragment-Shader
#version 120
varying   vec4 frag_color;           // Um Farbe vom Vertex-Shader zu bekommen (exakt gleich!)
void main ()
{
  gl_FragColor = frag_color;         // Baryzentrisch interpolate Farbe
  //gl_FragColor = vec4(1, 1, 0, 1); // Alternative: Farbe Gelb
}

Global

Variablen anlegen für:

  • GLSL Shader-Programm ( GLuint program; )
  • Uniforme GLSL Parameter ( GLfloat scale )

Init-Funktion

1) Erzeugen des Shader-Programms

  • Aus String-Variablen shader:
unsigned char shader[] = ""; // default program
program = lglCompileGLSLProgram(shader);
  • Zusätzlich: Editor Fenster erstellen:
create_lgl_Qt_ShaderEditor("shader", &program);

2) Uniforme GLSL Parameter setzen

  • via lglUniform (mit i, f oder fv suffix)
lglUniformf("scale", 1.0f);

3) Weitere Initialisierungen

  • Löschfarbe für glClear()
glClearColor(0.0, 0.0, 0.0, 0.0);
  • Tiefen-Test (Z-Buffer) einschalten
glEnable(GL_DEPTH_TEST);

Render-Funktion

1) Bildschirm löschen

  • Für RGB-Buffer GL_COLOR_BUFFER_BIT und für Z Buffer GL_DEPTH_BUFFER_BIT:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

2) GLSL Shader-Programm aktivieren

lglUseProgramm(program, false); // false -> do not clear already set uniforms

3) Optional: weitere uniforme Parameter setzen

4) Auch die MVP nicht vergessen:

lglProjection(P);
lglModelView(MV);

5) Endlich: Dreiecke zeichnen

  • Beispielhaft ein Dreicke mit Farbattributen
lglBegin(LGL_TRIANGLES);
  lglColor  (1, 0, 0);
  lglVertex (0, 0, 0);
  lglColor  (0, 1, 0);
  lglVertex (1, 0, 0);
  lglColor  (0, 0, 1);
  lglVertex (1, 1, 0);
lglEnd();
  • Alternativ: VBO oder Standard-Geometrie zeichnen
lglRender(cube);


Interpolierte Parameter | | Native Standard-Codesequenz

Options: