Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen

Aus DGL Wiki
Wechseln zu: Navigation, Suche

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

Beleuchtung - Mehrere Directional Light Quellen

Einleitung

Wie schon beschrieben, sind auch mehrere Lichtquellen möglich.

In diesem Beispiel gib es 3 Directionale Lichtquellen, welche sich bewegen.
Das man dies besser sieht sind sie in 3 Farben dargestellt.

Die Meshes besteht aus Kugeln, so sieht man die Übergänge von hell nach dunkel besser.

Das man die Lichteffekte besser sieht, kann man sie übers Menü ein und aus Schalten.
Auch kann man die Rotierung anhalten und die Anzahl Kugeln verändern.

Wen man nur eine Kugel hat, sieht man die Bewegung des Lichtes sehr gut.

Wen man alle 3 Lichter ausschaltet, dann sieht man die Ambiente Hintergrund-Beleuchtung sehr gut.




Hier sieht man, das anstelle von arcos und Pi, clamp verwendet wurde.

Vertex-Shader:

#version 330

#define ambient vec3(0.2, 0.2, 0.2)
#define red     vec3(1.0, 0.0, 0.0)
#define green   vec3(0.0, 1.0, 0.0)
#define blue    vec3(0.0, 0.0, 1.0)

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.

uniform bool RedOn;
uniform bool GreenOn;
uniform bool BlueOn;

uniform vec3 RedLightPos;
uniform vec3 GreenLightPos;
uniform vec3 BlueLightPos;

float light(vec3 p, vec3 n) {
  vec3 v1 = normalize(p);     // Vektoren normalisieren, so das die Länge des Vektors immer 1.0 ist.
  vec3 v2 = normalize(n);
  float d = dot(v1, v2);      // Skalarprodukt aus beiden Vektoren berechnen.
  return clamp(d, 0.0, 1.0);
}

void main(void)
{
  gl_Position = Matrix * vec4(inPos, 1.0);

  vec3 Normal = mat3(Matrix) * inNormal;

  vec3 colRed   = light(RedLightPos,   Normal) * red;
  vec3 colGreen = light(GreenLightPos, Normal) * green;
  vec3 colBlue  = light(BlueLightPos,  Normal) * blue;

  Color = vec4(ambient, 1.0);
  if (RedOn) {
    Color.rgb += colRed;
  }
  if (GreenOn) {
    Color.rgb += colGreen;
  }
  if (BlueOn) {
    Color.rgb += colBlue;
  }
}



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