Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung und Farben: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „200px<br><br> =Beleuchtung - Einfache Beleuchtung und Farben = == E…“)
 
(Die Seite wurde geleert.)
 
Zeile 1: Zeile 1:
[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung und Farben.png|200px]]<br><br>
 
=Beleuchtung - Einfache Beleuchtung und Farben =
 
== Einleitung ==
 
Bis jetzt hat sich die Scene im propartional des Ausgabe-fensters angepasst.<br>
 
Das hat zu Folge, das ein Kreis ovalig wird, wen das Fenster nicht quadratisch ist.<br>
 
Der Grund dafür ist, das die Ausgabe immer im Bereich von '''-1.0''' bis '''+1.0''' in der X und Y-Achse ist.<br>
 
<br>
 
Um dies zu umgehen, wird bei jeder Grössenänderung des Fenster die Frustum-Matrix neu angepasst.<br>
 
Entweder über '''TMatrix.Frustum(...''' oder noch einfacher wie im Beispiel mit '''Matrix.Perspective(...''' .<br>
 
Dies geschieht im '''OnResize'''-Ereigniss von '''TContext'''.<br>
 
<br>
 
Bei einer Orthogonalprojektion kann man dies mit <B<TMatrix.Ortho(...''' anpassen.<br>
 
<br><br>
 
Hier wird das OnResize-Ereigniss einer neuen Funktion zugeordnet.<br>
 
<syntaxhighlight lang="pascal">procedure TForm1.FormCreate(Sender: TObject);
 
begin
 
  ogc := TContext.Create(Self);
 
  ogc.OnPaint := @ogcDrawScene;
 
  ogc.OnResize := @ogcResize;  // neues Ereigniss</syntaxhighlight>
 
Hier wird bei einer Grössenänderung des Fenster die Perspektive angepasst.<br>
 
Dabei ist der zweite Parameter relevant.<br>
 
<syntaxhighlight lang="pascal">procedure TForm1.ogcResize(Sender: TObject);
 
begin
 
  FrustumMatrix.Perspective(45, ClientWidth / ClientHeight, 2.5, 1000.0);
 
end;</syntaxhighlight>
 
<br><br>
 
==Vertex-Shader:==
 
<syntaxhighlight lang="glsl">#version 330
 
  
#define PI 3.1415926535897932384626433832795
 
 
layout (location = 0) in vec3 inPos;    // Vertex-Koordinaten
 
layout (location = 1) in vec3 inColor;  // Farben
 
layout (location = 2) 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 winkel(vec3 p, vec3 q){
 
  vec3 r1 = normalize(p);
 
  vec3 r2 = normalize(q);
 
  return acos(dot(r1, r2));
 
}
 
 
void main(void)
 
{
 
  vec3 Normal = mat3(Matrix) * inNormal;
 
 
  float w = winkel(LightPos, Normal);
 
  float col = (w / PI);
 
 
  gl_Position = Matrix * vec4(inPos, 1.0);
 
  Color = (-1.0 + (vec4(col, col, col, 1.0))) + vec4(inColor, 0.0);
 
}
 
</syntaxhighlight>
 
<br><br>
 
==Fragment-Shader==
 
<syntaxhighlight lang="glsl">#version 330
 
 
in vec4 Color;      // interpolierte Farbe vom Vertexshader
 
out vec4 outColor;  // ausgegebene Farbe
 
 
void main(void)
 
{
 
  outColor = Color; // Die Ausgabe der Farbe
 
}
 
</syntaxhighlight>
 
 
<br>Autor: [[Mathias]]
 
== Siehe auch ==
 
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]
 

Aktuelle Version vom 21. Dezember 2017, 00:13 Uhr