Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport): Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „200px<br><br> =3D - Betrachtungs - Fenster (Viewport) = == Einleitung == B…“)
 
(Einleitung)
Zeile 2: Zeile 2:
 
=3D - Betrachtungs - Fenster (Viewport) =
 
=3D - Betrachtungs - Fenster (Viewport) =
 
== Einleitung ==
 
== Einleitung ==
Bis jetzt hat sich die Scene im propartional des Ausgabe-fensters angepasst.<br>
+
Bis jetzt hat sich die Scene im proportional des Ausgabe-fensters angepasst.<br>
 
Das hat zu Folge, das ein Kreis ovalig wird, wen das Fenster nicht quadratisch ist.<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>
 
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>
Zeile 25: Zeile 25:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
 
<br><br>
 
<br><br>
 +
 
==Vertex-Shader:==
 
==Vertex-Shader:==
 
<syntaxhighlight lang="glsl">#version 330
 
<syntaxhighlight lang="glsl">#version 330

Version vom 20. Dezember 2017, 18:50 Uhr

Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png

3D - Betrachtungs - Fenster (Viewport)

Einleitung

Bis jetzt hat sich die Scene im proportional des Ausgabe-fensters angepasst.
Das hat zu Folge, das ein Kreis ovalig wird, wen das Fenster nicht quadratisch ist.
Der Grund dafür ist, das die Ausgabe immer im Bereich von -1.0 bis +1.0 in der X und Y-Achse ist.

Um dies zu umgehen, wird bei jeder Grössenänderung des Fenster die Frustum-Matrix neu angepasst.
Entweder über TMatrix.Frustum(... oder noch einfacher wie im Beispiel mit Matrix.Perspective(... .
Dies geschieht im OnResize-Ereigniss von TContext.

Bei einer Orthogonalprojektion kann man dies mit <B<TMatrix.Ortho(... anpassen.


Hier wird das OnResize-Ereigniss einer neuen Funktion zugeordnet.

procedure TForm1.FormCreate(Sender: TObject);
begin
  ogc := TContext.Create(Self);
  ogc.OnPaint := @ogcDrawScene;
  ogc.OnResize := @ogcResize;   // neues Ereigniss

Hier wird bei einer Grössenänderung des Fenster die Perspektive angepasst.
Dabei ist der zweite Parameter relevant.

procedure TForm1.ogcResize(Sender: TObject);
begin
  FrustumMatrix.Perspective(45, ClientWidth / ClientHeight, 2.5, 1000.0);
end;



Vertex-Shader:

#version 330

layout (location = 10) in vec3 inPos; // Vertex-Koordinaten
layout (location = 11) in vec3 inCol; // Farbe

out vec4 Color;                       // Farbe, an Fragment-Shader übergeben.

uniform mat4 Matrix;                  // Matrix für die Drehbewegung und Frustum.

void main(void)
{
  gl_Position = Matrix * vec4(inPos, 1.0);
  Color = vec4(inCol, 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