Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
Zeile 1: Zeile 1:
[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung mit Clamp.png|200px]]<br><br>
+
[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|200px]]<br><br>
=Beleuchtung - Einfache Beleuchtung mit Clamp =
+
=Beleuchtung - Directional Light =
 
== Einleitung ==
 
== Einleitung ==
 +
Das Directional-Light entspricht in etwa dem Sonnen-Licht, die Lichtstrahlen kommen alle von der gleichen Richtung.<br>
 +
Im Beispiel hier von Rechts.<br>
 +
<br>
 
Im ersten Beispiel wurde die Beleuchung mit Acos und Pi berechnet.<br>
 
Im ersten Beispiel wurde die Beleuchung mit Acos und Pi berechnet.<br>
 
Dieser Umweg kann man sich sparen, es gibt zwar so ein kleiner Rechnungsfehler, aber diesen kann man getrost ingnorieren.<br>
 
Dieser Umweg kann man sich sparen, es gibt zwar so ein kleiner Rechnungsfehler, aber diesen kann man getrost ingnorieren.<br>
Zeile 7: Zeile 10:
 
Als was flacher als 90° ist, ist negativ.<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>
 
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>
+
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. Auch der Hintergrund wurde etwas dunkler gemacht, das man den Licht-Effekt besser sieht.<br>
 
<br><br>
 
<br><br>
 
<br><br>
 
<br><br>
Zeile 23: Zeile 26:
 
uniform mat4 Matrix;                    // Matrix für die Drehbewegung und Frustum.
 
uniform mat4 Matrix;                    // Matrix für die Drehbewegung und Frustum.
  
vec3 LightPos = vec3(1.0, 0.0, 0.0);
+
vec3 LightPos = vec3(1.0, 0.0, 0.0);   // Das Licht kommt von Rechts.
  
float light(vec3 p, vec3 q){
+
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,
  vec3  r2 = normalize(q);
+
  vec3  r2 = normalize(q);      // so das die Länge des Vektors immer 1.0 ist.
   float d  = dot(r1, r2);     // Skalarprodukt aus beiden Vektoren berechnen.
+
   float d  = dot(r1, r2);       // Skalarprodukt aus beiden Vektoren berechnen.
   return clamp(d, 0.0, 1.0);
+
   float c  = clamp(d, 0.0, 1.0); // Alles > 1.0 und < 0.0, wird zwischen 0.0 und 1.0 gesetzt.
 +
  return c;                      // Lichtstäke als Rückgabewert.
 
}
 
}
  
void main(void)
+
void main(void) {
{
 
 
   vec3 Normal = mat3(Matrix) * inNormal;
 
   vec3 Normal = mat3(Matrix) * inNormal;
  
Zeile 43: Zeile 46:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
<br><br>
 
<br><br>
 
 
==Fragment-Shader==
 
==Fragment-Shader==
 
<syntaxhighlight lang="glsl">#version 330
 
<syntaxhighlight lang="glsl">#version 330

Version vom 5. Januar 2018, 21:37 Uhr

Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png

Beleuchtung - Directional Light

Einleitung

Das Directional-Light entspricht in etwa dem Sonnen-Licht, die Lichtstrahlen kommen alle von der gleichen Richtung.
Im Beispiel hier von Rechts.

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. Auch der Hintergrund wurde etwas dunkler gemacht, das man den Licht-Effekt besser sieht.




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);    // Das Licht kommt von Rechts.

float light(vec3 p, vec3 q) {
  vec3  r1 = normalize(p);       // Vektoren normalisieren,
  vec3  r2 = normalize(q);       // so das die Länge des Vektors immer 1.0 ist.
  float d  = dot(r1, r2);        // Skalarprodukt aus beiden Vektoren berechnen.
  float c  = clamp(d, 0.0, 1.0); // Alles > 1.0 und < 0.0, wird zwischen 0.0 und 1.0 gesetzt.
  return c;                      // Lichtstäke als Rückgabewert.
}

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, 1.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