Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light: Unterschied zwischen den Versionen
Aus DGL Wiki
Zeile 3: | Zeile 3: | ||
== Einleitung == | == Einleitung == | ||
Im ersten Beispiel wurde die Beleuchung mit Acos und Pi berechnet.<br> | Im ersten Beispiel wurde die Beleuchung mit Acos und Pi berechnet.<br> | ||
− | Für dies gibt es in GLSL eine fertige Funktion '''clamp'''.<br> | + | Dieser Umweg kann man sich sparen, es gibt zwar so ein kleiner Rechnungsfehler, aber diesen kann man getrost ingnorieren.<br> |
− | + | Dies hat sogar den Vorteil, wen der Einstrahlwinkel des Lichtes flacher als 90° ist, ist die Beleuchtungsstärke gleich null.<br> | |
+ | Als was flacher als 90° ist, ist negativ.<br> | ||
+ | Für dies gibt es in GLSL eine fertige Funktion '''clamp''', mit der kann man einen Bereich festlegen.<br> | ||
+ | So das es in diesem Beispiel keinen Wert < 0.0 oder > 1.0 gibt.<br> | ||
<br> | <br> | ||
Der einzige Unterschied zu vorherigem Beispiel ist im Shader-Code.<br> | Der einzige Unterschied zu vorherigem Beispiel ist im Shader-Code.<br> | ||
Zeile 22: | Zeile 25: | ||
vec3 LightPos = vec3(1.0, 0.0, 0.0); | vec3 LightPos = vec3(1.0, 0.0, 0.0); | ||
− | float | + | float light(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 33: | Zeile 36: | ||
vec3 Normal = mat3(Matrix) * inNormal; | vec3 Normal = mat3(Matrix) * inNormal; | ||
− | float col = | + | float col = light(LightPos, Normal); |
gl_Position = Matrix * vec4(inPos, 1.0); | gl_Position = Matrix * vec4(inPos, 1.0); |
Version vom 27. Dezember 2017, 19:35 Uhr
Inhaltsverzeichnis
Beleuchtung - Einfache Beleuchtung mit Clamp
Einleitung
Im ersten Beispiel wurde die Beleuchung mit Acos und Pi berechnet.
Dieser Umweg kann man sich sparen, es gibt zwar so ein kleiner Rechnungsfehler, aber diesen kann man getrost ingnorieren.
Dies hat sogar den Vorteil, wen der Einstrahlwinkel des Lichtes flacher als 90° ist, ist die Beleuchtungsstärke gleich null.
Als was flacher als 90° ist, ist negativ.
Für dies gibt es in GLSL eine fertige Funktion clamp, mit der kann man einen Bereich festlegen.
So das es in diesem Beispiel keinen Wert < 0.0 oder > 1.0 gibt.
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 light(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 = light(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