Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport): Unterschied zwischen den Versionen
(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 | + | 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
Inhaltsverzeichnis
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
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial