|
|
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]]
| |