Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light: Unterschied zwischen den Versionen
Aus DGL Wiki
(→Vertex-Shader:) |
|||
Zeile 2: | Zeile 2: | ||
=Beleuchtung - Einfache Beleuchtung mit Clamp = | =Beleuchtung - Einfache Beleuchtung mit Clamp = | ||
== Einleitung == | == Einleitung == | ||
− | + | Im ersten Beispiel wurde die Beleuchung mit Acos und Pi berechnet.<br> | |
− | + | Für dies gibt es in GLSL eine fertige Funktion '''clamp'''.<br> | |
− | + | Auserdem wird mit '''clamp''' berücksichtig, wen der Einstrahlwinkel < 0° ist, das dann kein Liche auf das Objekt kommt.<br> | |
<br> | <br> | ||
− | + | Der einzige Unterschied zu vorherigem Beispiel ist im Shader-Code.<br> | |
− | |||
− | |||
− | |||
<br><br> | <br><br> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<br><br> | <br><br> | ||
− | + | Hier sieht man, das anstelle von arcos und Pi, '''clamp''' verwendet wurde.<br> | |
− | |||
− | |||
==Vertex-Shader:== | ==Vertex-Shader:== | ||
− | |||
− | |||
<syntaxhighlight lang="glsl">#version 330 | <syntaxhighlight lang="glsl">#version 330 | ||
− | |||
− | |||
layout (location = 0) in vec3 inPos; // Vertex-Koordinaten | layout (location = 0) in vec3 inPos; // Vertex-Koordinaten | ||
Zeile 77: | Zeile 22: | ||
vec3 LightPos = vec3(1.0, 0.0, 0.0); | vec3 LightPos = vec3(1.0, 0.0, 0.0); | ||
− | float | + | float angeleClamp(vec3 p, vec3 q){ |
vec3 r1 = normalize(p); // Vektoren normalisieren, so das die Länge des Vektors immer 1.0 ist. | vec3 r1 = normalize(p); // Vektoren normalisieren, so das die Länge des Vektors immer 1.0 ist. | ||
vec3 r2 = normalize(q); | vec3 r2 = normalize(q); | ||
Zeile 88: | Zeile 33: | ||
vec3 Normal = mat3(Matrix) * inNormal; | vec3 Normal = mat3(Matrix) * inNormal; | ||
− | float col = | + | float col = angeleClamp(LightPos, Normal); |
gl_Position = Matrix * vec4(inPos, 1.0); | gl_Position = Matrix * vec4(inPos, 1.0); | ||
Zeile 95: | Zeile 40: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
− | |||
==Fragment-Shader== | ==Fragment-Shader== | ||
<syntaxhighlight lang="glsl">#version 330 | <syntaxhighlight lang="glsl">#version 330 |
Version vom 21. Dezember 2017, 00:12 Uhr
Inhaltsverzeichnis
Beleuchtung - Einfache Beleuchtung mit Clamp
Einleitung
Im ersten Beispiel wurde die Beleuchung mit Acos und Pi berechnet.
Für dies gibt es in GLSL eine fertige Funktion clamp.
Auserdem wird mit clamp berücksichtig, wen der Einstrahlwinkel < 0° ist, das dann kein Liche auf das Objekt kommt.
Der einzige Unterschied zu vorherigem Beispiel ist im Shader-Code.
Hier sieht man, das anstelle von arcos und Pi, clamp verwendet wurde.
Vertex-Shader:
#version 330
layout (location = 0) in vec3 inPos; // Vertex-Koordinaten
layout (location = 1) in vec3 inNormal; // Normale
out vec4 Color; // Farbe, an Fragment-Shader übergeben.
uniform mat4 Matrix; // Matrix für die Drehbewegung und Frustum.
vec3 LightPos = vec3(1.0, 0.0, 0.0);
float angeleClamp(vec3 p, vec3 q){
vec3 r1 = normalize(p); // Vektoren normalisieren, so das die Länge des Vektors immer 1.0 ist.
vec3 r2 = normalize(q);
float d = dot(r1, r2); // Skalarprodukt aus beiden Vektoren berechnen.
return clamp(d, 0.0, 1.0);
}
void main(void)
{
vec3 Normal = mat3(Matrix) * inNormal;
float col = angeleClamp(LightPos, Normal);
gl_Position = Matrix * vec4(inPos, 1.0);
Color = vec4(col, col, col, 0.0);
}
Fragment-Shader
#version 330
in vec4 Color; // interpolierte Farbe vom Vertexshader
out vec4 outColor; // ausgegebene Farbe
void main(void)
{
outColor = Color; // Die Ausgabe der Farbe
}
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial