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;
}
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
}
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);
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 BufferGL_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);
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();
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 →