<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://wiki.delphigl.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mathias</id>
		<title>DGL Wiki - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.delphigl.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mathias"/>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php/Spezial:Beitr%C3%A4ge/Mathias"/>
		<updated>2026-05-30T11:41:27Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Einrichten_und_Einstieg_-_Lazarus_fuer_OpenGL_einrichten&amp;diff=27063</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Einrichten_und_Einstieg_-_Lazarus_fuer_OpenGL_einrichten&amp;diff=27063"/>
				<updated>2024-11-21T16:21:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Einrichten und Einstieg - Lazarus fuer OpenGL einrichten =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
'''Vorwort:'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''OpenGL 3.3''' scheint auf den ersten Blick viel komplizierter als das alte OpenGL.&amp;lt;br&amp;gt;&lt;br /&gt;
Man wird von Anfang an mit vielem Neuen konfrontiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Früher konnte man einfach&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;glBegin(...&lt;br /&gt;
..&lt;br /&gt;
glEnd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und fertig.&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt muss man sich mit Shadern und Vertex-Buffern auseinandersetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch muss man sich selbst um die Matrizen und die Beleuchtung kümmern.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Aber dafür ist die Belohnung sehr gross, man ist sehr flexibel und man kann (fast) alles machen, was Effekte anbelangt.&amp;lt;br&amp;gt;&lt;br /&gt;
Früher war man einfach auf die Fixed-Function-Pipeline der Grafikkarte angewiesen und jede war etwas anders.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn eine Karte nur zwei Lichter hatte, dann hatte sie nur zwei.&amp;lt;br&amp;gt;&lt;br /&gt;
Da man es aber jetzt selbst macht, kann man fast beliebig viel machen, egal ob diffus, etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ich hoffe, mit diesem Tutorial wird der eine oder andere für OpenGL 3.3 begeistert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn man diesen Einstieg mal geschafft hat, wird man auch mit den höheren Versionen klarkommen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Auf der Hauptseite werde ich noch ein Package veröffentlichen, welches einem den Einstieg sehr einfach macht.&amp;lt;br&amp;gt;&lt;br /&gt;
Dort sind fertige Shader und Units für Matrizen, Texturen, Vertex-Puffer, etc. vorhanden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Voraussetzung:'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* FPC '''3.3.0''' oder höher.&amp;lt;br&amp;gt;&lt;br /&gt;
* Lazarus '''3.4''' oder höher.&amp;lt;br&amp;gt;&lt;br /&gt;
* Mindestens OpenGL 3.3 fähige Grafikkarte.&amp;lt;br&amp;gt;&lt;br /&gt;
* Grundkenntnisse mit FPC und Lazarus.&amp;lt;br&amp;gt;&lt;br /&gt;
* Grundkenntnisse C/C++ für die Shader-Programmierung.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wen die Grafikkarte zu alt ist, gibt es trotzdem eine Lösung. Mit Mesa ab 17.1 ist es möglich im Software-Renderer OpenGL zu emulieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist gähnend langsam, aber für die ersten Gehversuche im Tutorial reicht dies. ( Getestet mit Linux Mint 64Bit 18.x )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Installation:'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
FPC und Lazarus installieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Lazarus muss unter &amp;lt;i&amp;gt;'''&amp;quot;Package --&amp;gt; Installierte Packages einrichten... --&amp;gt; Verfügbar für Installation&amp;quot;'''&amp;lt;/i&amp;gt;, zuerst das Package &amp;lt;i&amp;gt;'''LazOpenGLContext x.x.x'''&amp;lt;/i&amp;gt; installiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Das Tutorial sollte unter Linux und Windows laufen, auf dem Mac habe ich es nicht probiert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn Lazarus bei der Neukompilierung unter Linux Probleme macht, könnte Folgendes das Problem sein:&amp;lt;br&amp;gt;&lt;br /&gt;
Unter auf Debian oder Ubuntu basierenden Linux-Distributionen muss evtl. noch Folgendes installiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;sudo apt-get install freeglut3-dev&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Somit sollten alle Beispiele kompilierbar sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die Sourcen zum Tutorial, kann man alle auf der Hauptseite herunterladen.&amp;lt;br&amp;gt;&lt;br /&gt;
Es ist eine Zip, welche auch alle Bibliotheken (Units) enthält.&amp;lt;br&amp;gt;&lt;br /&gt;
Ich habe eine Package Namens '''ogl_package.lpk''' mit den benötigten Dateien erstellt, sie befindet sich im gleiche Ordner wie die '''Units'''.  Ich empfehle es, die Package zu installieren,&amp;lt;br&amp;gt;&lt;br /&gt;
obwohl man auch in den Projekte den Unit-Pfad anpassen kann, nur muss man dann in allen Projekten die Pfade anpassen, wen man mal die Package verschiebt/umbenennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Für die ogl-Package ist noch Package BRGABitmap erforderlich, diese lässt sich bequem über &amp;lt;i&amp;gt;'''&amp;quot;Package --&amp;gt; Online-Package-Manger --&amp;gt; BGRABitmap&amp;quot;'''&amp;lt;/i&amp;gt; installieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die wichtigsten Funktionen der ogl-Package:&amp;lt;br&amp;gt;&lt;br /&gt;
* '''dglOpenGL''': Der Header für die OpenGL-Funktionen.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglContex''': Erzeugt einen Zeichencontext, ohne diesem ist keine OpenGL-Ausgabe möglich.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglShader''': Enthält Funktionen um den Shader-Code in die Grafikkarte zu laden.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglVertex''': Verschiedene Vertex-Deklarationen und Funktionen/Berechnungen.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglMatrix''': Verschiedene Matrix-Deklarationen und Funktionen/Berechnungen.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglTextur''': Funktionen für das Hochladen von Texturen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Es sind viele OpenGL spezifische Sachen ausserhalb von Form deklariert, bei einer sauberen objektorientierten Programmierung ist dies nicht üblich.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier wurde es einfachheitshalber der Übersichtlichkeit gemacht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wen man weis, wie man mit '''Delphi''' einen OpenGL-Context erzeugt, sollte dieses Tutorial auch mit Delphi funktionieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn Fehler gefunden werden, dann bitte hier melden:&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://delphigl.com/forum/viewtopic.php?f=14&amp;amp;t=11566  DGL-Forum]&lt;br /&gt;
oder&amp;lt;br&amp;gt;&lt;br /&gt;
* [http://www.lazarusforum.de/viewtopic.php?f=29&amp;amp;t=11373&amp;amp;hilit=opengl+tutorial  Lazarus-Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Einrichten_und_Einstieg_-_Lazarus_fuer_OpenGL_einrichten&amp;diff=27062</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Einrichten_und_Einstieg_-_Lazarus_fuer_OpenGL_einrichten&amp;diff=27062"/>
				<updated>2024-11-21T16:20:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einrichten und Einstieg - Lazarus fuer OpenGL einrichten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Einrichten und Einstieg - Lazarus fuer OpenGL einrichten =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
'''Vorwort:'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''OpenGL 3.3''' scheint auf den ersten Blick viel komplizierter als das alte OpenGL.&amp;lt;br&amp;gt;&lt;br /&gt;
Man wird von Anfang an mit vielem Neuen konfrontiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Früher konnte man einfach&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;glBegin(...&lt;br /&gt;
..&lt;br /&gt;
glEnd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und fertig.&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt muss man sich mit Shadern und Vertex-Buffern auseinandersetzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch muss man sich selbst um die Matrizen und die Beleuchtung kümmern.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Aber dafür ist die Belohnung sehr gross, man ist sehr flexibel und man kann (fast) alles machen, was Effekte anbelangt.&amp;lt;br&amp;gt;&lt;br /&gt;
Früher war man einfach auf die Fixed-Function-Pipeline der Grafikkarte angewiesen und jede war etwas anders.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn eine Karte nur zwei Lichter hatte, dann hatte sie nur zwei.&amp;lt;br&amp;gt;&lt;br /&gt;
Da man es aber jetzt selbst macht, kann man fast beliebig viel machen, egal ob diffus, etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ich hoffe, mit diesem Tutorial wird der eine oder andere für OpenGL 3.3 begeistert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn man diesen Einstieg mal geschafft hat, wird man auch mit den höheren Versionen klarkommen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Auf der Hauptseite werde ich noch ein Package veröffentlichen, welches einem den Einstieg sehr einfach macht.&amp;lt;br&amp;gt;&lt;br /&gt;
Dort sind fertige Shader und Units für Matrizen, Texturen, Vertex-Puffer, etc. vorhanden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Voraussetzung:'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* FPC 3.3.0 oder höher.&amp;lt;br&amp;gt;&lt;br /&gt;
* Lazarus 3.4 oder höher.&amp;lt;br&amp;gt;&lt;br /&gt;
* Mindestens OpenGL 3.3 fähige Grafikkarte.&amp;lt;br&amp;gt;&lt;br /&gt;
* Grundkenntnisse mit FPC und Lazarus.&amp;lt;br&amp;gt;&lt;br /&gt;
* Grundkenntnisse C/C++ für die Shader-Programmierung.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wen die Grafikkarte zu alt ist, gibt es trotzdem eine Lösung. Mit Mesa ab 17.1 ist es möglich im Software-Renderer OpenGL zu emulieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist gähnend langsam, aber für die ersten Gehversuche im Tutorial reicht dies. ( Getestet mit Linux Mint 64Bit 18.x )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Installation:'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
FPC und Lazarus installieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Lazarus muss unter &amp;lt;i&amp;gt;'''&amp;quot;Package --&amp;gt; Installierte Packages einrichten... --&amp;gt; Verfügbar für Installation&amp;quot;'''&amp;lt;/i&amp;gt;, zuerst das Package &amp;lt;i&amp;gt;'''LazOpenGLContext x.x.x'''&amp;lt;/i&amp;gt; installiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Das Tutorial sollte unter Linux und Windows laufen, auf dem Mac habe ich es nicht probiert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn Lazarus bei der Neukompilierung unter Linux Probleme macht, könnte Folgendes das Problem sein:&amp;lt;br&amp;gt;&lt;br /&gt;
Unter auf Debian oder Ubuntu basierenden Linux-Distributionen muss evtl. noch Folgendes installiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;sudo apt-get install freeglut3-dev&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Somit sollten alle Beispiele kompilierbar sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die Sourcen zum Tutorial, kann man alle auf der Hauptseite herunterladen.&amp;lt;br&amp;gt;&lt;br /&gt;
Es ist eine Zip, welche auch alle Bibliotheken (Units) enthält.&amp;lt;br&amp;gt;&lt;br /&gt;
Ich habe eine Package Namens '''ogl_package.lpk''' mit den benötigten Dateien erstellt, sie befindet sich im gleiche Ordner wie die '''Units'''.  Ich empfehle es, die Package zu installieren,&amp;lt;br&amp;gt;&lt;br /&gt;
obwohl man auch in den Projekte den Unit-Pfad anpassen kann, nur muss man dann in allen Projekten die Pfade anpassen, wen man mal die Package verschiebt/umbenennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Für die ogl-Package ist noch Package BRGABitmap erforderlich, diese lässt sich bequem über &amp;lt;i&amp;gt;'''&amp;quot;Package --&amp;gt; Online-Package-Manger --&amp;gt; BGRABitmap&amp;quot;'''&amp;lt;/i&amp;gt; installieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die wichtigsten Funktionen der ogl-Package:&amp;lt;br&amp;gt;&lt;br /&gt;
* '''dglOpenGL''': Der Header für die OpenGL-Funktionen.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglContex''': Erzeugt einen Zeichencontext, ohne diesem ist keine OpenGL-Ausgabe möglich.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglShader''': Enthält Funktionen um den Shader-Code in die Grafikkarte zu laden.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglVertex''': Verschiedene Vertex-Deklarationen und Funktionen/Berechnungen.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglMatrix''': Verschiedene Matrix-Deklarationen und Funktionen/Berechnungen.&amp;lt;br&amp;gt;&lt;br /&gt;
* '''oglTextur''': Funktionen für das Hochladen von Texturen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Es sind viele OpenGL spezifische Sachen ausserhalb von Form deklariert, bei einer sauberen objektorientierten Programmierung ist dies nicht üblich.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier wurde es einfachheitshalber der Übersichtlichkeit gemacht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wen man weis, wie man mit '''Delphi''' einen OpenGL-Context erzeugt, sollte dieses Tutorial auch mit Delphi funktionieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn Fehler gefunden werden, dann bitte hier melden:&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://delphigl.com/forum/viewtopic.php?f=14&amp;amp;t=11566  DGL-Forum]&lt;br /&gt;
oder&amp;lt;br&amp;gt;&lt;br /&gt;
* [http://www.lazarusforum.de/viewtopic.php?f=29&amp;amp;t=11373&amp;amp;hilit=opengl+tutorial  Lazarus-Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glCullFace&amp;diff=27061</id>
		<title>glCullFace</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glCullFace&amp;diff=27061"/>
				<updated>2023-10-27T17:10:12Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Parameter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glCullFace =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glCullFace''' - legt fest welche Flächen mittels [[Backface Culling]] vom Zeichnen ausgeschlossen werden sollen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glCullFace'''(''mode'': TGLenum);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;''mode''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Legt fest, welche Flächen &amp;lt;b&amp;gt;nicht&amp;lt;/b&amp;gt; gezeichnet werden sollen. &amp;lt;br&amp;gt;&lt;br /&gt;
Zur Auswahl stehen 2 Konstanten: &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_FRONT''' - Vorderseiten werden nicht gezeichnet &amp;lt;br&amp;gt;&lt;br /&gt;
'''GL_BACK'''  - Rückseiten werden nicht gezeichnet (Vorgabewert)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
[[Bild:GlCullFace.jpg|right|framed|2 identische Würfel. Einziger Unterschied: Der rote Würfel wurde mit GL_BACK, der grüne mit GL_FRONT gerendert.]]&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion '''glCullFace''' können Sie einstellen, welche Seite einer Flächen bei aktivierten Backface Culling vom Zeichnen ausgeschlossen werden sollen.  &lt;br /&gt;
&lt;br /&gt;
Als Flächen zählen Dreiecke, Vierecke, Polygone und Rechtecke. &lt;br /&gt;
&lt;br /&gt;
Welche Seite einer Fläche die Vorder- bzw. Rückseite ist, wird mittels [[glFrontFace]] festgelegt.&lt;br /&gt;
&lt;br /&gt;
Culling wird mittels [[glEnable]] aktiviert bzw. mit [[glDisable]] deaktiviert. &lt;br /&gt;
&lt;br /&gt;
Der dazu benötigte Parameter lautet '''GL_CULL_FACE'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Sollten, durch die Aktivierung des Cullings Flächen verschwinden, die eigentlich sichtbar sein sollten, haben Sie die Punkte der Fläche in der falschen Reihenfolge übergeben.&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen dazu bei [[glFrontFace]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert, wenn '''mode''' ein ungültiger Wert übergeben wurde.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glCullFace''' in einem [[glBegin]]-[[glEnd]]-Block aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]] mit Token [[glGet#GL_CULL_FACE_MODE|GL_CULL_FACE_MODE]]&lt;br /&gt;
&lt;br /&gt;
[[glIsEnabled]] mit Token [[glIsEnabled#GL_CULL_FACE|GL_CULL_FACE]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
Hintergrundwissen: [[Backface Culling]]&lt;br /&gt;
&lt;br /&gt;
[[glEnable]], [[glFrontFace]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|CullFace]]&lt;br /&gt;
 [[Kategorie:GL1.0|CullFace]]&lt;br /&gt;
[[Kategorie:GL3|CullFace]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Framepuffer_-_In_Textur_rendern&amp;diff=27060</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Framepuffer_-_In_Textur_rendern&amp;diff=27060"/>
				<updated>2023-08-29T15:17:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Framepuffer - In Textur rendern =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Eine Scene kann man auch in eine Textur rendern, anstelle des Bildschirmes.&amp;lt;br&amp;gt;&lt;br /&gt;
Man kann dies auch gebrauchen, wen man eine Scene bei einem Autorennen in einen Rückspiegel rendern will.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deklaration der Vertexkonstanten des Quadrates, welches in die Textur gerendert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Es ist ein Quadrat mit 4 verschieden farbigen Ecken.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
&lt;br /&gt;
  // --- Vectoren&lt;br /&gt;
  QuadVertex: array[0..1] of Tmat3x3 =&lt;br /&gt;
    (((-0.3, 0.3, 0.0), (-0.3, -0.3, 0.0), (0.3, -0.3, 0.0)), ((-0.3, 0.3, 0.0), (0.3, -0.3, 0.0), (0.3, 0.3, 0.0)));&lt;br /&gt;
&lt;br /&gt;
  // --- Farben&lt;br /&gt;
  QuadColor: array[0..1] of Tmat3x3 =&lt;br /&gt;
    (((0.0, 2.0, 0.5), (0.0, 0.0, 0.5), (2.0, 0.0, 0.5)), ((0.0, 2.0, 0.5), (2.0, 0.0, 0.5), (2.0, 2.0, 0.5)));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Koordinanten des Würfels, auf dem die Texturen abgebidet werden, auf dem ein drehendes Rechteck abgebildet ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Würfel braucht Texturkoordinaten.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
&lt;br /&gt;
  // --- Vectoren&lt;br /&gt;
  CubeVertex: array[0..11] of Tmat3x3 =&lt;br /&gt;
    (((-0.5, 0.5, 0.5), (-0.5, -0.5, 0.5), (0.5, -0.5, 0.5)), ((-0.5, 0.5, 0.5), (0.5, -0.5, 0.5), (0.5, 0.5, 0.5)),&lt;br /&gt;
    ((0.5, 0.5, 0.5), (0.5, -0.5, 0.5), (0.5, -0.5, -0.5)), ((0.5, 0.5, 0.5), (0.5, -0.5, -0.5), (0.5, 0.5, -0.5)),&lt;br /&gt;
    ((0.5, 0.5, -0.5), (0.5, -0.5, -0.5), (-0.5, -0.5, -0.5)), ((0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), (-0.5, 0.5, -0.5)),&lt;br /&gt;
    ((-0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), (-0.5, -0.5, 0.5)), ((-0.5, 0.5, -0.5), (-0.5, -0.5, 0.5), (-0.5, 0.5, 0.5)),&lt;br /&gt;
    // oben&lt;br /&gt;
    ((0.5, 0.5, 0.5), (0.5, 0.5, -0.5), (-0.5, 0.5, -0.5)), ((0.5, 0.5, 0.5), (-0.5, 0.5, -0.5), (-0.5, 0.5, 0.5)),&lt;br /&gt;
    // unten&lt;br /&gt;
    ((-0.5, -0.5, 0.5), (-0.5, -0.5, -0.5), (0.5, -0.5, -0.5)), ((-0.5, -0.5, 0.5), (0.5, -0.5, -0.5), (0.5, -0.5, 0.5)));&lt;br /&gt;
&lt;br /&gt;
  // --- Texturkoordinaten&lt;br /&gt;
  CubeTextureVertex: array[0..11] of Tmat3x2 =&lt;br /&gt;
    (((0.0, 1.0), (0.0, 0.0), (1.0, 0.0)), ((0.0, 1.0), (1.0, 0.0), (1.0, 1.0)),&lt;br /&gt;
    ((0.0, 1.0), (0.0, 0.0), (1.0, 0.0)), ((0.0, 1.0), (1.0, 0.0), (1.0, 1.0)),&lt;br /&gt;
    ((0.0, 1.0), (0.0, 0.0), (1.0, 0.0)), ((0.0, 1.0), (1.0, 0.0), (1.0, 1.0)),&lt;br /&gt;
    ((0.0, 1.0), (0.0, 0.0), (1.0, 0.0)), ((0.0, 1.0), (1.0, 0.0), (1.0, 1.0)),&lt;br /&gt;
    ((0.0, 1.0), (0.0, 0.0), (1.0, 0.0)), ((0.0, 1.0), (1.0, 0.0), (1.0, 1.0)),&lt;br /&gt;
    ((0.0, 1.0), (0.0, 0.0), (1.0, 0.0)), ((0.0, 1.0), (1.0, 0.0), (1.0, 1.0)));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grösse der Textur, auf welcher das Quadrat gerendert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  TexturSize = 2048;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das es 2 Scenen und Meshes gibt, werden die Vectorbuffer und die Matrix für die Bewegung doppelt gebraucht.&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Quadrat wird der 2. VBO für die Farben gebraucht, beim Würfel für die Texturkoordinaten.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;var&lt;br /&gt;
  // ID der Textur.&lt;br /&gt;
  textureID: GLuint;&lt;br /&gt;
&lt;br /&gt;
  // Renderpuffer&lt;br /&gt;
  FramebufferName, depthrenderbuffer: GLuint;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugen der Puffer, Shader und Matrizen, eigentlich nichts besonderes.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.CreateScene;&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
  // Vertex Puffer erzeugen.&lt;br /&gt;
  glGenVertexArrays(1, @VBQuad.VAO);&lt;br /&gt;
  glGenBuffers(1, @VBQuad.VBOVertex);&lt;br /&gt;
  glGenBuffers(1, @VBQuad.VBOTex_Col);&lt;br /&gt;
&lt;br /&gt;
  glGenVertexArrays(1, @VBCube.VAO);&lt;br /&gt;
  glGenBuffers(1, @VBCube.VBOVertex);&lt;br /&gt;
  glGenBuffers(1, @VBCube.VBOTex_Col);&lt;br /&gt;
&lt;br /&gt;
  // Shader des Quadrates&lt;br /&gt;
  with Quad_Shader do begin&lt;br /&gt;
    Shader := TShader.Create([FileToStr('quad.vert'), FileToStr('quad.frag')]);&lt;br /&gt;
    with Shader do begin&lt;br /&gt;
      UseProgram;&lt;br /&gt;
&lt;br /&gt;
      WorldMatrix_id := UniformLocation('Matrix');&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Shader des Würfels.&lt;br /&gt;
  with Cube_Shader do begin&lt;br /&gt;
    Shader := TShader.Create([FileToStr('cube.vert'), FileToStr('cube.frag')]);&lt;br /&gt;
    with Shader do begin&lt;br /&gt;
      UseProgram;&lt;br /&gt;
      glUniform1i(UniformLocation('Sampler0'), 0);&lt;br /&gt;
&lt;br /&gt;
      WorldMatrix_id := UniformLocation('Matrix');&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  CubeWorldMatrix.Identity;&lt;br /&gt;
  QuadWorldMatrix.Identity;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Vertexkoordinaten laden, auch nichts besonderes.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
begin&lt;br /&gt;
  glEnable(GL_DEPTH_TEST);&lt;br /&gt;
  glDepthFunc(GL_LESS);&lt;br /&gt;
&lt;br /&gt;
  glEnable(GL_CULL_FACE);&lt;br /&gt;
  glCullface(GL_BACK);&lt;br /&gt;
&lt;br /&gt;
  QuadWorldMatrix.Scale(2.0);&lt;br /&gt;
&lt;br /&gt;
  // --- Quadrat&lt;br /&gt;
  with Quad_Shader do begin&lt;br /&gt;
    glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
    // Vertexkoordinaten&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBOVertex);&lt;br /&gt;
    glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVertex), @QuadVertex, GL_STATIC_DRAW);&lt;br /&gt;
    glEnableVertexAttribArray(0);&lt;br /&gt;
    glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
    // Farben&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBOTex_Col);&lt;br /&gt;
    glBufferData(GL_ARRAY_BUFFER, sizeof(QuadColor), @QuadColor, GL_STATIC_DRAW);&lt;br /&gt;
    glEnableVertexAttribArray(1);&lt;br /&gt;
    glVertexAttribPointer(1, 3, GL_FLOAT, False, 0, nil);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // --- Würfel&lt;br /&gt;
  with Cube_Shader do begin&lt;br /&gt;
    glBindVertexArray(VBCube.VAO);&lt;br /&gt;
&lt;br /&gt;
    // Vertexkoordinaten&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, VBCube.VBOVertex);&lt;br /&gt;
    glBufferData(GL_ARRAY_BUFFER, sizeof(CubeVertex), @CubeVertex, GL_STATIC_DRAW);&lt;br /&gt;
    glEnableVertexAttribArray(0);&lt;br /&gt;
    glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
    // Texturkoordinaten&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, VBCube.VBOTex_Col);&lt;br /&gt;
    glBufferData(GL_ARRAY_BUFFER, sizeof(CubeTextureVertex), @CubeTextureVertex, GL_STATIC_DRAW);&lt;br /&gt;
    glEnableVertexAttribArray(10);&lt;br /&gt;
    glVertexAttribPointer(10, 2, GL_FLOAT, False, 0, nil);&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das erzeugen der Textur ist sehr ähnlich einer normalen Textur, der grosse Unterschied, anstelle eines Pointer auf die Texturdaten,&amp;lt;br&amp;gt;&lt;br /&gt;
gibt man nur '''nil''' mit, da man nur einee leere Textur braucht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  // ------------ Texturen erzeugen --------------&lt;br /&gt;
&lt;br /&gt;
  // --- Textur&lt;br /&gt;
&lt;br /&gt;
  glGenTextures(1, @textureID);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, textureID);&lt;br /&gt;
&lt;br /&gt;
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexturSize, TexturSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);&lt;br /&gt;
&lt;br /&gt;
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);&lt;br /&gt;
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier wird die Textur mit dem Render/FrameBuffer gekoppelt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  // Frame Puffer erzeugen.&lt;br /&gt;
  glGenFramebuffers(1, @FramebufferName);&lt;br /&gt;
  glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);&lt;br /&gt;
&lt;br /&gt;
  // Render Puffer erzeugen.&lt;br /&gt;
  glGenRenderbuffers(1, @depthrenderbuffer);&lt;br /&gt;
  glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer);&lt;br /&gt;
&lt;br /&gt;
  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TexturSize, TexturSize);&lt;br /&gt;
  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer);&lt;br /&gt;
&lt;br /&gt;
  // Die Textur mit dem Framebuffer koppeln&lt;br /&gt;
  glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0);&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sieht man wie zuerst in den Framebuffer gerendert wird, und anschiessend normal in den Bildschirmpuffer.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Rendern läuft fast gleich ab, egal in welchen Puffer gerendert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Der einzige markante Unterschied, beim Bildschirmpuffer muss man am Ende '''SwapBuffers''' ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
Noch ein Hinweis, bei FramePuffer, ist der 4. Parameter von '''glClearColor(...''' relevant.&amp;lt;br&amp;gt;&lt;br /&gt;
Wen Alphablending aktiviert ist, kann der Hintergrund des Framepuffer auch transparent sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Bildschirmpuffer hat dieser keinen Einfluss.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
  // --- In den Texturpuffer render.&lt;br /&gt;
&lt;br /&gt;
  with Quad_Shader do begin // Quadrat&lt;br /&gt;
&lt;br /&gt;
    // FramePuffer aktivieren.&lt;br /&gt;
    glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);&lt;br /&gt;
&lt;br /&gt;
    glClearColor(0.3, 0.3, 1.0, 1.0);&lt;br /&gt;
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
    glViewport(0, 0, TexturSize, TexturSize);&lt;br /&gt;
&lt;br /&gt;
    Shader.UseProgram;&lt;br /&gt;
    glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
    QuadWorldMatrix.Uniform(WorldMatrix_id);&lt;br /&gt;
    glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex) * 3);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //  --- Normal auf den Bildschirm rendern.&lt;br /&gt;
&lt;br /&gt;
  with Cube_Shader do begin  // Würfel&lt;br /&gt;
&lt;br /&gt;
    // BildschirmPuffer mit &amp;quot;0&amp;quot; aktivieren.&lt;br /&gt;
    glBindFramebuffer(GL_FRAMEBUFFER, 0);&lt;br /&gt;
&lt;br /&gt;
    glClearColor(0.6, 0.6, 0.4, 1.0);&lt;br /&gt;
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
    glViewport(0, 0, ClientWidth, ClientHeight);&lt;br /&gt;
&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D, textureID);&lt;br /&gt;
&lt;br /&gt;
    Shader.UseProgram;&lt;br /&gt;
    glBindVertexArray(VBCube.VAO);&lt;br /&gt;
&lt;br /&gt;
    CubeWorldMatrix.Uniform(WorldMatrix_id);&lt;br /&gt;
    glDrawArrays(GL_TriangleS, 0, Length(CubeVertex) * 3);&lt;br /&gt;
&lt;br /&gt;
    ogc.SwapBuffers;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zum Schluss alle Puffer frei geben.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  Timer1.Enabled := False;&lt;br /&gt;
&lt;br /&gt;
  // Frame Puffer und Textur frei geben.&lt;br /&gt;
  glDeleteFramebuffers(1, @FramebufferName);&lt;br /&gt;
  glDeleteRenderbuffers(1, @depthrenderbuffer);&lt;br /&gt;
  glDeleteTextures(1, @textureID);&lt;br /&gt;
&lt;br /&gt;
  // Vertex Puffer frei geben.&lt;br /&gt;
  glDeleteVertexArrays(1, @VBQuad.VAO);&lt;br /&gt;
  glDeleteBuffers(1, @VBQuad.VBOVertex);&lt;br /&gt;
  glDeleteBuffers(1, @VBQuad.VBOTex_Col);&lt;br /&gt;
&lt;br /&gt;
  glDeleteVertexArrays(1, @VBCube.VAO);&lt;br /&gt;
  glDeleteBuffers(1, @VBCube.VBOVertex);&lt;br /&gt;
  glDeleteBuffers(1, @VBCube.VBOTex_Col);&lt;br /&gt;
&lt;br /&gt;
  // Shader frei geben.&lt;br /&gt;
  Quad_Shader.Shader.Free;&lt;br /&gt;
  Cube_Shader.Shader.Free;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Shader sind sehr einfach, der Shader des Quadrates muss nur ein farbige Polygone ausgeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Shader des Würfels, gibt Texturen aus.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader Quadrat:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 0) in vec3 inPos;&lt;br /&gt;
layout (location = 10) in vec2 vertexUV0;&lt;br /&gt;
&lt;br /&gt;
uniform mat4 Matrix;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = Matrix * vec4(inPos, 1.0);&lt;br /&gt;
  UV0 = vertexUV0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader Quadrat:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D Sampler0;&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler0, UV0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader Würfel:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 0) in vec3 inPos;&lt;br /&gt;
layout (location = 1) in vec3 inCol;&lt;br /&gt;
&lt;br /&gt;
uniform mat4 Matrix;&lt;br /&gt;
&lt;br /&gt;
out vec3 Col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = Matrix * vec4(inPos, 1.0);&lt;br /&gt;
  Col = inCol;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader Würfel:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec3 Col;&lt;br /&gt;
out vec4 outColor; // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  outColor = vec4(Col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Matrixmultiplikation&amp;diff=27048</id>
		<title>Matrixmultiplikation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Matrixmultiplikation&amp;diff=27048"/>
				<updated>2019-12-04T12:55:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Matrix / Vektor Multiplikation SSE-unterstützt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Matrix Multiplikation =&lt;br /&gt;
&lt;br /&gt;
Zur Theorie der Matrixmultiplikation siehe den [[Matrix|Matrix Artikel]].&lt;br /&gt;
== Matrix Multiplikation mit Operator ==&lt;br /&gt;
Noch einfacher geht die Matrix Multiplikation, wen man es mit dem Operator &amp;quot;*&amp;quot; machen kann.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Beispiel zeigt dies anhand der der OpenGL üblichen 4x4-Matrix.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = array[0..3] of GLfloat;&lt;br /&gt;
  Tmat4x4   = array[0..3] of TVector4f;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
operator * (const m1, m2: Tmat4x4) Res: Tmat4x4;&lt;br /&gt;
var&lt;br /&gt;
  i, j, k: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to 3 do begin&lt;br /&gt;
    for j := 0 to 3 do begin&lt;br /&gt;
      Res[i, j] := 0;&lt;br /&gt;
      for k := 0 to 3 do begin&lt;br /&gt;
        Res[i, j] := Res[i, j] + m2[i, k] * m1[k, j];&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  m, m0, m1: Tmat4x4;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  m := m0 * m1; // Sieht sehr einfach aus.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matrix Multiplikation SSE unterstützt ==&lt;br /&gt;
Mit folgendem SSE-beschleunigtem Code, kann man Matrizen-Multiplikationen bis zu 20x schneller berechnen.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies wird von allen gängigen Intel/AMD-CPUs unterstützt. Dies betrifft alle CPUs ab Intel-Core, teilweise auch ältere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = array[0..3] of GLfloat;&lt;br /&gt;
  Tmat4x4   = array[0..3] of TVector4f;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{$asmmode intel}&lt;br /&gt;
function MatrixMultiplySSE(const M0, M1: Tmat4x4): Tmat4x4; assembler; nostackframe; register;&lt;br /&gt;
asm&lt;br /&gt;
         Movups Xmm4, [M0 + $00]&lt;br /&gt;
         Movups Xmm5, [M0 + $10]&lt;br /&gt;
         Movups Xmm6, [M0 + $20]&lt;br /&gt;
         Movups Xmm7, [M0 + $30]&lt;br /&gt;
&lt;br /&gt;
         // Spalte 0&lt;br /&gt;
         Movups Xmm2, [M1 + $00]&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm0, Xmm2, 00000000b&lt;br /&gt;
         Mulps  Xmm0, Xmm4&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 01010101b&lt;br /&gt;
         Mulps  Xmm1, Xmm5&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 10101010b&lt;br /&gt;
         Mulps  Xmm1, Xmm6&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 11111111b&lt;br /&gt;
         Mulps  Xmm1, Xmm7&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Movups [Result + $00], Xmm0&lt;br /&gt;
&lt;br /&gt;
         // Spalte 1&lt;br /&gt;
         Movups Xmm2, [M1 + $10]&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm0, Xmm2, 00000000b&lt;br /&gt;
         Mulps  Xmm0, Xmm4&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 01010101b&lt;br /&gt;
         Mulps  Xmm1, Xmm5&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 10101010b&lt;br /&gt;
         Mulps  Xmm1, Xmm6&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 11111111b&lt;br /&gt;
         Mulps  Xmm1, Xmm7&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Movups   [Result + $10], Xmm0&lt;br /&gt;
&lt;br /&gt;
         // Spalte 2&lt;br /&gt;
         Movups  Xmm2, [M1 + $20]&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm0, Xmm2, 00000000b&lt;br /&gt;
         Mulps  Xmm0, Xmm4&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 01010101b&lt;br /&gt;
         Mulps  Xmm1, Xmm5&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 10101010b&lt;br /&gt;
         Mulps  Xmm1, Xmm6&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 11111111b&lt;br /&gt;
         Mulps  Xmm1, Xmm7&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Movups [Result + $20], Xmm0&lt;br /&gt;
&lt;br /&gt;
         // Spalte 3&lt;br /&gt;
         Movups Xmm2, [M1 + $30]&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm0, Xmm2, 00000000b&lt;br /&gt;
         Mulps  Xmm0, Xmm4&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 01010101b&lt;br /&gt;
         Mulps  Xmm1, Xmm5&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 10101010b&lt;br /&gt;
         Mulps  Xmm1, Xmm6&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Pshufd Xmm1, Xmm2, 11111111b&lt;br /&gt;
         Mulps  Xmm1, Xmm7&lt;br /&gt;
         Addps  Xmm0, Xmm1&lt;br /&gt;
&lt;br /&gt;
         Movups [Result + $30], Xmm0&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  m, m0, m1: Tmat4x4;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  m := MatrixMultiplySSE(m0, m1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matrix / Vektor Multiplikation mit Operator ==&lt;br /&gt;
Dies funktioniert auch mit Vektoren.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = array[0..3] of GLfloat;&lt;br /&gt;
  Tmat4x4   = array[0..3] of TVector4f;&lt;br /&gt;
&lt;br /&gt;
operator * (const m: Tmat4x4; v: TVector4f) Res: TVector4f;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to 3 do begin&lt;br /&gt;
    Res[i] := m[0, i] * v[0] + m[1, i] * v[1] + m[2, i] * v[2]+ m[3, i] * v[3];&lt;br /&gt;
  end;&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  v    : TVector4f;&lt;br /&gt;
  m, m0: Tmat4x4;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  m := m0 * v; // Sieht sehr einfach aus.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matrix / Vektor Multiplikation SSE-unterstützt ==&lt;br /&gt;
Die SSE-Beschleunigung funktioniert auch mit Vektoren.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = array[0..3] of GLfloat;&lt;br /&gt;
  Tmat4x4   = array[0..3] of TVector4f;&lt;br /&gt;
&lt;br /&gt;
{$asmmode intel}&lt;br /&gt;
function VectorMultiplySSE(const M: Tmat4x4; const V: TVector4f): TVector4f; assembler; nostackframe; register;&lt;br /&gt;
asm&lt;br /&gt;
         Movups  Xmm4, [M + $00]&lt;br /&gt;
         Movups  Xmm5, [M + $10]&lt;br /&gt;
         Movups  Xmm6, [M + $20]&lt;br /&gt;
         Movups  Xmm7, [M + $30]&lt;br /&gt;
&lt;br /&gt;
         // Zeile 0&lt;br /&gt;
         Movss   Xmm0, [V + $00]&lt;br /&gt;
         Shufps  Xmm0, Xmm0, 00000000b&lt;br /&gt;
         Mulps   Xmm0, Xmm4&lt;br /&gt;
&lt;br /&gt;
         // Zeile 1&lt;br /&gt;
         Movss   Xmm2, [V + $04]&lt;br /&gt;
         Shufps  Xmm2, Xmm2, 00000000b&lt;br /&gt;
         Mulps   Xmm2, Xmm5&lt;br /&gt;
         Addps   Xmm0, Xmm2&lt;br /&gt;
&lt;br /&gt;
         // Zeile 2&lt;br /&gt;
         Movss   Xmm2, [V + $08]&lt;br /&gt;
         Shufps  Xmm2, Xmm2, 00000000b&lt;br /&gt;
         Mulps   Xmm2, Xmm6&lt;br /&gt;
         Addps   Xmm0, Xmm2&lt;br /&gt;
&lt;br /&gt;
         // Zeile 3&lt;br /&gt;
         Movss   Xmm2, [V + $0C]&lt;br /&gt;
         Shufps  Xmm2, Xmm2, 00000000b&lt;br /&gt;
         Mulps   Xmm2, Xmm7&lt;br /&gt;
         Addps   Xmm0, Xmm2&lt;br /&gt;
&lt;br /&gt;
         Movups  [Result], Xmm0&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  v    : TVector4f;&lt;br /&gt;
  m, m0: Tmat4x4;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  m := VectorMultiplySSE(m0, v);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matrix Multiplikation mit dynamischen Matrizen ( no OpenGL ) ==&lt;br /&gt;
Dies ist weniger für OpenGL geeignet. Für OpenGL verwendet man besser statische 4x4 oder 3x3 Arrays, siehe oben.&lt;br /&gt;
&lt;br /&gt;
Emre lieferte im Forum diesen kleinen Codeschnipsel für die Matrixmultiplikation ab:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  TSMatrix = Array of Array of Single;&lt;br /&gt;
&lt;br /&gt;
// sMatrix := sMatrix * Matrix&lt;br /&gt;
procedure pSMatrixMatrixProduct( var sMatrix: TSMatrix; const Matrix: TSMatrix );&lt;br /&gt;
var&lt;br /&gt;
  m, n, o: Integer;&lt;br /&gt;
  Res    : TSMatrix;&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
  // Matrices can only be multiplicated, if the row count of the matrix#1 is the same&lt;br /&gt;
  // as the column of the second matrix:&lt;br /&gt;
  if High(sMatrix[0]) &amp;lt;&amp;gt; High(Matrix) then Exit;&lt;br /&gt;
&lt;br /&gt;
  // if a k*l matrix is multiplicated by a m*n matrix,&lt;br /&gt;
  // the result matrix will have a k*n dimension:&lt;br /&gt;
  SetLength(Res, Length(sMatrix), Length(Matrix[0]));&lt;br /&gt;
  for m := 0 to High(Res) do&lt;br /&gt;
    for n := 0 to High(Res[m]) do&lt;br /&gt;
      for o := 0 to High(Matrix) do&lt;br /&gt;
        incS(Res[m, n], sMatrix[m, o] * Matrix[o, n]);&lt;br /&gt;
  sMatrix := Res;&lt;br /&gt;
end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27019</id>
		<title>VBO ohne glInterleavedArrays</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27019"/>
				<updated>2018-08-25T19:21:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* 4. Nachher reinen Tisch machen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Voraussetzung: mindestens OpenGL 1.5)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;VBO&amp;quot; ist die Abkürzung von &amp;quot;Vertex Buffer Object&amp;quot; und ist eine Möglichkeit der Darstellung von Objekten mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, einen VBO zu verwenden. Die Variante, die ich unten erkläre, ist also nicht die einzige.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VBO mit frei definierter Datenstruktur, ohne glInterleavedArrays==&lt;br /&gt;
&lt;br /&gt;
Der untenstehende Pascal-Code zeichnet das Opengl-Dreieck mit einem VBO. Ich hatte beim Erzeugen dieses Code-Stücks eine steile Lernkurve und jede Menge Frust, denn beim Ändern einzelner Teile sind dann natürlich auch korrespondierende Teile anderswo zu ändern, aber da kann man leicht etwas übersehen, speziell wenn es gegen vier Uhr morgens geht. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===1. Zunächst die globalen Deklarationen===&lt;br /&gt;
&lt;br /&gt;
Typen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = packed record &lt;br /&gt;
    X, Y, Z, W: Single; &lt;br /&gt;
  end; &lt;br /&gt;
  &lt;br /&gt;
  TVBOVertex = packed record  &lt;br /&gt;
    Position,&lt;br /&gt;
    Color,&lt;br /&gt;
    Empty: TVector4f;&lt;br /&gt;
  end;&lt;br /&gt;
  &lt;br /&gt;
  TVBOBuffer   = array of TVBOVertex;&lt;br /&gt;
  TIndexBuffer = array of Word;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konstanten&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
const&lt;br /&gt;
  POS_OFFSET  =  Pointer(0);                  // Position-Offset als Zeiger&lt;br /&gt;
  COL_OFFSET  =  Pointer(SizeOf(TVector4D));  // Color-Offset als Zeiger&lt;br /&gt;
  STRIDE      =  SizeOf(TVBOVertex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  VBOBuffer:   TVBOBuffer;       // VBO-Daten&lt;br /&gt;
  IndexBuffer: TIndexBuffer;     // VBO-Indices&lt;br /&gt;
  VertexBufSize,                 // VBO-Daten: Puffergröße&lt;br /&gt;
  IndexBufSize,                  // VBO-Indices: Puffergröße &lt;br /&gt;
  IndexCount,                    // Anzahl der Indices&lt;br /&gt;
  IDVbo, IDIndex: Cardinal;      // Opengl-&amp;quot;Handles&amp;quot; für VBO- und Indexpuffer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante des VBO kann man sein eigenes Vertex definieren und ist nicht auf vorgegebene Datenstrukturen beschränkt wie bei den glInterleavedArrays. Der &amp;quot;Empty&amp;quot;-Vektor im TVBOVertex soll darauf hinweisen, dass man vorgegebene Vertexattribute mit benutzerdefinierten mischen kann. Das wird hier aber nicht behandelt. &lt;br /&gt;
&lt;br /&gt;
Ihr könnt die Typen definieren, wie Ihr wollt, aber es ergeben sich daraus Konsequenzen. Die Datendeklaration hat unmittelbaren Einfluss auf den untenstehenden Initialisierungs- und Rendercode. Wenn also der Datentyp geändert wird, muss man den ganzen untenstehenden Code auf notwendige Anpassungen untersuchen. Wie sich gezeigt hat, habe ich dabei immer wieder das eine oder andere vergessen. :(&lt;br /&gt;
&lt;br /&gt;
===2. Dann das Hochladen der Daten aus dem Hauptspeicher in den Grafikkartenspeicher===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  IndexCount :=  3;&lt;br /&gt;
&lt;br /&gt;
  VertexBufSize := IndexCount * SizeOf(TVBOVertex);&lt;br /&gt;
  IndexBufSize  := IndexCount * SizeOf(Word);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer erzeugen,initialisieren und mit Daten bestücken&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(VBOBuffer, IndexCount);&lt;br /&gt;
  FillChar(VBOBuffer[0], Length(VBOBuffer) * SizeOf(TVBOVertex), #0);&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[0] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := -1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[1] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[2] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +1.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1, @IDVbo);&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, VertexBufSize, @VBOBuffer[0], GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe mit dem Indexpuffer&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer, IndexCount);&lt;br /&gt;
&lt;br /&gt;
  IndexBuffer[0] := 0;&lt;br /&gt;
  IndexBuffer[1] := 1;&lt;br /&gt;
  IndexBuffer[2] := 2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1,@IDIndex);&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, IndexBufSize,@IndexBuffer[0], GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich habe hier für den VBO einen Record genommen, weil bei den Demos im Netz normalerweise immer Arrays benutzt werden. Der Recordtyp ist zusätzlich viel selbsterklärender als ein Array und man kann ihn auch noch durch treffende Namensgebung verbessern. &lt;br /&gt;
&lt;br /&gt;
Abgesehen von der Entscheidung, welchen Datentyp man nehmen soll, ist das der einfachere Teil des Ganzen. Und damit es nicht ganz trivial wird, habe ich noch einen winzigen Indexbuffer definiert, damit ich zum Zeichnen glDrawElements verwenden kann. &lt;br /&gt;
&lt;br /&gt;
In den Beispielen, die man im Web finden kann, gibt es außerdem noch die Variante, wo glBufferdata nur zur Definition der Puffer-Parameter benutzt wird, aber für das Hochladen der Daten auf die Grafikkarte wird glBufferSubdata verwendet. Damit kann man entweder den ganzen Puffer oder auch nur Teile davon neu beschicken.&lt;br /&gt;
&lt;br /&gt;
===3. Der Rendercode===&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nötige Zeiger setzen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glVertexPointer(4, GL_FLOAT, STRIDE, POS_OFFSET);&lt;br /&gt;
  glColorPointer(4, GL_FLOAT, STRIDE, COL_OFFSET);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeichnen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
  glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, IndexCount, GL_UNSIGNED_SHORT, NIL);&lt;br /&gt;
&lt;br /&gt;
  glDisableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
  glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über das Binden der Puffer gibt es eigentlich nicht viel zu sagen. Die OpenGL-Pufferobjekte sind alle ziemlich ähnlich.&lt;br /&gt;
&lt;br /&gt;
Aber bei den Zeigern kann man eine Menge falsch machen. Etliche Leute im Netz haben z.B. nachgeforscht, wie man den Parameter &amp;quot;Stride&amp;quot; zu interpretieren hat. Ich habe Stride ganz oben im Definitionsteil als Konstante definiert: STRIDE = SizeOf(TVBOVertex); damit ist klar, dass hier die gesamte Blockgröße des Vertex gemeint ist. Die &amp;quot;Offset&amp;quot;-Parameter habe ich als Konstanten definiert weil sie von der Struktur des Vertex abhängen und daher vermutlich nicht dauernd geändert werden. &amp;quot;Offset&amp;quot; ist hier genau das richtige Wort. Zwischen dem Beginn des Vertex und der Color liegt eine Position mit dem Typ &amp;quot;TVector4D&amp;quot;, daher ist der Offset der Color SizeOf(TVector4D). '''Ganz wichtig''': die Offsets müssen an die gl*Pointer-Funktionen als Zeiger übergeben werden, siehe oben Definition der Offsets.&lt;br /&gt;
&lt;br /&gt;
Ich habe hier zwar kein nächstes Vertex-Element, aber wenn ich eines hätte, dann wäre dessen Offset COL_OFFSET+SizeOf(TVector4D) oder auch in Pseudoschreibweise: Offset(Color)+Size(Color).&lt;br /&gt;
&lt;br /&gt;
Nach dem Binden des Indexpuffers muss man den VBO Client-seitig aktivieren, und zwar für jeden Attribut-Typ extra. Wenn Ihr also eine Texturkoordinate ergänzen wollt - dazu muss man natürlich die Vertex-Definition ändern -, dann vergeßt bloß nicht das &amp;quot;glEnableClientState(GL_TEXTURE_COORD_ARRAY)&amp;quot; nachzutragen.&lt;br /&gt;
&lt;br /&gt;
So, jetzt kann man endlich zeichnen. Die Typangabe im glDrawElements beschreibt den Index und der letzte Parameter muss &amp;quot;NIL&amp;quot; sein, denn in unserem Fall ist dieser Parameter überflüssig (er wird in einem anderen Zusammenhang zum Nachladen der Daten benutzt).&lt;br /&gt;
&lt;br /&gt;
===4. Nachher reinen Tisch machen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer, 0);&lt;br /&gt;
  SetLength(VBOBuffer, 0);&lt;br /&gt;
  glDeleteBuffers(1, @IDVbo);&lt;br /&gt;
  glDeleteBuffers(1, @IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende werden die Daten freigegeben, sowohl im RAM (mit SetLength(Buffer,0)) als auch im GRAM (mit glDeleteBuffers).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und, naja, wenn man etwas auf eine solche Art zeichnet, sollte es natürlich nicht grade ein Dreieck sein. Das wäre nämlich so, als ob man um die Ecke in den Supermarkt gehen wollte und dazu einen Jumbojet benutzt. :) &lt;br /&gt;
&lt;br /&gt;
Insgesamt fand ich am Ende, dass ich Euch vielleicht ein wenig Zeit und Frust ersparen kann, wenn ich das Ganze ins DGL-Wiki stelle. &lt;br /&gt;
&lt;br /&gt;
Ich hoffe, es hilft.&amp;lt;br&amp;gt;&lt;br /&gt;
Viele Grüße,&amp;lt;br&amp;gt;&lt;br /&gt;
[[Benutzer:Traude|Traude]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Fragen und Verbesserungsvorschläge wie immer ins Feedback-Forum bei DelphiGL.com.''&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27018</id>
		<title>VBO ohne glInterleavedArrays</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27018"/>
				<updated>2018-08-25T19:21:04Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* 3. Der Rendercode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Voraussetzung: mindestens OpenGL 1.5)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;VBO&amp;quot; ist die Abkürzung von &amp;quot;Vertex Buffer Object&amp;quot; und ist eine Möglichkeit der Darstellung von Objekten mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, einen VBO zu verwenden. Die Variante, die ich unten erkläre, ist also nicht die einzige.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VBO mit frei definierter Datenstruktur, ohne glInterleavedArrays==&lt;br /&gt;
&lt;br /&gt;
Der untenstehende Pascal-Code zeichnet das Opengl-Dreieck mit einem VBO. Ich hatte beim Erzeugen dieses Code-Stücks eine steile Lernkurve und jede Menge Frust, denn beim Ändern einzelner Teile sind dann natürlich auch korrespondierende Teile anderswo zu ändern, aber da kann man leicht etwas übersehen, speziell wenn es gegen vier Uhr morgens geht. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===1. Zunächst die globalen Deklarationen===&lt;br /&gt;
&lt;br /&gt;
Typen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = packed record &lt;br /&gt;
    X, Y, Z, W: Single; &lt;br /&gt;
  end; &lt;br /&gt;
  &lt;br /&gt;
  TVBOVertex = packed record  &lt;br /&gt;
    Position,&lt;br /&gt;
    Color,&lt;br /&gt;
    Empty: TVector4f;&lt;br /&gt;
  end;&lt;br /&gt;
  &lt;br /&gt;
  TVBOBuffer   = array of TVBOVertex;&lt;br /&gt;
  TIndexBuffer = array of Word;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konstanten&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
const&lt;br /&gt;
  POS_OFFSET  =  Pointer(0);                  // Position-Offset als Zeiger&lt;br /&gt;
  COL_OFFSET  =  Pointer(SizeOf(TVector4D));  // Color-Offset als Zeiger&lt;br /&gt;
  STRIDE      =  SizeOf(TVBOVertex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  VBOBuffer:   TVBOBuffer;       // VBO-Daten&lt;br /&gt;
  IndexBuffer: TIndexBuffer;     // VBO-Indices&lt;br /&gt;
  VertexBufSize,                 // VBO-Daten: Puffergröße&lt;br /&gt;
  IndexBufSize,                  // VBO-Indices: Puffergröße &lt;br /&gt;
  IndexCount,                    // Anzahl der Indices&lt;br /&gt;
  IDVbo, IDIndex: Cardinal;      // Opengl-&amp;quot;Handles&amp;quot; für VBO- und Indexpuffer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante des VBO kann man sein eigenes Vertex definieren und ist nicht auf vorgegebene Datenstrukturen beschränkt wie bei den glInterleavedArrays. Der &amp;quot;Empty&amp;quot;-Vektor im TVBOVertex soll darauf hinweisen, dass man vorgegebene Vertexattribute mit benutzerdefinierten mischen kann. Das wird hier aber nicht behandelt. &lt;br /&gt;
&lt;br /&gt;
Ihr könnt die Typen definieren, wie Ihr wollt, aber es ergeben sich daraus Konsequenzen. Die Datendeklaration hat unmittelbaren Einfluss auf den untenstehenden Initialisierungs- und Rendercode. Wenn also der Datentyp geändert wird, muss man den ganzen untenstehenden Code auf notwendige Anpassungen untersuchen. Wie sich gezeigt hat, habe ich dabei immer wieder das eine oder andere vergessen. :(&lt;br /&gt;
&lt;br /&gt;
===2. Dann das Hochladen der Daten aus dem Hauptspeicher in den Grafikkartenspeicher===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  IndexCount :=  3;&lt;br /&gt;
&lt;br /&gt;
  VertexBufSize := IndexCount * SizeOf(TVBOVertex);&lt;br /&gt;
  IndexBufSize  := IndexCount * SizeOf(Word);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer erzeugen,initialisieren und mit Daten bestücken&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(VBOBuffer, IndexCount);&lt;br /&gt;
  FillChar(VBOBuffer[0], Length(VBOBuffer) * SizeOf(TVBOVertex), #0);&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[0] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := -1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[1] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[2] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +1.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1, @IDVbo);&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, VertexBufSize, @VBOBuffer[0], GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe mit dem Indexpuffer&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer, IndexCount);&lt;br /&gt;
&lt;br /&gt;
  IndexBuffer[0] := 0;&lt;br /&gt;
  IndexBuffer[1] := 1;&lt;br /&gt;
  IndexBuffer[2] := 2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1,@IDIndex);&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, IndexBufSize,@IndexBuffer[0], GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich habe hier für den VBO einen Record genommen, weil bei den Demos im Netz normalerweise immer Arrays benutzt werden. Der Recordtyp ist zusätzlich viel selbsterklärender als ein Array und man kann ihn auch noch durch treffende Namensgebung verbessern. &lt;br /&gt;
&lt;br /&gt;
Abgesehen von der Entscheidung, welchen Datentyp man nehmen soll, ist das der einfachere Teil des Ganzen. Und damit es nicht ganz trivial wird, habe ich noch einen winzigen Indexbuffer definiert, damit ich zum Zeichnen glDrawElements verwenden kann. &lt;br /&gt;
&lt;br /&gt;
In den Beispielen, die man im Web finden kann, gibt es außerdem noch die Variante, wo glBufferdata nur zur Definition der Puffer-Parameter benutzt wird, aber für das Hochladen der Daten auf die Grafikkarte wird glBufferSubdata verwendet. Damit kann man entweder den ganzen Puffer oder auch nur Teile davon neu beschicken.&lt;br /&gt;
&lt;br /&gt;
===3. Der Rendercode===&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nötige Zeiger setzen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glVertexPointer(4, GL_FLOAT, STRIDE, POS_OFFSET);&lt;br /&gt;
  glColorPointer(4, GL_FLOAT, STRIDE, COL_OFFSET);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeichnen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
  glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, IndexCount, GL_UNSIGNED_SHORT, NIL);&lt;br /&gt;
&lt;br /&gt;
  glDisableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
  glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über das Binden der Puffer gibt es eigentlich nicht viel zu sagen. Die OpenGL-Pufferobjekte sind alle ziemlich ähnlich.&lt;br /&gt;
&lt;br /&gt;
Aber bei den Zeigern kann man eine Menge falsch machen. Etliche Leute im Netz haben z.B. nachgeforscht, wie man den Parameter &amp;quot;Stride&amp;quot; zu interpretieren hat. Ich habe Stride ganz oben im Definitionsteil als Konstante definiert: STRIDE = SizeOf(TVBOVertex); damit ist klar, dass hier die gesamte Blockgröße des Vertex gemeint ist. Die &amp;quot;Offset&amp;quot;-Parameter habe ich als Konstanten definiert weil sie von der Struktur des Vertex abhängen und daher vermutlich nicht dauernd geändert werden. &amp;quot;Offset&amp;quot; ist hier genau das richtige Wort. Zwischen dem Beginn des Vertex und der Color liegt eine Position mit dem Typ &amp;quot;TVector4D&amp;quot;, daher ist der Offset der Color SizeOf(TVector4D). '''Ganz wichtig''': die Offsets müssen an die gl*Pointer-Funktionen als Zeiger übergeben werden, siehe oben Definition der Offsets.&lt;br /&gt;
&lt;br /&gt;
Ich habe hier zwar kein nächstes Vertex-Element, aber wenn ich eines hätte, dann wäre dessen Offset COL_OFFSET+SizeOf(TVector4D) oder auch in Pseudoschreibweise: Offset(Color)+Size(Color).&lt;br /&gt;
&lt;br /&gt;
Nach dem Binden des Indexpuffers muss man den VBO Client-seitig aktivieren, und zwar für jeden Attribut-Typ extra. Wenn Ihr also eine Texturkoordinate ergänzen wollt - dazu muss man natürlich die Vertex-Definition ändern -, dann vergeßt bloß nicht das &amp;quot;glEnableClientState(GL_TEXTURE_COORD_ARRAY)&amp;quot; nachzutragen.&lt;br /&gt;
&lt;br /&gt;
So, jetzt kann man endlich zeichnen. Die Typangabe im glDrawElements beschreibt den Index und der letzte Parameter muss &amp;quot;NIL&amp;quot; sein, denn in unserem Fall ist dieser Parameter überflüssig (er wird in einem anderen Zusammenhang zum Nachladen der Daten benutzt).&lt;br /&gt;
&lt;br /&gt;
===4. Nachher reinen Tisch machen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer,0);&lt;br /&gt;
  SetLength(VBOBuffer,0);&lt;br /&gt;
  glDeleteBuffers(1,@IDVbo);&lt;br /&gt;
  glDeleteBuffers(1,@IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende werden die Daten freigegeben, sowohl im RAM (mit SetLength(Buffer,0)) als auch im GRAM (mit glDeleteBuffers).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und, naja, wenn man etwas auf eine solche Art zeichnet, sollte es natürlich nicht grade ein Dreieck sein. Das wäre nämlich so, als ob man um die Ecke in den Supermarkt gehen wollte und dazu einen Jumbojet benutzt. :) &lt;br /&gt;
&lt;br /&gt;
Insgesamt fand ich am Ende, dass ich Euch vielleicht ein wenig Zeit und Frust ersparen kann, wenn ich das Ganze ins DGL-Wiki stelle. &lt;br /&gt;
&lt;br /&gt;
Ich hoffe, es hilft.&amp;lt;br&amp;gt;&lt;br /&gt;
Viele Grüße,&amp;lt;br&amp;gt;&lt;br /&gt;
[[Benutzer:Traude|Traude]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Fragen und Verbesserungsvorschläge wie immer ins Feedback-Forum bei DelphiGL.com.''&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27017</id>
		<title>VBO ohne glInterleavedArrays</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27017"/>
				<updated>2018-08-25T19:19:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* 2. Dann das Hochladen der Daten aus dem Hauptspeicher in den Grafikkartenspeicher */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Voraussetzung: mindestens OpenGL 1.5)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;VBO&amp;quot; ist die Abkürzung von &amp;quot;Vertex Buffer Object&amp;quot; und ist eine Möglichkeit der Darstellung von Objekten mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, einen VBO zu verwenden. Die Variante, die ich unten erkläre, ist also nicht die einzige.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VBO mit frei definierter Datenstruktur, ohne glInterleavedArrays==&lt;br /&gt;
&lt;br /&gt;
Der untenstehende Pascal-Code zeichnet das Opengl-Dreieck mit einem VBO. Ich hatte beim Erzeugen dieses Code-Stücks eine steile Lernkurve und jede Menge Frust, denn beim Ändern einzelner Teile sind dann natürlich auch korrespondierende Teile anderswo zu ändern, aber da kann man leicht etwas übersehen, speziell wenn es gegen vier Uhr morgens geht. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===1. Zunächst die globalen Deklarationen===&lt;br /&gt;
&lt;br /&gt;
Typen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = packed record &lt;br /&gt;
    X, Y, Z, W: Single; &lt;br /&gt;
  end; &lt;br /&gt;
  &lt;br /&gt;
  TVBOVertex = packed record  &lt;br /&gt;
    Position,&lt;br /&gt;
    Color,&lt;br /&gt;
    Empty: TVector4f;&lt;br /&gt;
  end;&lt;br /&gt;
  &lt;br /&gt;
  TVBOBuffer   = array of TVBOVertex;&lt;br /&gt;
  TIndexBuffer = array of Word;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konstanten&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
const&lt;br /&gt;
  POS_OFFSET  =  Pointer(0);                  // Position-Offset als Zeiger&lt;br /&gt;
  COL_OFFSET  =  Pointer(SizeOf(TVector4D));  // Color-Offset als Zeiger&lt;br /&gt;
  STRIDE      =  SizeOf(TVBOVertex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  VBOBuffer:   TVBOBuffer;       // VBO-Daten&lt;br /&gt;
  IndexBuffer: TIndexBuffer;     // VBO-Indices&lt;br /&gt;
  VertexBufSize,                 // VBO-Daten: Puffergröße&lt;br /&gt;
  IndexBufSize,                  // VBO-Indices: Puffergröße &lt;br /&gt;
  IndexCount,                    // Anzahl der Indices&lt;br /&gt;
  IDVbo, IDIndex: Cardinal;      // Opengl-&amp;quot;Handles&amp;quot; für VBO- und Indexpuffer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante des VBO kann man sein eigenes Vertex definieren und ist nicht auf vorgegebene Datenstrukturen beschränkt wie bei den glInterleavedArrays. Der &amp;quot;Empty&amp;quot;-Vektor im TVBOVertex soll darauf hinweisen, dass man vorgegebene Vertexattribute mit benutzerdefinierten mischen kann. Das wird hier aber nicht behandelt. &lt;br /&gt;
&lt;br /&gt;
Ihr könnt die Typen definieren, wie Ihr wollt, aber es ergeben sich daraus Konsequenzen. Die Datendeklaration hat unmittelbaren Einfluss auf den untenstehenden Initialisierungs- und Rendercode. Wenn also der Datentyp geändert wird, muss man den ganzen untenstehenden Code auf notwendige Anpassungen untersuchen. Wie sich gezeigt hat, habe ich dabei immer wieder das eine oder andere vergessen. :(&lt;br /&gt;
&lt;br /&gt;
===2. Dann das Hochladen der Daten aus dem Hauptspeicher in den Grafikkartenspeicher===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  IndexCount :=  3;&lt;br /&gt;
&lt;br /&gt;
  VertexBufSize := IndexCount * SizeOf(TVBOVertex);&lt;br /&gt;
  IndexBufSize  := IndexCount * SizeOf(Word);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer erzeugen,initialisieren und mit Daten bestücken&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(VBOBuffer, IndexCount);&lt;br /&gt;
  FillChar(VBOBuffer[0], Length(VBOBuffer) * SizeOf(TVBOVertex), #0);&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[0] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := -1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[1] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[2] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +1.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1, @IDVbo);&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, VertexBufSize, @VBOBuffer[0], GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe mit dem Indexpuffer&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer, IndexCount);&lt;br /&gt;
&lt;br /&gt;
  IndexBuffer[0] := 0;&lt;br /&gt;
  IndexBuffer[1] := 1;&lt;br /&gt;
  IndexBuffer[2] := 2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1,@IDIndex);&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, IndexBufSize,@IndexBuffer[0], GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich habe hier für den VBO einen Record genommen, weil bei den Demos im Netz normalerweise immer Arrays benutzt werden. Der Recordtyp ist zusätzlich viel selbsterklärender als ein Array und man kann ihn auch noch durch treffende Namensgebung verbessern. &lt;br /&gt;
&lt;br /&gt;
Abgesehen von der Entscheidung, welchen Datentyp man nehmen soll, ist das der einfachere Teil des Ganzen. Und damit es nicht ganz trivial wird, habe ich noch einen winzigen Indexbuffer definiert, damit ich zum Zeichnen glDrawElements verwenden kann. &lt;br /&gt;
&lt;br /&gt;
In den Beispielen, die man im Web finden kann, gibt es außerdem noch die Variante, wo glBufferdata nur zur Definition der Puffer-Parameter benutzt wird, aber für das Hochladen der Daten auf die Grafikkarte wird glBufferSubdata verwendet. Damit kann man entweder den ganzen Puffer oder auch nur Teile davon neu beschicken.&lt;br /&gt;
&lt;br /&gt;
===3. Der Rendercode===&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nötige Zeiger setzen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glVertexPointer(4, GL_FLOAT, STRIDE, POS_OFFSET);&lt;br /&gt;
  glColorPointer(4, GL_FLOAT, STRIDE, COL_OFFSET);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeichnen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
  glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
  glDrawElements(GL_TRIANGLES,IndexCount,GL_UNSIGNED_SHORT,NIL);&lt;br /&gt;
&lt;br /&gt;
  glDisableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
  glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über das Binden der Puffer gibt es eigentlich nicht viel zu sagen. Die OpenGL-Pufferobjekte sind alle ziemlich ähnlich.&lt;br /&gt;
&lt;br /&gt;
Aber bei den Zeigern kann man eine Menge falsch machen. Etliche Leute im Netz haben z.B. nachgeforscht, wie man den Parameter &amp;quot;Stride&amp;quot; zu interpretieren hat. Ich habe Stride ganz oben im Defnitionsteil als Konstante definiert: STRIDE = SizeOf(TVBOVertex); damit ist klar, dass hier die gesamte Blockgröße des Vertex gemeint ist. Die &amp;quot;Offset&amp;quot;-Parameter habe ich als Konstanten definiert weil sie von der Struktur des Vertex abhängen und daher vermutlich nicht dauernd geändert werden. &amp;quot;Offset&amp;quot; ist hier genau das richtige Wort. Zwischen dem Beginn des Vertex und der Color liegt eine Position mit dem Typ &amp;quot;TVector4D&amp;quot;, daher ist der Offset der Color SizeOf(TVector4D). '''Ganz wichtig''': die Offsets müssen an die gl*Pointer-Funktionen als Zeiger übergeben werden, siehe oben Definition der Offsets.&lt;br /&gt;
&lt;br /&gt;
Ich habe hier zwar kein nächstes Vertex-Element, aber wenn ich eines hätte, dann wäre dessen Offset COL_OFFSET+SizeOf(TVector4D) oder auch in Pseudoschreibweise: Offset(Color)+Size(Color).&lt;br /&gt;
&lt;br /&gt;
Nach dem Binden des Indexpuffers muss man den VBO Client-seitig aktivieren, und zwar für jeden Attribut-Typ extra. Wenn Ihr also eine Texturkoordinate ergänzen wollt - dazu muss man natürlich die Vertex-Definition ändern -, dann vergeßt bloß nicht das &amp;quot;glEnableClientState(GL_TEXTURE_COORD_ARRAY)&amp;quot; nachzutragen.&lt;br /&gt;
&lt;br /&gt;
So, jetzt kann man endlich zeichnen. Die Typangabe im glDrawElements beschreibt den Index und der letzte Parameter muss &amp;quot;NIL&amp;quot; sein, denn in unserem Fall ist dieser Parameter überflüssig (er wird in einem anderen Zusammenhang zum Nachladen der Daten benutzt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===4. Nachher reinen Tisch machen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer,0);&lt;br /&gt;
  SetLength(VBOBuffer,0);&lt;br /&gt;
  glDeleteBuffers(1,@IDVbo);&lt;br /&gt;
  glDeleteBuffers(1,@IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende werden die Daten freigegeben, sowohl im RAM (mit SetLength(Buffer,0)) als auch im GRAM (mit glDeleteBuffers).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und, naja, wenn man etwas auf eine solche Art zeichnet, sollte es natürlich nicht grade ein Dreieck sein. Das wäre nämlich so, als ob man um die Ecke in den Supermarkt gehen wollte und dazu einen Jumbojet benutzt. :) &lt;br /&gt;
&lt;br /&gt;
Insgesamt fand ich am Ende, dass ich Euch vielleicht ein wenig Zeit und Frust ersparen kann, wenn ich das Ganze ins DGL-Wiki stelle. &lt;br /&gt;
&lt;br /&gt;
Ich hoffe, es hilft.&amp;lt;br&amp;gt;&lt;br /&gt;
Viele Grüße,&amp;lt;br&amp;gt;&lt;br /&gt;
[[Benutzer:Traude|Traude]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Fragen und Verbesserungsvorschläge wie immer ins Feedback-Forum bei DelphiGL.com.''&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27016</id>
		<title>VBO ohne glInterleavedArrays</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27016"/>
				<updated>2018-08-25T19:18:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* 2. Dann das Hochladen der Daten aus dem Hauptspeicher in den Grafikkartenspeicher */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Voraussetzung: mindestens OpenGL 1.5)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;VBO&amp;quot; ist die Abkürzung von &amp;quot;Vertex Buffer Object&amp;quot; und ist eine Möglichkeit der Darstellung von Objekten mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, einen VBO zu verwenden. Die Variante, die ich unten erkläre, ist also nicht die einzige.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VBO mit frei definierter Datenstruktur, ohne glInterleavedArrays==&lt;br /&gt;
&lt;br /&gt;
Der untenstehende Pascal-Code zeichnet das Opengl-Dreieck mit einem VBO. Ich hatte beim Erzeugen dieses Code-Stücks eine steile Lernkurve und jede Menge Frust, denn beim Ändern einzelner Teile sind dann natürlich auch korrespondierende Teile anderswo zu ändern, aber da kann man leicht etwas übersehen, speziell wenn es gegen vier Uhr morgens geht. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===1. Zunächst die globalen Deklarationen===&lt;br /&gt;
&lt;br /&gt;
Typen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = packed record &lt;br /&gt;
    X, Y, Z, W: Single; &lt;br /&gt;
  end; &lt;br /&gt;
  &lt;br /&gt;
  TVBOVertex = packed record  &lt;br /&gt;
    Position,&lt;br /&gt;
    Color,&lt;br /&gt;
    Empty: TVector4f;&lt;br /&gt;
  end;&lt;br /&gt;
  &lt;br /&gt;
  TVBOBuffer   = array of TVBOVertex;&lt;br /&gt;
  TIndexBuffer = array of Word;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konstanten&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
const&lt;br /&gt;
  POS_OFFSET  =  Pointer(0);                  // Position-Offset als Zeiger&lt;br /&gt;
  COL_OFFSET  =  Pointer(SizeOf(TVector4D));  // Color-Offset als Zeiger&lt;br /&gt;
  STRIDE      =  SizeOf(TVBOVertex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  VBOBuffer:   TVBOBuffer;       // VBO-Daten&lt;br /&gt;
  IndexBuffer: TIndexBuffer;     // VBO-Indices&lt;br /&gt;
  VertexBufSize,                 // VBO-Daten: Puffergröße&lt;br /&gt;
  IndexBufSize,                  // VBO-Indices: Puffergröße &lt;br /&gt;
  IndexCount,                    // Anzahl der Indices&lt;br /&gt;
  IDVbo, IDIndex: Cardinal;      // Opengl-&amp;quot;Handles&amp;quot; für VBO- und Indexpuffer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante des VBO kann man sein eigenes Vertex definieren und ist nicht auf vorgegebene Datenstrukturen beschränkt wie bei den glInterleavedArrays. Der &amp;quot;Empty&amp;quot;-Vektor im TVBOVertex soll darauf hinweisen, dass man vorgegebene Vertexattribute mit benutzerdefinierten mischen kann. Das wird hier aber nicht behandelt. &lt;br /&gt;
&lt;br /&gt;
Ihr könnt die Typen definieren, wie Ihr wollt, aber es ergeben sich daraus Konsequenzen. Die Datendeklaration hat unmittelbaren Einfluss auf den untenstehenden Initialisierungs- und Rendercode. Wenn also der Datentyp geändert wird, muss man den ganzen untenstehenden Code auf notwendige Anpassungen untersuchen. Wie sich gezeigt hat, habe ich dabei immer wieder das eine oder andere vergessen. :(&lt;br /&gt;
&lt;br /&gt;
===2. Dann das Hochladen der Daten aus dem Hauptspeicher in den Grafikkartenspeicher===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  IndexCount :=  3;&lt;br /&gt;
&lt;br /&gt;
  VertexBufSize := IndexCount * SizeOf(TVBOVertex);&lt;br /&gt;
  IndexBufSize  := IndexCount * SizeOf(Word);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer erzeugen,initialisieren und mit Daten bestücken&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(VBOBuffer, IndexCount);&lt;br /&gt;
  FillChar(VBOBuffer[0], Length(VBOBuffer) * SizeOf(TVBOVertex), #0);&lt;br /&gt;
&lt;br /&gt;
  with VBOBuffer[0] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := -1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
  with VBOBuffer[1] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +1.0;&lt;br /&gt;
      Y := -1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
  with VBOBuffer[2] do begin&lt;br /&gt;
    with Position do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +1.0;&lt;br /&gt;
      Z := +0.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
    with Color do begin&lt;br /&gt;
      X := +0.0;&lt;br /&gt;
      Y := +0.0;&lt;br /&gt;
      Z := +1.0;&lt;br /&gt;
      W := +1.0;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1,@IDVbo);&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER,VertexBufSize,@VBOBuffer[0],GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe mit dem Indexpuffer&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer,IndexCount);&lt;br /&gt;
&lt;br /&gt;
  IndexBuffer[0]:= 0;&lt;br /&gt;
  IndexBuffer[1]:= 1;&lt;br /&gt;
  IndexBuffer[2]:= 2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1,@IDIndex);&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER,IndexBufSize,@IndexBuffer[0],GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich habe hier für den VBO einen Record genommen, weil bei den Demos im Netz normalerweise immer Arrays benutzt werden. Der Recordtyp ist zusätzlich viel selbsterklärender als ein Array und man kann ihn auch noch durch treffende Namensgebung verbessern. &lt;br /&gt;
&lt;br /&gt;
Abgesehen von der Entscheidung, welchen Datentyp man nehmen soll, ist das der einfachere Teil des Ganzen. Und damit es nicht ganz trivial wird, habe ich noch einen winzigen Indexbuffer definiert, damit ich zum Zeichnen glDrawElements verwenden kann. &lt;br /&gt;
&lt;br /&gt;
In den Beispielen, die man im Web finden kann, gibt es außerdem noch die Variante, wo glBufferdata nur zur Definition der Puffer-Parameter benutzt wird, aber für das Hochladen der Daten auf die Grafikkarte wird glBufferSubdata verwendet. Damit kann man entweder den ganzen Puffer oder auch nur Teile davon neu beschicken.&lt;br /&gt;
&lt;br /&gt;
===3. Der Rendercode===&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nötige Zeiger setzen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glVertexPointer(4, GL_FLOAT, STRIDE, POS_OFFSET);&lt;br /&gt;
  glColorPointer(4, GL_FLOAT, STRIDE, COL_OFFSET);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeichnen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
  glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
  glDrawElements(GL_TRIANGLES,IndexCount,GL_UNSIGNED_SHORT,NIL);&lt;br /&gt;
&lt;br /&gt;
  glDisableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
  glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über das Binden der Puffer gibt es eigentlich nicht viel zu sagen. Die OpenGL-Pufferobjekte sind alle ziemlich ähnlich.&lt;br /&gt;
&lt;br /&gt;
Aber bei den Zeigern kann man eine Menge falsch machen. Etliche Leute im Netz haben z.B. nachgeforscht, wie man den Parameter &amp;quot;Stride&amp;quot; zu interpretieren hat. Ich habe Stride ganz oben im Defnitionsteil als Konstante definiert: STRIDE = SizeOf(TVBOVertex); damit ist klar, dass hier die gesamte Blockgröße des Vertex gemeint ist. Die &amp;quot;Offset&amp;quot;-Parameter habe ich als Konstanten definiert weil sie von der Struktur des Vertex abhängen und daher vermutlich nicht dauernd geändert werden. &amp;quot;Offset&amp;quot; ist hier genau das richtige Wort. Zwischen dem Beginn des Vertex und der Color liegt eine Position mit dem Typ &amp;quot;TVector4D&amp;quot;, daher ist der Offset der Color SizeOf(TVector4D). '''Ganz wichtig''': die Offsets müssen an die gl*Pointer-Funktionen als Zeiger übergeben werden, siehe oben Definition der Offsets.&lt;br /&gt;
&lt;br /&gt;
Ich habe hier zwar kein nächstes Vertex-Element, aber wenn ich eines hätte, dann wäre dessen Offset COL_OFFSET+SizeOf(TVector4D) oder auch in Pseudoschreibweise: Offset(Color)+Size(Color).&lt;br /&gt;
&lt;br /&gt;
Nach dem Binden des Indexpuffers muss man den VBO Client-seitig aktivieren, und zwar für jeden Attribut-Typ extra. Wenn Ihr also eine Texturkoordinate ergänzen wollt - dazu muss man natürlich die Vertex-Definition ändern -, dann vergeßt bloß nicht das &amp;quot;glEnableClientState(GL_TEXTURE_COORD_ARRAY)&amp;quot; nachzutragen.&lt;br /&gt;
&lt;br /&gt;
So, jetzt kann man endlich zeichnen. Die Typangabe im glDrawElements beschreibt den Index und der letzte Parameter muss &amp;quot;NIL&amp;quot; sein, denn in unserem Fall ist dieser Parameter überflüssig (er wird in einem anderen Zusammenhang zum Nachladen der Daten benutzt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===4. Nachher reinen Tisch machen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer,0);&lt;br /&gt;
  SetLength(VBOBuffer,0);&lt;br /&gt;
  glDeleteBuffers(1,@IDVbo);&lt;br /&gt;
  glDeleteBuffers(1,@IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende werden die Daten freigegeben, sowohl im RAM (mit SetLength(Buffer,0)) als auch im GRAM (mit glDeleteBuffers).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und, naja, wenn man etwas auf eine solche Art zeichnet, sollte es natürlich nicht grade ein Dreieck sein. Das wäre nämlich so, als ob man um die Ecke in den Supermarkt gehen wollte und dazu einen Jumbojet benutzt. :) &lt;br /&gt;
&lt;br /&gt;
Insgesamt fand ich am Ende, dass ich Euch vielleicht ein wenig Zeit und Frust ersparen kann, wenn ich das Ganze ins DGL-Wiki stelle. &lt;br /&gt;
&lt;br /&gt;
Ich hoffe, es hilft.&amp;lt;br&amp;gt;&lt;br /&gt;
Viele Grüße,&amp;lt;br&amp;gt;&lt;br /&gt;
[[Benutzer:Traude|Traude]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Fragen und Verbesserungsvorschläge wie immer ins Feedback-Forum bei DelphiGL.com.''&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27015</id>
		<title>VBO ohne glInterleavedArrays</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=VBO_ohne_glInterleavedArrays&amp;diff=27015"/>
				<updated>2018-08-25T19:14:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* 1. Zunächst die globalen Deklarationen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Voraussetzung: mindestens OpenGL 1.5)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;VBO&amp;quot; ist die Abkürzung von &amp;quot;Vertex Buffer Object&amp;quot; und ist eine Möglichkeit der Darstellung von Objekten mit OpenGL.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, einen VBO zu verwenden. Die Variante, die ich unten erkläre, ist also nicht die einzige.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VBO mit frei definierter Datenstruktur, ohne glInterleavedArrays==&lt;br /&gt;
&lt;br /&gt;
Der untenstehende Pascal-Code zeichnet das Opengl-Dreieck mit einem VBO. Ich hatte beim Erzeugen dieses Code-Stücks eine steile Lernkurve und jede Menge Frust, denn beim Ändern einzelner Teile sind dann natürlich auch korrespondierende Teile anderswo zu ändern, aber da kann man leicht etwas übersehen, speziell wenn es gegen vier Uhr morgens geht. :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===1. Zunächst die globalen Deklarationen===&lt;br /&gt;
&lt;br /&gt;
Typen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TVector4f = packed record &lt;br /&gt;
    X, Y, Z, W: Single; &lt;br /&gt;
  end; &lt;br /&gt;
  &lt;br /&gt;
  TVBOVertex = packed record  &lt;br /&gt;
    Position,&lt;br /&gt;
    Color,&lt;br /&gt;
    Empty: TVector4f;&lt;br /&gt;
  end;&lt;br /&gt;
  &lt;br /&gt;
  TVBOBuffer   = array of TVBOVertex;&lt;br /&gt;
  TIndexBuffer = array of Word;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konstanten&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
const&lt;br /&gt;
  POS_OFFSET  =  Pointer(0);                  // Position-Offset als Zeiger&lt;br /&gt;
  COL_OFFSET  =  Pointer(SizeOf(TVector4D));  // Color-Offset als Zeiger&lt;br /&gt;
  STRIDE      =  SizeOf(TVBOVertex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  VBOBuffer:   TVBOBuffer;       // VBO-Daten&lt;br /&gt;
  IndexBuffer: TIndexBuffer;     // VBO-Indices&lt;br /&gt;
  VertexBufSize,                 // VBO-Daten: Puffergröße&lt;br /&gt;
  IndexBufSize,                  // VBO-Indices: Puffergröße &lt;br /&gt;
  IndexCount,                    // Anzahl der Indices&lt;br /&gt;
  IDVbo, IDIndex: Cardinal;      // Opengl-&amp;quot;Handles&amp;quot; für VBO- und Indexpuffer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante des VBO kann man sein eigenes Vertex definieren und ist nicht auf vorgegebene Datenstrukturen beschränkt wie bei den glInterleavedArrays. Der &amp;quot;Empty&amp;quot;-Vektor im TVBOVertex soll darauf hinweisen, dass man vorgegebene Vertexattribute mit benutzerdefinierten mischen kann. Das wird hier aber nicht behandelt. &lt;br /&gt;
&lt;br /&gt;
Ihr könnt die Typen definieren, wie Ihr wollt, aber es ergeben sich daraus Konsequenzen. Die Datendeklaration hat unmittelbaren Einfluss auf den untenstehenden Initialisierungs- und Rendercode. Wenn also der Datentyp geändert wird, muss man den ganzen untenstehenden Code auf notwendige Anpassungen untersuchen. Wie sich gezeigt hat, habe ich dabei immer wieder das eine oder andere vergessen. :(&lt;br /&gt;
&lt;br /&gt;
===2. Dann das Hochladen der Daten aus dem Hauptspeicher in den Grafikkartenspeicher===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  IndexCount:= 3;&lt;br /&gt;
&lt;br /&gt;
  VertexBufSize:= IndexCount*SizeOf(TVBOVertex);&lt;br /&gt;
  IndexBufSize:= IndexCount*SizeOf(Word);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer erzeugen,initialisieren und mit Daten bestücken&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(VBOBuffer,IndexCount);&lt;br /&gt;
  FillChar(VBOBuffer[0],Length(VBOBuffer)*SizeOf(TVBOVertex),#0);&lt;br /&gt;
&lt;br /&gt;
  With VBOBuffer[0] Do&lt;br /&gt;
  Begin&lt;br /&gt;
    With Position Do Begin X:=-1.0; Y:=-1.0; Z:=+0.0; W:=+1.0; End;&lt;br /&gt;
    With Color    Do Begin X:=+1.0; Y:=+0.0; Z:=+0.0; W:=+1.0; End;&lt;br /&gt;
  End;&lt;br /&gt;
  With VBOBuffer[1] Do&lt;br /&gt;
  Begin&lt;br /&gt;
    With Position Do Begin X:=+1.0; Y:=-1.0; Z:=+0.0; W:=+1.0; End;&lt;br /&gt;
    With Color    Do Begin X:=+0.0; Y:=+1.0; Z:=+0.0; W:=+1.0; End;&lt;br /&gt;
  End;&lt;br /&gt;
  With VBOBuffer[2] Do&lt;br /&gt;
  Begin&lt;br /&gt;
    With Position Do Begin X:=+0.0; Y:=+1.0; Z:=+0.0; W:=+1.0; End;&lt;br /&gt;
    With Color    Do Begin X:=+0.0; Y:=+0.0; Z:=+1.0; W:=+1.0; End;&lt;br /&gt;
  End;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1,@IDVbo);&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER,VertexBufSize,@VBOBuffer[0],GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe mit dem Indexpuffer&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer,IndexCount);&lt;br /&gt;
&lt;br /&gt;
  IndexBuffer[0]:= 0;&lt;br /&gt;
  IndexBuffer[1]:= 1;&lt;br /&gt;
  IndexBuffer[2]:= 2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexdaten hochladen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glGenBuffers(1,@IDIndex);&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER,IndexBufSize,@IndexBuffer[0],GL_STATIC_DRAW);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich habe hier für den VBO einen Record genommen, weil bei den Demos im Netz normalerweise immer Arrays benutzt werden. Der Recordtyp ist zusätzlich viel selbsterklärender als ein Array und man kann ihn auch noch durch treffende Namensgebung verbessern. &lt;br /&gt;
&lt;br /&gt;
Abgesehen von der Entscheidung, welchen Datentyp man nehmen soll, ist das der einfachere Teil des Ganzen. Und damit es nicht ganz trivial wird, habe ich noch einen winzigen Indexbuffer definiert, damit ich zum Zeichnen glDrawElements verwenden kann. &lt;br /&gt;
&lt;br /&gt;
In den Beispielen, die man im Web finden kann, gibt es außerdem noch die Variante, wo glBufferdata nur zur Definition der Puffer-Parameter benutzt wird, aber für das Hochladen der Daten auf die Grafikkarte wird glBufferSubdata verwendet. Damit kann man entweder den ganzen Puffer oder auch nur Teile davon neu beschicken. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===3. Der Rendercode===&lt;br /&gt;
&lt;br /&gt;
Vertexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, IDVbo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nötige Zeiger setzen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glVertexPointer(4, GL_FLOAT, STRIDE, POS_OFFSET);&lt;br /&gt;
  glColorPointer(4, GL_FLOAT, STRIDE, COL_OFFSET);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indexpuffer binden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeichnen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
  glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
  glDrawElements(GL_TRIANGLES,IndexCount,GL_UNSIGNED_SHORT,NIL);&lt;br /&gt;
&lt;br /&gt;
  glDisableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
  glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über das Binden der Puffer gibt es eigentlich nicht viel zu sagen. Die OpenGL-Pufferobjekte sind alle ziemlich ähnlich.&lt;br /&gt;
&lt;br /&gt;
Aber bei den Zeigern kann man eine Menge falsch machen. Etliche Leute im Netz haben z.B. nachgeforscht, wie man den Parameter &amp;quot;Stride&amp;quot; zu interpretieren hat. Ich habe Stride ganz oben im Defnitionsteil als Konstante definiert: STRIDE = SizeOf(TVBOVertex); damit ist klar, dass hier die gesamte Blockgröße des Vertex gemeint ist. Die &amp;quot;Offset&amp;quot;-Parameter habe ich als Konstanten definiert weil sie von der Struktur des Vertex abhängen und daher vermutlich nicht dauernd geändert werden. &amp;quot;Offset&amp;quot; ist hier genau das richtige Wort. Zwischen dem Beginn des Vertex und der Color liegt eine Position mit dem Typ &amp;quot;TVector4D&amp;quot;, daher ist der Offset der Color SizeOf(TVector4D). '''Ganz wichtig''': die Offsets müssen an die gl*Pointer-Funktionen als Zeiger übergeben werden, siehe oben Definition der Offsets.&lt;br /&gt;
&lt;br /&gt;
Ich habe hier zwar kein nächstes Vertex-Element, aber wenn ich eines hätte, dann wäre dessen Offset COL_OFFSET+SizeOf(TVector4D) oder auch in Pseudoschreibweise: Offset(Color)+Size(Color).&lt;br /&gt;
&lt;br /&gt;
Nach dem Binden des Indexpuffers muss man den VBO Client-seitig aktivieren, und zwar für jeden Attribut-Typ extra. Wenn Ihr also eine Texturkoordinate ergänzen wollt - dazu muss man natürlich die Vertex-Definition ändern -, dann vergeßt bloß nicht das &amp;quot;glEnableClientState(GL_TEXTURE_COORD_ARRAY)&amp;quot; nachzutragen.&lt;br /&gt;
&lt;br /&gt;
So, jetzt kann man endlich zeichnen. Die Typangabe im glDrawElements beschreibt den Index und der letzte Parameter muss &amp;quot;NIL&amp;quot; sein, denn in unserem Fall ist dieser Parameter überflüssig (er wird in einem anderen Zusammenhang zum Nachladen der Daten benutzt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===4. Nachher reinen Tisch machen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  SetLength(IndexBuffer,0);&lt;br /&gt;
  SetLength(VBOBuffer,0);&lt;br /&gt;
  glDeleteBuffers(1,@IDVbo);&lt;br /&gt;
  glDeleteBuffers(1,@IDIndex);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende werden die Daten freigegeben, sowohl im RAM (mit SetLength(Buffer,0)) als auch im GRAM (mit glDeleteBuffers).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und, naja, wenn man etwas auf eine solche Art zeichnet, sollte es natürlich nicht grade ein Dreieck sein. Das wäre nämlich so, als ob man um die Ecke in den Supermarkt gehen wollte und dazu einen Jumbojet benutzt. :) &lt;br /&gt;
&lt;br /&gt;
Insgesamt fand ich am Ende, dass ich Euch vielleicht ein wenig Zeit und Frust ersparen kann, wenn ich das Ganze ins DGL-Wiki stelle. &lt;br /&gt;
&lt;br /&gt;
Ich hoffe, es hilft.&amp;lt;br&amp;gt;&lt;br /&gt;
Viele Grüße,&amp;lt;br&amp;gt;&lt;br /&gt;
[[Benutzer:Traude|Traude]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Fragen und Verbesserungsvorschläge wie immer ins Feedback-Forum bei DelphiGL.com.''&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Stack&amp;diff=27014</id>
		<title>Stack</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Stack&amp;diff=27014"/>
				<updated>2018-08-25T19:06:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Siehe Auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Stack (Stapel, Stapelspeicher, ''veraltet auch Kellerspeicher'') ist eine Datenstruktur, welche Daten nach dem LIFO-Prinzip speichert.&lt;br /&gt;
&lt;br /&gt;
==Was ist LIFO?==&lt;br /&gt;
[[Bild:Bücherstapel.jpg|right|thumb|Bücherstapel]]&lt;br /&gt;
LIFO steht für ''Last In - First Out'', d.h. das zuletzt gespeicherte Datum wird zuerst entnommen.&lt;br /&gt;
&lt;br /&gt;
Im realen Leben findet man das LIFO Prinzip bei einem Bücherstapel. Bei selbigen sollte man vermeiden, Bücher aus der Mitte zu entfernen. Am sichersten ist es immer, das oberste Buch zu entfernen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
Stacks können mittels einfach verketteten Listen implementiert werden. &lt;br /&gt;
&lt;br /&gt;
Die Methode {{INLINE_CODE|Push()}} fügt eine neues Element am Kopf der Liste an, {{INLINE_CODE|Pop()}} entfernt das erste Element der Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==OpenGL Relevanz==&lt;br /&gt;
Stacks finden an verschiedenen Stellen innerhalb der OpenGL Verwendung. So existiert für die 3 Hauptmatrixmodi (siehe [[glMatrixMode]]) jeweils ein eigener [[Matrixstack]]. &lt;br /&gt;
&lt;br /&gt;
Für Eigenschaften wie z.B. die Farbe, oder welche Tests aktiv sind, existiert der Attribut-Stack (siehe [[glPushAttrib]]).&lt;br /&gt;
Für die [[Selektion]] existiert der Name-Stack, welcher [[OpenGL Name|OpenGL-Namen]] speichert.&lt;br /&gt;
&lt;br /&gt;
Die maximale Höhe/Tiefe (Menge an Informationen) ist implementationsabhängig und kann mit [[glGet]] abgefragt werden. (Als Parameter dienen die GL_MAX_''STACKNAME''_STACK_DEPTH Konstanten.)&lt;br /&gt;
&lt;br /&gt;
==OpenGL Funktionen==&lt;br /&gt;
* [[glPushAttrib]], [[glPushClientAttrib]], [[glPushMatrix]]&lt;br /&gt;
* [[glPopAttrib]], [[glPopClientAttrib]], [[glPopMatrix]]&lt;br /&gt;
&lt;br /&gt;
==Siehe Auch==&lt;br /&gt;
* [[Queue]], [[FIFO]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Stack&amp;diff=27013</id>
		<title>Stack</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Stack&amp;diff=27013"/>
				<updated>2018-08-25T19:05:56Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* OpenGL Funktionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Stack (Stapel, Stapelspeicher, ''veraltet auch Kellerspeicher'') ist eine Datenstruktur, welche Daten nach dem LIFO-Prinzip speichert.&lt;br /&gt;
&lt;br /&gt;
==Was ist LIFO?==&lt;br /&gt;
[[Bild:Bücherstapel.jpg|right|thumb|Bücherstapel]]&lt;br /&gt;
LIFO steht für ''Last In - First Out'', d.h. das zuletzt gespeicherte Datum wird zuerst entnommen.&lt;br /&gt;
&lt;br /&gt;
Im realen Leben findet man das LIFO Prinzip bei einem Bücherstapel. Bei selbigen sollte man vermeiden, Bücher aus der Mitte zu entfernen. Am sichersten ist es immer, das oberste Buch zu entfernen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
Stacks können mittels einfach verketteten Listen implementiert werden. &lt;br /&gt;
&lt;br /&gt;
Die Methode {{INLINE_CODE|Push()}} fügt eine neues Element am Kopf der Liste an, {{INLINE_CODE|Pop()}} entfernt das erste Element der Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==OpenGL Relevanz==&lt;br /&gt;
Stacks finden an verschiedenen Stellen innerhalb der OpenGL Verwendung. So existiert für die 3 Hauptmatrixmodi (siehe [[glMatrixMode]]) jeweils ein eigener [[Matrixstack]]. &lt;br /&gt;
&lt;br /&gt;
Für Eigenschaften wie z.B. die Farbe, oder welche Tests aktiv sind, existiert der Attribut-Stack (siehe [[glPushAttrib]]).&lt;br /&gt;
Für die [[Selektion]] existiert der Name-Stack, welcher [[OpenGL Name|OpenGL-Namen]] speichert.&lt;br /&gt;
&lt;br /&gt;
Die maximale Höhe/Tiefe (Menge an Informationen) ist implementationsabhängig und kann mit [[glGet]] abgefragt werden. (Als Parameter dienen die GL_MAX_''STACKNAME''_STACK_DEPTH Konstanten.)&lt;br /&gt;
&lt;br /&gt;
==OpenGL Funktionen==&lt;br /&gt;
* [[glPushAttrib]], [[glPushClientAttrib]], [[glPushMatrix]]&lt;br /&gt;
* [[glPopAttrib]], [[glPopClientAttrib]], [[glPopMatrix]]&lt;br /&gt;
&lt;br /&gt;
==Siehe Auch==&lt;br /&gt;
[[Queue]], [[FIFO]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=27012</id>
		<title>glBegin</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=27012"/>
				<updated>2018-08-25T18:57:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Excellent}}&lt;br /&gt;
= glBegin, glEnd =&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glBegin, glEnd''' - Umschließen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher Primitiven.&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glBegin'''(''mode'' : GLEnum);&lt;br /&gt;
 procedure '''glEnd''';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''mode'' &lt;br /&gt;
| Bestimmt die [[Primitive]] bzw. Gruppe von [[Primitive|Primitiven]] die aus den von '''glBegin''' und '''glEnd''' umschlossenen [[Eckpunkt|Eckpunkten (Vertices)]] erstellt werden.&lt;br /&gt;
Erlaubt sind die folgenden zehn symbolischen Konstanten:&lt;br /&gt;
'''GL_POINTS''', '''GL_LINES''', '''GL_LINE_STRIP''', '''GL_LINE_LOOP''', '''GL_TRIANGLES''', '''GL_TRIANGLE_STRIP''', '''GL_TRIANGLE_FAN''', '''GL_QUADS''', '''GL_QUAD_STRIP''', und '''GL_POLYGON'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glBegin''' und '''glEnd''' umschließen eine Liste von [[Eckpunkt|Eckpunkten (Vertices)]] die eine [[Primitive]] oder Gruppe von [[Primitive|Primitiven]] darstellt. '''glBegin''' erhält ein einzelnes Argument (''mode''), das angibt, auf welche Art und Weise die [[Eckpunkt|Eckpunkte (Vertices)]] interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Unter der Annahme ''n'' sei ein Integerwert der bei Eins beginnt und ''N'' als Integerwert der die Gesamtanzahl der übergebenen Eckpunkte angibt, ergeben sich folgende Interpretationen :&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!mode&lt;br /&gt;
!Einschätzung&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POINTS'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|langsam&lt;br /&gt;
|[[Bild:Glbegin_points.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt ''n'' definiert Punkt ''n'', und ''N'' Punkte werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINES'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|mittel&lt;br /&gt;
|[[Bild:Glbegin_lines.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*''n''-1 und 2*''n'' beschreiben Linie n. N/2 Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_linestrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine Gruppe von miteinander verbundenen Liniensegmenten, beginnend beim ersten Eckpunkt bis zum letzten. Eckpunkte ''n'' und ''n+1'' beschreiben dabei Linie ''n''. ''N-1'' Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_LOOP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_lineloop.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschließend zurück zum ersten. Eckpunkte ''n'' und ''n+1'' definieren Linie ''n''. Die letzte Linie wird jedoch durch die Eckpunkte ''N'' und 1 definiert. ''N'' Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLES'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_triangles.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jedes Eckpunkt-Trio als unabhängiges Dreieck. Eckpunkte 3*''n''-2, 3*''n''-1 und 3*''n'' beschreiben Dreieck ''n''. ''N''/3 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke bestehen aus jeweils 3 Vertices, die ausschließlich nur zu diesem Dreieck gehören.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|am schnellsten&lt;br /&gt;
|[[Bild:Glbegin_trianglestrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt der nach den beiden ersten Eckpunkten definiert wird gerendert. Für ein ungerades ''n'' definieren die Eckpunkte ''n'', ''n''+1 und ''n''+2 Dreieck ''n'', für gerade ''n''s definieren die Eckpunkte ''n''+1, ''n'' und ''n''+2 ein Dreieck. (Man beachte, dass die Reihenfolge bei geraden ''n'' impliziet geändert wird um entgegen der Uhrzeigerrichtung zu rendern. Siehe auch [[glFrontFace]])&lt;br /&gt;
&lt;br /&gt;
''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_FAN'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_trianglefan.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt gerendert der nach den ersten beiden definiert wird. Eckpunkte 1, ''n''+1 und ''n''+2 definieren Dreieck ''n''. ''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke haben mindestens einen gemeinsamen Punkt (Vertex1).&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUADS'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_quads.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jeweils vier Eckpunkte als unabhängiges Viereck. Eckpunkte 4*''n''-3, 4*''n''-2, 4*''n''-1 und 4*''n'' beschreiben Viereck ''n''. ''N''/4 Vierecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Vierecke bestehen aus jeweils 4 Vertices, die ausschließlich nur zu diesem Viereck gehören.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUAD_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_quadstrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*''n''-1, 2*''n'', 2*''n''+2 und 2*''n''+1 beschreiben Viereck ''n''. ''N''/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, dass die Reihenfolge der Eckpunkte, die genutzt werden, um Vierecke aus einem Streifen zu generieren, unterschiedlich ggü. der unabhängigen Konstruktion sind.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Vierecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Vierecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POLYGON'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|(langsam)&lt;br /&gt;
|[[Bild:Glbegin_polygon.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine einzelnes, [[konvex|konvexes]] Polygon (=Vieleck). Eckpunkte 1 bis ''N'' definieren dieses Polygon.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis'''&lt;br /&gt;
&lt;br /&gt;
GL_POLYGON scheint für Anfänger meist die &amp;quot;beste Lösung&amp;quot; zu sein, denn man kann alle möglichen (konvexen) Polygone erzeugen. Dies ist soweit richtig, allerdings ist GL_POLYGON um ein vielfaches langsamer als GL_TRIANGLES! Dies hat die folgenden Gründe: &amp;lt;br&amp;gt;&lt;br /&gt;
1. sind moderne Grafikkarten auf die Darstellung von Dreiecken optimiert und &amp;lt;br&amp;gt;&lt;br /&gt;
2. müssen die Polygone bevor sie von den Grafikkarten verwendet werden können, erst in Dreiecke zerlegt werden (siehe [[Triangulation]]). &amp;lt;br&amp;gt;&lt;br /&gt;
Vorallem der letzte Punkt sorgt für niedrige Frameraten im Vergleich zu dreiecksbasierten Strukturen.&amp;lt;br&amp;gt;&lt;br /&gt;
''Die OpenGL-Spezifikiation erlaubt es jedoch GL_POLYGON annähernd gleich zu behandeln  wie GL_TRIANGLE_FAN (die Ausnahme bildet der Wireframe-Modus mit [[glPolygonMode]]), was auch von vielen Grafikkarten in dieser Form umgesetzt wird. Ist dies der Fall, so fallen alle Vor- und Nachteile gegenüber GL_TRIANGLE_FAN weg.''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nur eine Untergruppe von GL Befehlen kann zwischen '''glBegin''' und '''glEnd''' genutzt werden. Die Befehle sind [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]] und [[glEdgeFlag]]. Außerdem ist es erlaubt  [[glCallList]] oder [[glCallLists]] zu nutzen, um [[Displaylisten]] auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen '''glBegin''' und '''glEnd''' ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert.&lt;br /&gt;
&lt;br /&gt;
Unabhängig des für ''mode'' übergebenen Wertes gibt es '''keine''' Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen '''glBegin''' und '''glEnd''' definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügendend beschrieben wurden, werden nicht gerendert.&lt;br /&gt;
Ungenügende Beschreibung bedeutet entweder, dass zu wenige Eckpunkte angegeben wurden, um eine einzelne [[Primitive]] zu beschreiben, oder ein inkorrektes Vielfaches an Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet.&lt;br /&gt;
&lt;br /&gt;
Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt :&lt;br /&gt;
*1 für einen Punkt&lt;br /&gt;
*2 für eine Linie&lt;br /&gt;
*3 für ein Dreieck&lt;br /&gt;
*4 für ein Viereck und &lt;br /&gt;
*3 für ein Polygon. &lt;br /&gt;
Modi die ein festgelegtes Vielfaches an Eckpunkten brauchen sind '''GL_LINES''' (2), '''GL_TRIANGLES''' (3), '''GL_QUADS''' (4), und '''GL_QUAD_STRIP''' (2).  ''(D.h. wenn man bei GL_TRIANGLES 8 Vertices angibt (kein Vielfaches von 3), werden nur die ersten 6 bearbeitet. Die restlichen 2 ergeben kein Dreieck und werden deshalb verworfen.)''&lt;br /&gt;
&lt;br /&gt;
Wenn Flächen gemeinsame Punkte haben (z.B. bei '''GL_TRIANGLE_FAN''') ist es nicht möglich die Eigenschaften dieser Vertices für jede Fläche individuell zu bestimmen. Wenn dies nötig sein sollte, müssen die entsprechenden Flächen aus individuellen Vertices zusammengestellt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
=== Ab OpenGL-Version 1.3 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glMultiTexCoord]]&lt;br /&gt;
=== Ab OpenGL-Version 1.4 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glFogCoord]]&lt;br /&gt;
*[[glSecondaryColor]]&lt;br /&gt;
=== Ab OpenGL-Version 2.0 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glVertexAttrib]]&lt;br /&gt;
&lt;br /&gt;
=== Ab OpenGL-Version 3.3 ===&lt;br /&gt;
'''glBegin/glEnd''' wird '''nicht''' mehr unterstützt, dies betrifft auch die dort eingeschlossenen Funktionen.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_ENUM''' wird ausgelöst, wenn ''mode'' einen ungültigen Wert besitzt.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn zwischen '''glBegin''' und dem zugehörigen '''glEnd''' ein weiteres '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn '''glEnd''' ohne ein vorhergehendes '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird aufgerufen, wenn ein anderer Befehl als [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], [[glEdgeFlag]], [[glCallList]] oder [[glCallLists]] zwischen '''glBegin''' und dem zugehörigen '''glEnd''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]],  [[glPushClientAttrib]],  [[glPopClientAttrib]], [[glEdgeFlagPointer]], [[glFogCoordPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glSecondaryColorPointer]] [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glVertexAttribPointer]], [[glInterleavedArrays]] oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;|Code&lt;br /&gt;
!Ausgabe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;glBegin(GL_TRIANGLES);&lt;br /&gt;
    glVertex3f(1, 0, 0);&lt;br /&gt;
    glVertex3f(0, 1, 0);&lt;br /&gt;
    glVertex3f(0, 0, 1);&lt;br /&gt;
glEnd;&amp;lt;/source&amp;gt;&lt;br /&gt;
|[[Bild:GlBegin_Bsp1.jpg|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zwischen glBegin und glEnd können natürlich auch &amp;quot;nicht OpenGL&amp;quot;-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;|Code&lt;br /&gt;
!Ausgabe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
glBegin(GL_LINE_STRIP);&lt;br /&gt;
  f := 0.0;&lt;br /&gt;
  for i := 0 to 20 do begin&lt;br /&gt;
    glVertex3f(cos(f), sin(f), 0);&lt;br /&gt;
    f := f + (2 * Pi / 20);&lt;br /&gt;
  end;&lt;br /&gt;
glEnd;&amp;lt;/source&amp;gt;&lt;br /&gt;
|[[Bild:GlBegin_Bsp2.jpg|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glArrayElement]], [[glCallList]], [[glCallLists]], [[glColor]], [[glEdgeFlag]], [[glEvalCoord]], [[glEvalPoint]], [[glFogCoord]], [[glIndex]], [[glMaterial]], [[glMultiTexCoord]], [[glNormal]], [[glSecondaryColor]], [[glTexCoord]], [[glVertex]], [[glVertexAttrib]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|Begin]]&lt;br /&gt;
 [[Kategorie:GL1.0|Begin]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=27011</id>
		<title>glBegin</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=27011"/>
				<updated>2018-08-25T18:55:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Ab OpenGL-Version 3.3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Excellent}}&lt;br /&gt;
= glBegin, glEnd =&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glBegin, glEnd''' - Umschließen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher Primitiven.&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glBegin'''(''mode'' : GLEnum);&lt;br /&gt;
 procedure '''glEnd''';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''mode'' &lt;br /&gt;
| Bestimmt die [[Primitive]] bzw. Gruppe von [[Primitive|Primitiven]] die aus den von '''glBegin''' und '''glEnd''' umschlossenen [[Eckpunkt|Eckpunkten (Vertices)]] erstellt werden.&lt;br /&gt;
Erlaubt sind die folgenden zehn symbolischen Konstanten:&lt;br /&gt;
'''GL_POINTS''', '''GL_LINES''', '''GL_LINE_STRIP''', '''GL_LINE_LOOP''', '''GL_TRIANGLES''', '''GL_TRIANGLE_STRIP''', '''GL_TRIANGLE_FAN''', '''GL_QUADS''', '''GL_QUAD_STRIP''', und '''GL_POLYGON'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glBegin''' und '''glEnd''' umschließen eine Liste von [[Eckpunkt|Eckpunkten (Vertices)]] die eine [[Primitive]] oder Gruppe von [[Primitive|Primitiven]] darstellt. '''glBegin''' erhält ein einzelnes Argument (''mode''), das angibt, auf welche Art und Weise die [[Eckpunkt|Eckpunkte (Vertices)]] interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Unter der Annahme ''n'' sei ein Integerwert der bei Eins beginnt und ''N'' als Integerwert der die Gesamtanzahl der übergebenen Eckpunkte angibt, ergeben sich folgende Interpretationen :&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!mode&lt;br /&gt;
!Einschätzung&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POINTS'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|langsam&lt;br /&gt;
|[[Bild:Glbegin_points.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt ''n'' definiert Punkt ''n'', und ''N'' Punkte werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINES'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|mittel&lt;br /&gt;
|[[Bild:Glbegin_lines.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*''n''-1 und 2*''n'' beschreiben Linie n. N/2 Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_linestrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine Gruppe von miteinander verbundenen Liniensegmenten, beginnend beim ersten Eckpunkt bis zum letzten. Eckpunkte ''n'' und ''n+1'' beschreiben dabei Linie ''n''. ''N-1'' Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_LOOP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_lineloop.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschließend zurück zum ersten. Eckpunkte ''n'' und ''n+1'' definieren Linie ''n''. Die letzte Linie wird jedoch durch die Eckpunkte ''N'' und 1 definiert. ''N'' Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLES'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_triangles.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jedes Eckpunkt-Trio als unabhängiges Dreieck. Eckpunkte 3*''n''-2, 3*''n''-1 und 3*''n'' beschreiben Dreieck ''n''. ''N''/3 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke bestehen aus jeweils 3 Vertices, die ausschließlich nur zu diesem Dreieck gehören.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|am schnellsten&lt;br /&gt;
|[[Bild:Glbegin_trianglestrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt der nach den beiden ersten Eckpunkten definiert wird gerendert. Für ein ungerades ''n'' definieren die Eckpunkte ''n'', ''n''+1 und ''n''+2 Dreieck ''n'', für gerade ''n''s definieren die Eckpunkte ''n''+1, ''n'' und ''n''+2 ein Dreieck. (Man beachte, dass die Reihenfolge bei geraden ''n'' impliziet geändert wird um entgegen der Uhrzeigerrichtung zu rendern. Siehe auch [[glFrontFace]])&lt;br /&gt;
&lt;br /&gt;
''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_FAN'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_trianglefan.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt gerendert der nach den ersten beiden definiert wird. Eckpunkte 1, ''n''+1 und ''n''+2 definieren Dreieck ''n''. ''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke haben mindestens einen gemeinsamen Punkt (Vertex1).&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUADS'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_quads.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jeweils vier Eckpunkte als unabhängiges Viereck. Eckpunkte 4*''n''-3, 4*''n''-2, 4*''n''-1 und 4*''n'' beschreiben Viereck ''n''. ''N''/4 Vierecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Vierecke bestehen aus jeweils 4 Vertices, die ausschließlich nur zu diesem Viereck gehören.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUAD_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_quadstrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*''n''-1, 2*''n'', 2*''n''+2 und 2*''n''+1 beschreiben Viereck ''n''. ''N''/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, dass die Reihenfolge der Eckpunkte, die genutzt werden, um Vierecke aus einem Streifen zu generieren, unterschiedlich ggü. der unabhängigen Konstruktion sind.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Vierecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Vierecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POLYGON'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|(langsam)&lt;br /&gt;
|[[Bild:Glbegin_polygon.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine einzelnes, [[konvex|konvexes]] Polygon (=Vieleck). Eckpunkte 1 bis ''N'' definieren dieses Polygon.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis'''&lt;br /&gt;
&lt;br /&gt;
GL_POLYGON scheint für Anfänger meist die &amp;quot;beste Lösung&amp;quot; zu sein, denn man kann alle möglichen (konvexen) Polygone erzeugen. Dies ist soweit richtig, allerdings ist GL_POLYGON um ein vielfaches langsamer als GL_TRIANGLES! Dies hat die folgenden Gründe: &amp;lt;br&amp;gt;&lt;br /&gt;
1. sind moderne Grafikkarten auf die Darstellung von Dreiecken optimiert und &amp;lt;br&amp;gt;&lt;br /&gt;
2. müssen die Polygone bevor sie von den Grafikkarten verwendet werden können, erst in Dreiecke zerlegt werden (siehe [[Triangulation]]). &amp;lt;br&amp;gt;&lt;br /&gt;
Vorallem der letzte Punkt sorgt für niedrige Frameraten im Vergleich zu dreiecksbasierten Strukturen.&amp;lt;br&amp;gt;&lt;br /&gt;
''Die OpenGL-Spezifikiation erlaubt es jedoch GL_POLYGON annähernd gleich zu behandeln  wie GL_TRIANGLE_FAN (die Ausnahme bildet der Wireframe-Modus mit [[glPolygonMode]]), was auch von vielen Grafikkarten in dieser Form umgesetzt wird. Ist dies der Fall, so fallen alle Vor- und Nachteile gegenüber GL_TRIANGLE_FAN weg.''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nur eine Untergruppe von GL Befehlen kann zwischen '''glBegin''' und '''glEnd''' genutzt werden. Die Befehle sind [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]] und [[glEdgeFlag]]. Außerdem ist es erlaubt  [[glCallList]] oder [[glCallLists]] zu nutzen, um [[Displaylisten]] auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen '''glBegin''' und '''glEnd''' ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert.&lt;br /&gt;
&lt;br /&gt;
Unabhängig des für ''mode'' übergebenen Wertes gibt es '''keine''' Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen '''glBegin''' und '''glEnd''' definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügendend beschrieben wurden, werden nicht gerendert.&lt;br /&gt;
Ungenügende Beschreibung bedeutet entweder, dass zu wenige Eckpunkte angegeben wurden, um eine einzelne [[Primitive]] zu beschreiben, oder ein inkorrektes Vielfaches an Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet.&lt;br /&gt;
&lt;br /&gt;
Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt :&lt;br /&gt;
*1 für einen Punkt&lt;br /&gt;
*2 für eine Linie&lt;br /&gt;
*3 für ein Dreieck&lt;br /&gt;
*4 für ein Viereck und &lt;br /&gt;
*3 für ein Polygon. &lt;br /&gt;
Modi die ein festgelegtes Vielfaches an Eckpunkten brauchen sind '''GL_LINES''' (2), '''GL_TRIANGLES''' (3), '''GL_QUADS''' (4), und '''GL_QUAD_STRIP''' (2).  ''(D.h. wenn man bei GL_TRIANGLES 8 Vertices angibt (kein Vielfaches von 3), werden nur die ersten 6 bearbeitet. Die restlichen 2 ergeben kein Dreieck und werden deshalb verworfen.)''&lt;br /&gt;
&lt;br /&gt;
Wenn Flächen gemeinsame Punkte haben (z.B. bei '''GL_TRIANGLE_FAN''') ist es nicht möglich die Eigenschaften dieser Vertices für jede Fläche individuell zu bestimmen. Wenn dies nötig sein sollte, müssen die entsprechenden Flächen aus individuellen Vertices zusammengestellt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
=== Ab OpenGL-Version 1.3 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glMultiTexCoord]]&lt;br /&gt;
=== Ab OpenGL-Version 1.4 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glFogCoord]]&lt;br /&gt;
*[[glSecondaryColor]]&lt;br /&gt;
=== Ab OpenGL-Version 2.0 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glVertexAttrib]]&lt;br /&gt;
&lt;br /&gt;
=== Ab OpenGL-Version 3.3 ===&lt;br /&gt;
'''glBegin/glEnd''' wird '''nicht''' mehr unterstützt, dies betrifft auch die dort eingeschlossenen Funktionen.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_ENUM''' wird ausgelöst, wenn ''mode'' einen ungültigen Wert besitzt.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn zwischen '''glBegin''' und dem zugehörigen '''glEnd''' ein weiteres '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn '''glEnd''' ohne ein vorhergehendes '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird aufgerufen, wenn ein anderer Befehl als [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], [[glEdgeFlag]], [[glCallList]] oder [[glCallLists]] zwischen '''glBegin''' und dem zugehörigen '''glEnd''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]],  [[glPushClientAttrib]],  [[glPopClientAttrib]], [[glEdgeFlagPointer]], [[glFogCoordPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glSecondaryColorPointer]] [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glVertexAttribPointer]], [[glInterleavedArrays]] oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;|Code&lt;br /&gt;
!Ausgabe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;glBegin(GL_TRIANGLES);&lt;br /&gt;
    glVertex3f(1,0,0);&lt;br /&gt;
    glVertex3f(0,1,0);&lt;br /&gt;
    glVertex3f(0,0,1);&lt;br /&gt;
glEnd;&amp;lt;/source&amp;gt;&lt;br /&gt;
|[[Bild:GlBegin_Bsp1.jpg|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zwischen glBegin und glEnd können natürlich auch &amp;quot;nicht OpenGL&amp;quot;-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;|Code&lt;br /&gt;
!Ausgabe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
glBegin(GL_LINE_STRIP);&lt;br /&gt;
  f := 0.0;&lt;br /&gt;
  for i:=0 to 20 do&lt;br /&gt;
  begin&lt;br /&gt;
    glVertex3f(cos(f),sin(f),0);&lt;br /&gt;
    f := f + (2*Pi/20);&lt;br /&gt;
  end;&lt;br /&gt;
glEnd;&amp;lt;/source&amp;gt;&lt;br /&gt;
|[[Bild:GlBegin_Bsp2.jpg|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glArrayElement]], [[glCallList]], [[glCallLists]], [[glColor]], [[glEdgeFlag]], [[glEvalCoord]], [[glEvalPoint]], [[glFogCoord]], [[glIndex]], [[glMaterial]], [[glMultiTexCoord]], [[glNormal]], [[glSecondaryColor]], [[glTexCoord]], [[glVertex]], [[glVertexAttrib]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|Begin]]&lt;br /&gt;
 [[Kategorie:GL1.0|Begin]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=27010</id>
		<title>glBegin</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=27010"/>
				<updated>2018-08-25T18:55:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Ab OpenGL-Version 2.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Excellent}}&lt;br /&gt;
= glBegin, glEnd =&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glBegin, glEnd''' - Umschließen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher Primitiven.&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glBegin'''(''mode'' : GLEnum);&lt;br /&gt;
 procedure '''glEnd''';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''mode'' &lt;br /&gt;
| Bestimmt die [[Primitive]] bzw. Gruppe von [[Primitive|Primitiven]] die aus den von '''glBegin''' und '''glEnd''' umschlossenen [[Eckpunkt|Eckpunkten (Vertices)]] erstellt werden.&lt;br /&gt;
Erlaubt sind die folgenden zehn symbolischen Konstanten:&lt;br /&gt;
'''GL_POINTS''', '''GL_LINES''', '''GL_LINE_STRIP''', '''GL_LINE_LOOP''', '''GL_TRIANGLES''', '''GL_TRIANGLE_STRIP''', '''GL_TRIANGLE_FAN''', '''GL_QUADS''', '''GL_QUAD_STRIP''', und '''GL_POLYGON'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glBegin''' und '''glEnd''' umschließen eine Liste von [[Eckpunkt|Eckpunkten (Vertices)]] die eine [[Primitive]] oder Gruppe von [[Primitive|Primitiven]] darstellt. '''glBegin''' erhält ein einzelnes Argument (''mode''), das angibt, auf welche Art und Weise die [[Eckpunkt|Eckpunkte (Vertices)]] interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Unter der Annahme ''n'' sei ein Integerwert der bei Eins beginnt und ''N'' als Integerwert der die Gesamtanzahl der übergebenen Eckpunkte angibt, ergeben sich folgende Interpretationen :&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!mode&lt;br /&gt;
!Einschätzung&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POINTS'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|langsam&lt;br /&gt;
|[[Bild:Glbegin_points.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt ''n'' definiert Punkt ''n'', und ''N'' Punkte werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINES'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|mittel&lt;br /&gt;
|[[Bild:Glbegin_lines.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*''n''-1 und 2*''n'' beschreiben Linie n. N/2 Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_linestrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine Gruppe von miteinander verbundenen Liniensegmenten, beginnend beim ersten Eckpunkt bis zum letzten. Eckpunkte ''n'' und ''n+1'' beschreiben dabei Linie ''n''. ''N-1'' Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_LOOP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_lineloop.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschließend zurück zum ersten. Eckpunkte ''n'' und ''n+1'' definieren Linie ''n''. Die letzte Linie wird jedoch durch die Eckpunkte ''N'' und 1 definiert. ''N'' Linien werden gerendert.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLES'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_triangles.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jedes Eckpunkt-Trio als unabhängiges Dreieck. Eckpunkte 3*''n''-2, 3*''n''-1 und 3*''n'' beschreiben Dreieck ''n''. ''N''/3 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke bestehen aus jeweils 3 Vertices, die ausschließlich nur zu diesem Dreieck gehören.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|am schnellsten&lt;br /&gt;
|[[Bild:Glbegin_trianglestrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt der nach den beiden ersten Eckpunkten definiert wird gerendert. Für ein ungerades ''n'' definieren die Eckpunkte ''n'', ''n''+1 und ''n''+2 Dreieck ''n'', für gerade ''n''s definieren die Eckpunkte ''n''+1, ''n'' und ''n''+2 ein Dreieck. (Man beachte, dass die Reihenfolge bei geraden ''n'' impliziet geändert wird um entgegen der Uhrzeigerrichtung zu rendern. Siehe auch [[glFrontFace]])&lt;br /&gt;
&lt;br /&gt;
''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_FAN'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_trianglefan.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt gerendert der nach den ersten beiden definiert wird. Eckpunkte 1, ''n''+1 und ''n''+2 definieren Dreieck ''n''. ''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke haben mindestens einen gemeinsamen Punkt (Vertex1).&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUADS'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_quads.jpg|350px|thumb|right]]&lt;br /&gt;
Behandelt jeweils vier Eckpunkte als unabhängiges Viereck. Eckpunkte 4*''n''-3, 4*''n''-2, 4*''n''-1 und 4*''n'' beschreiben Viereck ''n''. ''N''/4 Vierecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Vierecke bestehen aus jeweils 4 Vertices, die ausschließlich nur zu diesem Viereck gehören.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUAD_STRIP'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_quadstrip.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*''n''-1, 2*''n'', 2*''n''+2 und 2*''n''+1 beschreiben Viereck ''n''. ''N''/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, dass die Reihenfolge der Eckpunkte, die genutzt werden, um Vierecke aus einem Streifen zu generieren, unterschiedlich ggü. der unabhängigen Konstruktion sind.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Vierecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Vierecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POLYGON'''&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|(langsam)&lt;br /&gt;
|[[Bild:Glbegin_polygon.jpg|350px|thumb|right]]&lt;br /&gt;
Rendert eine einzelnes, [[konvex|konvexes]] Polygon (=Vieleck). Eckpunkte 1 bis ''N'' definieren dieses Polygon.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis'''&lt;br /&gt;
&lt;br /&gt;
GL_POLYGON scheint für Anfänger meist die &amp;quot;beste Lösung&amp;quot; zu sein, denn man kann alle möglichen (konvexen) Polygone erzeugen. Dies ist soweit richtig, allerdings ist GL_POLYGON um ein vielfaches langsamer als GL_TRIANGLES! Dies hat die folgenden Gründe: &amp;lt;br&amp;gt;&lt;br /&gt;
1. sind moderne Grafikkarten auf die Darstellung von Dreiecken optimiert und &amp;lt;br&amp;gt;&lt;br /&gt;
2. müssen die Polygone bevor sie von den Grafikkarten verwendet werden können, erst in Dreiecke zerlegt werden (siehe [[Triangulation]]). &amp;lt;br&amp;gt;&lt;br /&gt;
Vorallem der letzte Punkt sorgt für niedrige Frameraten im Vergleich zu dreiecksbasierten Strukturen.&amp;lt;br&amp;gt;&lt;br /&gt;
''Die OpenGL-Spezifikiation erlaubt es jedoch GL_POLYGON annähernd gleich zu behandeln  wie GL_TRIANGLE_FAN (die Ausnahme bildet der Wireframe-Modus mit [[glPolygonMode]]), was auch von vielen Grafikkarten in dieser Form umgesetzt wird. Ist dies der Fall, so fallen alle Vor- und Nachteile gegenüber GL_TRIANGLE_FAN weg.''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nur eine Untergruppe von GL Befehlen kann zwischen '''glBegin''' und '''glEnd''' genutzt werden. Die Befehle sind [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]] und [[glEdgeFlag]]. Außerdem ist es erlaubt  [[glCallList]] oder [[glCallLists]] zu nutzen, um [[Displaylisten]] auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen '''glBegin''' und '''glEnd''' ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert.&lt;br /&gt;
&lt;br /&gt;
Unabhängig des für ''mode'' übergebenen Wertes gibt es '''keine''' Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen '''glBegin''' und '''glEnd''' definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügendend beschrieben wurden, werden nicht gerendert.&lt;br /&gt;
Ungenügende Beschreibung bedeutet entweder, dass zu wenige Eckpunkte angegeben wurden, um eine einzelne [[Primitive]] zu beschreiben, oder ein inkorrektes Vielfaches an Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet.&lt;br /&gt;
&lt;br /&gt;
Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt :&lt;br /&gt;
*1 für einen Punkt&lt;br /&gt;
*2 für eine Linie&lt;br /&gt;
*3 für ein Dreieck&lt;br /&gt;
*4 für ein Viereck und &lt;br /&gt;
*3 für ein Polygon. &lt;br /&gt;
Modi die ein festgelegtes Vielfaches an Eckpunkten brauchen sind '''GL_LINES''' (2), '''GL_TRIANGLES''' (3), '''GL_QUADS''' (4), und '''GL_QUAD_STRIP''' (2).  ''(D.h. wenn man bei GL_TRIANGLES 8 Vertices angibt (kein Vielfaches von 3), werden nur die ersten 6 bearbeitet. Die restlichen 2 ergeben kein Dreieck und werden deshalb verworfen.)''&lt;br /&gt;
&lt;br /&gt;
Wenn Flächen gemeinsame Punkte haben (z.B. bei '''GL_TRIANGLE_FAN''') ist es nicht möglich die Eigenschaften dieser Vertices für jede Fläche individuell zu bestimmen. Wenn dies nötig sein sollte, müssen die entsprechenden Flächen aus individuellen Vertices zusammengestellt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Änderungen ==&lt;br /&gt;
Folgende Erweiterungen hat die Funktion erfahren:&lt;br /&gt;
=== Ab OpenGL-Version 1.3 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glMultiTexCoord]]&lt;br /&gt;
=== Ab OpenGL-Version 1.4 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glFogCoord]]&lt;br /&gt;
*[[glSecondaryColor]]&lt;br /&gt;
=== Ab OpenGL-Version 2.0 ===&lt;br /&gt;
Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen:&lt;br /&gt;
*[[glVertexAttrib]]&lt;br /&gt;
&lt;br /&gt;
=== Ab OpenGL-Version 3.3 ===&lt;br /&gt;
'''glBegin/glEnd''' wird '''nicht''' mehr unterstützt, dies betrifft auch die dort eingeschlossenen Befehle.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_ENUM''' wird ausgelöst, wenn ''mode'' einen ungültigen Wert besitzt.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn zwischen '''glBegin''' und dem zugehörigen '''glEnd''' ein weiteres '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn '''glEnd''' ohne ein vorhergehendes '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird aufgerufen, wenn ein anderer Befehl als [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], [[glEdgeFlag]], [[glCallList]] oder [[glCallLists]] zwischen '''glBegin''' und dem zugehörigen '''glEnd''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]],  [[glPushClientAttrib]],  [[glPopClientAttrib]], [[glEdgeFlagPointer]], [[glFogCoordPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glSecondaryColorPointer]] [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glVertexAttribPointer]], [[glInterleavedArrays]] oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;|Code&lt;br /&gt;
!Ausgabe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;glBegin(GL_TRIANGLES);&lt;br /&gt;
    glVertex3f(1,0,0);&lt;br /&gt;
    glVertex3f(0,1,0);&lt;br /&gt;
    glVertex3f(0,0,1);&lt;br /&gt;
glEnd;&amp;lt;/source&amp;gt;&lt;br /&gt;
|[[Bild:GlBegin_Bsp1.jpg|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zwischen glBegin und glEnd können natürlich auch &amp;quot;nicht OpenGL&amp;quot;-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;|Code&lt;br /&gt;
!Ausgabe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
glBegin(GL_LINE_STRIP);&lt;br /&gt;
  f := 0.0;&lt;br /&gt;
  for i:=0 to 20 do&lt;br /&gt;
  begin&lt;br /&gt;
    glVertex3f(cos(f),sin(f),0);&lt;br /&gt;
    f := f + (2*Pi/20);&lt;br /&gt;
  end;&lt;br /&gt;
glEnd;&amp;lt;/source&amp;gt;&lt;br /&gt;
|[[Bild:GlBegin_Bsp2.jpg|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glArrayElement]], [[glCallList]], [[glCallLists]], [[glColor]], [[glEdgeFlag]], [[glEvalCoord]], [[glEvalPoint]], [[glFogCoord]], [[glIndex]], [[glMaterial]], [[glMultiTexCoord]], [[glNormal]], [[glSecondaryColor]], [[glTexCoord]], [[glVertex]], [[glVertexAttrib]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|Begin]]&lt;br /&gt;
 [[Kategorie:GL1.0|Begin]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glEnableVertexAttribArray&amp;diff=27009</id>
		<title>glEnableVertexAttribArray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glEnableVertexAttribArray&amp;diff=27009"/>
				<updated>2018-08-25T18:49:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glEnableVertexAttribArray, glDisableVertexAttribArray, &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(glEnableVertexAttribArrayARB, glDisableVertexAttribArrayARB) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glEnableVertexAttribArray, glDisableVertexAttribArray''' - Aktiviert bzw. deaktiviert ein generisches Vertexattribut-Array.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glEnableVertexAttribArray'''(''index'': TGLuint);&lt;br /&gt;
 procedure '''glDisableVertexAttribArray'''(''index'': TGLuint);&lt;br /&gt;
 procedure '''glEnableVertexAttribArrayARB'''(''index'': TGLuint);&lt;br /&gt;
 procedure '''glDisableVertexAttribArrayARB'''(''index'': TGLuint);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''index''&lt;br /&gt;
| Index des generischen Vertexattribut-Arrays, das aktiviert bzw. deaktiviert werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glEnableVertexAttribArray''' und '''glDisableVertexAttribArray''' aktivieren bzw. deaktivieren das generisch Vertexattribut-Array, das durch ''index'' angegeben wurde. In der Voreinstellung sind alle clientseitigen Fähigkeiten deaktiviert, auch alle generischen Vertexattribut-Arrays. Wenn aktiviert, werden die Werte im generischen Vertexattribut-Array genutzt, sobald Vertexarray-Befehle wie [[glArrayElement]], [[glDrawArrays]], [[glDrawElements]] oder [[glMultiDrawArrays]] aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert, wenn ''index'' größer oder gleich '''GL_MAX_VERTEX_ATTRIBS''' ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glEnableVertexAttribArray'''  oder '''glDisableVertexAttribArray''' innerhalb eines [[glBegin]]/glEnd Blocks aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGetVertexAttrib]] mit dem Argument ''index''.&lt;br /&gt;
&lt;br /&gt;
[[glGetVertexAttribPointer]]  mit dem Argument ''index''.&lt;br /&gt;
&lt;br /&gt;
[[glGet]] mit dem Argument [[glGet#GL_MAX_VERTEX_ATTRIBS|GL_MAX_VERTEX_ATTRIBS]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glArrayElement]], [[glBindAttribLocation]], [[glDrawArrays]], [[glDrawElements]], [[glMultiDrawArrays]], [[glPopClientAttrib]], [[glPushClientAttrib]], [[glVertexAttrib]], [[glVertexAttribPointer]]&lt;br /&gt;
 &lt;br /&gt;
'''Hintergrundwissen :''' [[Shader]]&lt;br /&gt;
&lt;br /&gt;
[https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glEnableVertexAttribArray.xhtml Englische Originalversion] &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|EnableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL|DisableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL2.0|EnableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL2.0|DisableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL|EnableVertexAttribArrayARB]]&lt;br /&gt;
[[Kategorie:GL|DisableVertexAttribArrayARB]]&lt;br /&gt;
[[Kategorie:GL3|DisableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL3|EnableVertexAttribArray]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glEnableVertexAttribArray&amp;diff=27008</id>
		<title>glEnableVertexAttribArray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glEnableVertexAttribArray&amp;diff=27008"/>
				<updated>2018-08-25T18:47:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* glEnableVertexAttribArray, glDisableVertexAttribArray (glEnableVertexAttribArrayARB, glDisableVertexAttribArrayARB) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glEnableVertexAttribArray, glDisableVertexAttribArray, &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(glEnableVertexAttribArrayARB, glDisableVertexAttribArrayARB) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glEnableVertexAttribArray, glDisableVertexAttribArray''' - Aktiviert bzw. deaktiviert ein generisches Vertexattribut-Array.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glEnableVertexAttribArray'''(''index'': TGLuint);&lt;br /&gt;
 procedure '''glDisableVertexAttribArray'''(''index'': TGLuint);&lt;br /&gt;
 procedure '''glEnableVertexAttribArrayARB'''(''index'': TGLuint);&lt;br /&gt;
 procedure '''glDisableVertexAttribArrayARB'''(''index'': TGLuint);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''index''&lt;br /&gt;
| Index des generischen Vertexattribut-Arrays, das aktiviert bzw. deaktiviert werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glEnableVertexAttribArray''' und '''glDisableVertexAttribArray''' aktivieren bzw. deaktivieren das generisch Vertexattribut-Array, das durch ''index'' angegeben wurde. In der Voreinstellung sind alle clientseitigen Fähigkeiten deaktiviert, auch alle generischen Vertexattribut-Arrays. Wenn aktiviert, werden die Werte im generischen Vertexattribut-Array genutzt, sobald Vertexarray-Befehle wie [[glArrayElement]], [[glDrawArrays]], [[glDrawElements]] oder [[glMultiDrawArrays]] aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert, wenn ''index'' größer oder gleich '''GL_MAX_VERTEX_ATTRIBS''' ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glEnableVertexAttribArray'''  oder '''glDisableVertexAttribArray''' innerhalb eines [[glBegin]]/glEnd Blocks aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGetVertexAttrib]] mit dem Argument ''index''.&lt;br /&gt;
&lt;br /&gt;
[[glGetVertexAttribPointer]]  mit dem Argument ''index''.&lt;br /&gt;
&lt;br /&gt;
[[glGet]] mit dem Argument [[glGet#GL_MAX_VERTEX_ATTRIBS|GL_MAX_VERTEX_ATTRIBS]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glArrayElement]], [[glBindAttribLocation]], [[glDrawArrays]], [[glDrawElements]], [[glMultiDrawArrays]], [[glPopClientAttrib]], [[glPushClientAttrib]], [[glVertexAttrib]], [[glVertexAttribPointer]]&lt;br /&gt;
 &lt;br /&gt;
'''Hintergrundwissen :''' [[Shader]]&lt;br /&gt;
&lt;br /&gt;
[http://developer.3dlabs.com/openGL2/slapi/EnableVertexAttribArrayARB.htm Englische Originalversion]  (Copyright 3DLabs Inc.)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|EnableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL|DisableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL2.0|EnableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL2.0|DisableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL|EnableVertexAttribArrayARB]]&lt;br /&gt;
[[Kategorie:GL|DisableVertexAttribArrayARB]]&lt;br /&gt;
[[Kategorie:GL3|DisableVertexAttribArray]]&lt;br /&gt;
[[Kategorie:GL3|EnableVertexAttribArray]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Filter&amp;diff=27007</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Filter&amp;diff=27007"/>
				<updated>2018-08-21T15:28:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Texturen - Filter =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Hier wird gezeigt, wie man Filter für Texturen verwenden kann.&amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Beispiel wird nur eine Texturen geladen, aber es werden mehrere Filter verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die Filter verstellt man mit '''glTexParameter(...'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Hier wird die Textur geladen und der Filter '''MIN_FILTER''' festgelegt, welcher für alle Ausgaben gültig ist.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  pic: TPicture;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  pic := TPicture.Create;&lt;br /&gt;
  with pic do begin&lt;br /&gt;
    LoadFromFile('bild.xpm');&lt;br /&gt;
&lt;br /&gt;
    // Textur laden&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D, textureID);&lt;br /&gt;
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Width, Height, 0, GL_BGR, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);&lt;br /&gt;
&lt;br /&gt;
    // Globaler Filter&lt;br /&gt;
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);&lt;br /&gt;
&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D, 0);&lt;br /&gt;
    Free;&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei dem Filter '''GL_CLAMP_TO_BORDER''' kann man noch eine Hintergrundfarbe festlegen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
// Hintergrundfarbe für Clamp_to_Border, ein Dunkelgrün.&lt;br /&gt;
const&lt;br /&gt;
  border: array[0..3] of GLfloat = (0.0, 0.3, 0.0, 1.0);&lt;br /&gt;
var&lt;br /&gt;
  ProdMatrix: TMatrix;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, textureID);  // Textur binden.&lt;br /&gt;
&lt;br /&gt;
  // Links-Oben&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);&lt;br /&gt;
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);&lt;br /&gt;
&lt;br /&gt;
  ProdMatrix := ScaleMatrix;&lt;br /&gt;
  ProdMatrix.Translate(-0.5, 0.5, 0.0);&lt;br /&gt;
  ProdMatrix.Uniform(Matrix_ID);&lt;br /&gt;
&lt;br /&gt;
  glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));&lt;br /&gt;
&lt;br /&gt;
  // Rechts-Oben&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);&lt;br /&gt;
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);&lt;br /&gt;
  glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, @border);&lt;br /&gt;
&lt;br /&gt;
  ProdMatrix := ScaleMatrix;&lt;br /&gt;
  ProdMatrix.Translate(0.5, 0.5, 0.0);&lt;br /&gt;
  ProdMatrix.Uniform(Matrix_ID);&lt;br /&gt;
&lt;br /&gt;
  glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));&lt;br /&gt;
&lt;br /&gt;
  // Links-Unten&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);&lt;br /&gt;
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);&lt;br /&gt;
&lt;br /&gt;
  ProdMatrix := ScaleMatrix;&lt;br /&gt;
  ProdMatrix.Translate(-0.5, -0.5, 0.0);&lt;br /&gt;
  ProdMatrix.Uniform(Matrix_ID);&lt;br /&gt;
&lt;br /&gt;
  glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));&lt;br /&gt;
&lt;br /&gt;
  // Rechts-Unten&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);&lt;br /&gt;
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);&lt;br /&gt;
&lt;br /&gt;
  ProdMatrix := ScaleMatrix;&lt;br /&gt;
  ProdMatrix.Translate(0.5, -0.5, 0.0);&lt;br /&gt;
  ProdMatrix.Uniform(Matrix_ID);&lt;br /&gt;
&lt;br /&gt;
  glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));&lt;br /&gt;
&lt;br /&gt;
  ogc.SwapBuffers;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location =  0) in vec3 inPos;   // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV;    // Textur-Koordinaten&lt;br /&gt;
&lt;br /&gt;
uniform mat4 mat;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4(inPos, 1.0);&lt;br /&gt;
  UV0 = inUV;                           // Texur-Koordinaten weiterleiten.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D Sampler;&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
    FragColor = texture( Sampler, UV0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==bild.xpm==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;/* XPM */&lt;br /&gt;
static char *XPM_mauer[] = {&lt;br /&gt;
  &amp;quot;8 8 6 1&amp;quot;,&lt;br /&gt;
  &amp;quot;  c #882222&amp;quot;,&lt;br /&gt;
  &amp;quot;* c #FFFFFF&amp;quot;,&lt;br /&gt;
  &amp;quot;r c #FF0000&amp;quot;,&lt;br /&gt;
  &amp;quot;g c #00FF00&amp;quot;,&lt;br /&gt;
  &amp;quot;b c #0000FF&amp;quot;,&lt;br /&gt;
  &amp;quot;y c #00FFFF&amp;quot;,&lt;br /&gt;
  &amp;quot;r******g&amp;quot;,&lt;br /&gt;
  &amp;quot;*rr**gg*&amp;quot;,&lt;br /&gt;
  &amp;quot;*rr**gg*&amp;quot;,&lt;br /&gt;
  &amp;quot;********&amp;quot;,&lt;br /&gt;
  &amp;quot;********&amp;quot;,&lt;br /&gt;
  &amp;quot;*bb**yy*&amp;quot;,&lt;br /&gt;
  &amp;quot;*bb**yy*&amp;quot;,&lt;br /&gt;
  &amp;quot;b******y&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Erste_Textur&amp;diff=27006</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Erste_Textur&amp;diff=27006"/>
				<updated>2018-08-21T14:52:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Texturen - Erste Textur =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit Texturen sieht eine Mesh um einiges besser aus, als wen es nur einfache Farbverläufe sind.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit OpenGL kann man recht einfach Texturen in das VRAM laden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Am einfachsten geht dies, wen man eine Textur als Statische Konstante hat, so wie im Beispiel hier.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der Praxis wird man meistens Texturen von einer Bitmap-Datei laden.&amp;lt;br&amp;gt;&lt;br /&gt;
Da es sehr viele Bitmap-Formate gibt, habe ich dafür eine Unit oglTextur.pas geschrieben.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese sollte die meisten üblichen Formate abdecken. Dazu später.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Das OpenGL weiss, welcher Bereich von einer Textur auf das Polygon gezeichnet wird, kommt noch eine 2D Vertex-Array dazu.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier im Beispiel, ist dies von einem Bereich von 0.0 bis 1.0, somit ist die ganze Textur sichtbar.&amp;lt;br&amp;gt;&lt;br /&gt;
Als Versuch kann man die 1.0 durch 2.0 ersetzen, dann wird man sehen, das die Textur doppelt vorhanden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Umgekehrt, mit 0.5 ist nur die halbe Textur sichtbar.&amp;lt;br&amp;gt;&lt;br /&gt;
Natürlich kann man dies auch mit einer Matrix modfizieren, dazu später.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  QuadVertex: array[0..5] of TVector3f =       // Koordinaten der Polygone.&lt;br /&gt;
    ((-0.8, -0.8, 0.0), (0.8, 0.8, 0.0), (-0.8, 0.8, 0.0),&lt;br /&gt;
    (-0.8, -0.8, 0.0), (0.8, -0.8, 0.0), (0.8, 0.8, 0.0));&lt;br /&gt;
&lt;br /&gt;
  TextureVertex: array[0..5] of TVector2f =    // Textur-Koordinaten&lt;br /&gt;
    ((0.0, 0.0), (1.0, 1.0), (0.0, 1.0),&lt;br /&gt;
    (0.0, 0.0), (1.0, 0.0), (1.0, 1.0));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Textur selbst als Konstante. Es ist eine sehr kleine Textur mit 2x2 Pixel.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Format ist RGBA ( Rot/Grün/Blau/Alpha ).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Alpha-Kanal ist hier Bedeutungslos, er wird nur gebraucht, das ein Pixel auf 32Bit kommt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bei der Seitenlänge einer Textur sollt darauf geachtet werden, das diese '''2&amp;lt;sup&amp;gt;x&amp;lt;/sup&amp;gt;''' ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Andere Werte gehen zwar auch bei modernen OpenGL, aber dann muss mit Performanceeinbrüchen rechnen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  Textur32_0: packed array[0..1, 0..1, 0..3] of byte = ((($FF, $00, $00, $FF), ($00, $FF, $00, $FF)), (($00, $00, $FF, $FF), ($FF, $00, $00, $FF)));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für die Textur-Koordinaten ist noch ein VBO dazu gekommen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;type&lt;br /&gt;
  TVB = record&lt;br /&gt;
    VAO,&lt;br /&gt;
    VBOVertex,        // Vertex-Koordinaten&lt;br /&gt;
    VBOTex: GLuint;   // Textur-Koordianten&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  VBQuad: TVB;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wie in OpenGL üblich, braucht auch der Textur-Puffer eine ID.&amp;lt;br&amp;gt;&lt;br /&gt;
Solche BPffer können auch mehrere vorkommen, eine Scene hat selten nur eine Textur.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;var&lt;br /&gt;
  textureID: GLuint;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier wird der Textur-Puffer mit '''glGenTextures(...''' erzeugt, ähnlich wie andere Puffer auch.&amp;lt;br&amp;gt;&lt;br /&gt;
Für den Shader muss noch eine Sampler-Nr. zugeordnet werden, diese numeriert man fortlaufend durch.&amp;lt;br&amp;gt;&lt;br /&gt;
Da man dies nur einmal machen muss, kann man den Umweg über eine Uniform_ID sparen und dies direkt verschachtelt zuweisen.&amp;lt;br&amp;gt;&lt;br /&gt;
Ich hatte schon versucht, diese Nummer als Konstante in den Shader zu schreiben, dies geht aber leider '''nicht''' !&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Da hier nur eine Textur verwendet wird, könnte man dies auch weglassen, weil dies default auf '''0''' ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Multitexturing ist dies natürlich nicht mehr der Fall.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.CreateScene;&lt;br /&gt;
begin&lt;br /&gt;
  glGenVertexArrays(1, @VBQuad.VAO);&lt;br /&gt;
  glGenBuffers(1, @VBQuad.VBOVertex);&lt;br /&gt;
  glGenBuffers(1, @VBQuad.VBOTex);&lt;br /&gt;
&lt;br /&gt;
  glGenTextures(1, @textureID);                 // Erzeugen des Textur-Puffer.&lt;br /&gt;
&lt;br /&gt;
  Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Fragmentshader.glsl')]);&lt;br /&gt;
  with Shader do begin&lt;br /&gt;
    UseProgram;&lt;br /&gt;
    Matrix_ID := UniformLocation('mat');&lt;br /&gt;
    glUniform1i(UniformLocation('Sampler'), 0);  // Dem Sampler 0 zuweisen.&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Um Texturen zu laden, muss man die Textur zuerst binden, und anschliessend mit Daten füllen.&amp;lt;br&amp;gt;&lt;br /&gt;
Das wichtigste dabei ist '''glTexImage2D(...'''. Hier gibt man eine Zeiger auf die Textur-Daten mit.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Textur-Daten im RAM könnte man anschliessend löschen, aber hier geht dies natürlich nicht, da es sich um eine Konstae handelt.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies wird erst interessant, wen man die Daten von der Festplatte lädt.&amp;lt;br&amp;gt;&lt;br /&gt;
Da es sich um eine 2D-Texur handelt muss man über alll noch '''GL_TEXTURE_2D''' angeben.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
begin&lt;br /&gt;
  // Textur binden.&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, textureID);&lt;br /&gt;
&lt;br /&gt;
  // Textur laden.&lt;br /&gt;
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, @Textur32_0);&lt;br /&gt;
&lt;br /&gt;
  // Ein minimalst Filter aktivieren, ansonsten bleibt die Ausgabe schwarz.&lt;br /&gt;
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);&lt;br /&gt;
//  glGenerateMipmap(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
  // Am Schluss kann man die Textur entbinden, dies ist aber nicht zwingend.&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, 0);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bevor man ein Polygon zeichnet, muss man die Texur binden. Dies geschieht mit '''glBindTexture(...'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Anschliessend kann ganz normal gezeichnet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, textureID);  // Textur binden.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zum Schluss muss man wie gewohnt, auch den Textur-Puffer wieder frei geben.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  Timer1.Enabled := False;&lt;br /&gt;
&lt;br /&gt;
  glDeleteTextures(1, @textureID);       // Textur-Puffer frei geben.&lt;br /&gt;
  glDeleteVertexArrays(1, @VBQuad.VAO);&lt;br /&gt;
  glDeleteBuffers(1, @VBQuad.VBOVertex);&lt;br /&gt;
  glDeleteBuffers(1, @VBQuad.VBOTex);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Hier sieht man, das die Textur-Koordinaten gleich behandelt werden wie Vertex-Attribute.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies muss man dann aber dem Fragment-Shader weiterleiten. So wurde es auch schon mit den Color-Vectoren gemacht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location =  0) in vec3 inPos;   // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV;    // Textur-Koordinaten&lt;br /&gt;
&lt;br /&gt;
uniform mat4 mat;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4(inPos, 1.0);&lt;br /&gt;
  UV0 = inUV;                           // Textur-Koordinaten weiterleiten.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Hier ist der Sampler für die Zuordnung dazu gekommen.&amp;lt;br&amp;gt;&lt;br /&gt;
Und man sieht auch, das die Farb-Ausgabe von der Textur kommen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die UV-Koordinate gibt an, von welchem Bereich der Pixel aus der Textur gelesen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D Sampler;              // Der Sampler welchem 0 zugeordnet wird.&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler, UV0 );  // Die Farbe aus der Textur anhand der Koordinten auslesen.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden&amp;diff=27005</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden&amp;diff=27005"/>
				<updated>2018-08-16T20:51:38Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Texturen - Texturn austauschen, Auschnitt laden =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es ist möglich sehr schnell die Daten des Texturpuffers auszutauschen.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist auch mit einem '''Texturauschnitt''' möglich.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies geschieht mit '''glTexSubImage2D(...'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Big ist die Totalgrösse der Texturdaten.&amp;lt;br&amp;gt;&lt;br /&gt;
Small ist ein Auschnitt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  TextursizeBig = 256;&lt;br /&gt;
  TextursizeSmall = 64;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3 Datenpuffer, welche sehr mit sehr einfachen Werten geladen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;var&lt;br /&gt;
  TexturBig: packed array [0..TextursizeBig*TextursizeBig-1] of UInt32 ;&lt;br /&gt;
  TexturSmall0, TexturSmall1: packed array [0..TextursizeSmall*TextursizeSmall-1]of UInt32;&lt;br /&gt;
  textureID: GLuint;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es werden sehr einfache Datenbuffer mit Daten befüllt.&amp;lt;br&amp;gt;&lt;br /&gt;
In der Praxis werden die Puffer meistens mit Bitmaps gefüllt.&amp;lt;br&amp;gt;&lt;br /&gt;
Der grosse Texturbuffer füllt die ganze Textur auf.&amp;lt;br&amp;gt;&lt;br /&gt;
Die kleinen Datenbuffer werden später zur Laufzeit abwechslungsweise geladen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  // Einfache Datenbuffer erzeugen.&lt;br /&gt;
  for i := 0 to TextursizeBig * TextursizeBig - 1 do begin&lt;br /&gt;
    TexturBig[i] := i or $FF000000;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  for i := 0 to TextursizeSmall * TextursizeSmall - 1 do begin&lt;br /&gt;
    TexturSmall0[i] := i or $FF000000;&lt;br /&gt;
    TexturSmall1[i] := (not i) or $FF000000;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- Texturbuffer erzeugen und anschliessend mit Daten der grossen Textur befüllen.&lt;br /&gt;
&lt;br /&gt;
  glGenTextures(1, @textureID);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, textureID);&lt;br /&gt;
&lt;br /&gt;
  // Nur Speicher reservieren&lt;br /&gt;
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TextursizeBig, TextursizeBig, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);&lt;br /&gt;
&lt;br /&gt;
  // Texturbuffer mit dem grossen Datenbuffer befüllen.&lt;br /&gt;
  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TextursizeBig, TextursizeBig, GL_RGBA, GL_UNSIGNED_BYTE, @TexturBig);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Auschnitt der Textur wird zur Laufzeit abwechslungsweise ausgtauscht&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
const&lt;br /&gt;
  step = 0.01;&lt;br /&gt;
  z: integer = 1;&lt;br /&gt;
begin&lt;br /&gt;
  if z &amp;gt; 10 then begin&lt;br /&gt;
    glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall0);&lt;br /&gt;
  end else begin&lt;br /&gt;
    glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall1);&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location =  0) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV;  // Textur-Koordinaten&lt;br /&gt;
uniform mat4 mat;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4(inPos, 1.0);&lt;br /&gt;
  UV0         = inUV;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D Sampler;&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler, UV0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden.png&amp;diff=27004</id>
		<title>Datei:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden.png&amp;diff=27004"/>
				<updated>2018-08-15T20:56:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden&amp;diff=27003</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden&amp;diff=27003"/>
				<updated>2018-08-15T20:56:29Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Texturen - Texturn austauschen, Auschnitt laden =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es ist möglich sehr schnell die Daten des Texturpuffers auszutauschen.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist auch mit einem '''Texturauschnitt''' möglich.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies geschieht mit '''glTexSubImage2D(...'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Big ist die Totalgrösse der Texturdaten.&amp;lt;br&amp;gt;&lt;br /&gt;
Small ist ein Auschnitt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  TextursizeBig = 256;&lt;br /&gt;
  TextursizeSmall = 64;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3 Datenpuffer, welche sehr mit sehr einfachen Werten geladen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;var&lt;br /&gt;
  TexturBig: packed array [0..TextursizeBig*TextursizeBig-1] of UInt32 ;&lt;br /&gt;
  TexturSmall0, TexturSmall1: packed array [0..TextursizeSmall*TextursizeSmall-1]of UInt32;&lt;br /&gt;
  textureID: GLuint;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es werden sehr einfache Datenbuffer mit Daten befüllt.&amp;lt;br&amp;gt;&lt;br /&gt;
In der Praxis werden die Puffer meistens mit Bitmaps gefüllt.&amp;lt;br&amp;gt;&lt;br /&gt;
Der grosse Texturbuffer füllt die ganze Textur auf.&amp;lt;br&amp;gt;&lt;br /&gt;
Die kleinen Datenbuffer werden später zur Laufzeit abwechslungsweise geladen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  // Einfache Datenbuffer erzeugen.&lt;br /&gt;
  for i := 0 to TextursizeBig * TextursizeBig - 1 do begin&lt;br /&gt;
    TexturBig[i] := i or $FF000000;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  for i := 0 to TextursizeSmall * TextursizeSmall - 1 do begin&lt;br /&gt;
    TexturSmall0[i] := i or $FF000000;&lt;br /&gt;
    TexturSmall1[i] := (not i) or $FF000000;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- Texturbuffer erzeugen und anschliessend mit Daten der grossen Textur befüllen.&lt;br /&gt;
&lt;br /&gt;
  glGenTextures(1, @textureID);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, textureID);&lt;br /&gt;
&lt;br /&gt;
  // Nur Speicher reservieren&lt;br /&gt;
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TextursizeBig, TextursizeBig, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);&lt;br /&gt;
&lt;br /&gt;
  // Texturbuffer mit dem grossen Datenbuffer befüllen.&lt;br /&gt;
  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TextursizeBig, TextursizeBig, GL_RGBA, GL_UNSIGNED_BYTE, @TexturBig);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Auschnitt der Textur wird zur Laufzeit abwechslungsweise ausgtauscht&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
const&lt;br /&gt;
  step: GLfloat = 0.01;&lt;br /&gt;
  z: integer = 1;&lt;br /&gt;
begin&lt;br /&gt;
  if z &amp;gt; 10 then begin&lt;br /&gt;
    glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall0);&lt;br /&gt;
  end else begin&lt;br /&gt;
    glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall1);&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location =  0) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV;  // Textur-Koordinaten&lt;br /&gt;
uniform mat4 mat;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4(inPos, 1.0);&lt;br /&gt;
  UV0         = inUV;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D Sampler;&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler, UV0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden&amp;diff=27002</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Texturn_austauschen,_Auschnitt_laden&amp;diff=27002"/>
				<updated>2018-08-15T20:55:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: Die Seite wurde neu angelegt: „200px&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; =Texturen - Texturn austauschen, Auschnitt laden =…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Texturen - Texturn austauschen, Auschnitt laden =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es ist möglich sehr schnell die Daten des Texturpuffers auszutauschen.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies ist auch mit einem '''Texturauschnitt''' möglich.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies geschieht mit '''glTexSubImage2D(...'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Big ist die Totalgrösse der Texturdaten.&amp;lt;br&amp;gt;&lt;br /&gt;
Small ist ein Auschnitt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  TextursizeBig = 256;&lt;br /&gt;
  TextursizeSmall = 64;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3 Datenpuffer, welche sehr mit sehr einfachen Werten geladen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;var&lt;br /&gt;
  TexturBig: packed array [0..TextursizeBig*TextursizeBig-1] of UInt32 ;&lt;br /&gt;
  TexturSmall0, TexturSmall1: packed array [0..TextursizeSmall*TextursizeSmall-1]of UInt32;&lt;br /&gt;
  textureID: GLuint;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es werden sehr einfache Datenbuffer mit Daten befüllt.&amp;lt;br&amp;gt;&lt;br /&gt;
In der Praxis werden die Puffer meistens mit Bitmaps gefüllt.&amp;lt;br&amp;gt;&lt;br /&gt;
Der grosse Texturbuffer füllt die ganze Textur auf.&amp;lt;br&amp;gt;&lt;br /&gt;
Die kleinen Datenbuffer werden später zur Laufzeit abwechslungsweise geladen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  // Einfache Datenbuffer erzeugen.&lt;br /&gt;
  for i := 0 to TextursizeBig * TextursizeBig - 1 do begin&lt;br /&gt;
    TexturBig[i] := i or $FF000000;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  for i := 0 to TextursizeSmall * TextursizeSmall - 1 do begin&lt;br /&gt;
    TexturSmall0[i] := i or $FF000000;&lt;br /&gt;
    TexturSmall1[i] := (not i) or $FF000000;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- Texturbuffer erzeugen und anschliessend mit Daten der grossen Textur befüllen.&lt;br /&gt;
&lt;br /&gt;
  glGenTextures(1, @textureID);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, textureID);&lt;br /&gt;
&lt;br /&gt;
  // Nur Speicher reservieren&lt;br /&gt;
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TextursizeBig, TextursizeBig, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);&lt;br /&gt;
&lt;br /&gt;
  // Texturbuffer mit dem grossen Datenbuffer befüllen.&lt;br /&gt;
  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TextursizeBig, TextursizeBig, GL_RGBA, GL_UNSIGNED_BYTE, @TexturBig);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Auschnitt der Textur wird zur Laufzeit abwechslungsweise ausgtauscht&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
const&lt;br /&gt;
  step: GLfloat = 0.01;&lt;br /&gt;
  z: integer = 1;&lt;br /&gt;
begin&lt;br /&gt;
  if z &amp;gt; 10 then begin&lt;br /&gt;
    glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall0);&lt;br /&gt;
  end else begin&lt;br /&gt;
    glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall1);&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 0) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV; // Textur-Koordinaten&lt;br /&gt;
uniform mat4 mat;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4(inPos, 1.0);&lt;br /&gt;
  UV0 = inUV;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D Sampler;&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler, UV0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=27001</id>
		<title>Lazarus - OpenGL 3.3 Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=27001"/>
				<updated>2018-08-15T20:55:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lazarus - OpenGL 3.3 Tutorial=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.&amp;lt;br&amp;gt;&lt;br /&gt;
==Download==&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]&amp;lt;br&amp;gt;&lt;br /&gt;
==Tutorial==&lt;br /&gt;
=== Einrichten und Einstieg ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] &lt;br /&gt;
&amp;quot;Lazarus mit '''OpenGL 3.3'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was sind die Voraussetzungen.&lt;br /&gt;
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Arbeitsfläche erzeugen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Erste Vectoren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zeichen Routine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.&lt;br /&gt;
Somit stehen einem fast unendliche Effekte zu Verfügung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] &lt;br /&gt;
&amp;quot;Wie sollen die Polygone verarbeitet werden ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Das Herz von OpenGL 3.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sämtliche Effekt werden hier verarbeitet.&lt;br /&gt;
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] &lt;br /&gt;
&amp;quot;Äusere Beinflussung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Mesh sollte nicht statisch sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie bewege ich eine Mesh im Shader.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einer ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer gleich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zusätliche geometrische Berechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Ein Pixel ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Variable auslesen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/45_-_Variablen_Namen_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vertex-Puffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Mesh Daten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie gelangen die Daten der Mesh in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht immer 3D sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Vertex-Daten anstelle von 3D.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles zusammen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur einzeln Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.&lt;br /&gt;
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer am Stück&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch nur einen Teil einer Vertex-Array zeichnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] &lt;br /&gt;
&amp;quot;Eigene Reihenfolge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien im Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Index-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer_dynamisch source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID|VertexID]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|128px|right]] &lt;br /&gt;
&amp;quot;Welcher Vertex ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit gl_VertexID kann man im Vertex-Shader ermitteln, welcher Vertex gerade gezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_VertexID source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur schreiben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/60_-_Vertex-Puffer_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Matrix ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegung im Raum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Matrizen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] &lt;br /&gt;
&amp;quot;Planetarium&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== 3D ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde 3D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] &lt;br /&gt;
&amp;quot;Alles ist zu viel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur Vorn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] &lt;br /&gt;
&amp;quot;Ortografisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird meistens in einem CAD gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht mehr verzerrt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.&lt;br /&gt;
Dies passt man in der Perspektive an.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Alpha Blending ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Reihenfolge ist wichtig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] &lt;br /&gt;
&amp;quot;Zuerst hinten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Meshes sortieren, das Alphablending richtig kommt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch Texturen müssen sortiert werden&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch bei Texturen mit Alphablending ist die Reiehnfolge wichtig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Alpha-Kanal abfragen und ingnorieren|Alpha-Kanal abfragen und ingnorieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Alpha-Kanal abfragen und ingnorieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Transparent ingnorieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Transparent den Z-Buffer ingnorieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/20_-_Alpha-Kanal_abfragen_und_ingnorieren source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] &lt;br /&gt;
&amp;quot;Es wird Erkennbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Einfachste Variante einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Hintergrund-Beleuchtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Restlicht ist (fast) immer vorhanden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Lichtquellen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Glühbirne&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Schnelle Lichtberechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Detailgetreues Licht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot; (ohne OpenGL)&lt;br /&gt;
&lt;br /&gt;
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe realistisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe wird schwach&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je weiter das Licht weg, je dünkler die Mesh.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Material Eigenschaften ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Materialien sind unterschiedlich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Lichtquelle.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine komplexe Taschenlampe mit Abschwächung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Bump Mapping ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Uniform Buffer Object (UBO) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Uniform als Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Shader-Parameter in einem Puffer zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Shader-Daten aktualisieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.&lt;br /&gt;
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Schneller Wechsel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Verbindungen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Verbindungen mit einem UBO sind möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;UBOs richtig nutzen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gebe Bilder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Polygone können mit Bilder ( Texturen ) überzogen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrer Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden|Texturn austauschen, Auschnitt laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur ein Teil, austauschen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es kann auch nur ein Teil eines Texturpuffers beschrieben werden.&lt;br /&gt;
Auch ist es möglich die Textur zur Laufzeit auszutauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturn_austauschen,_Auschnitt_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_von_BMP source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gibt viele Formate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.&lt;br /&gt;
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_mit_oglTextur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] &lt;br /&gt;
&amp;quot;Texturen als Text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_von_XPM source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegte Textur&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Texturen_und_Matrixen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] &lt;br /&gt;
&amp;quot;Huckepack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Multitexturing source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] &lt;br /&gt;
&amp;quot;Filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Texturen auf verschiedene Art darstellen und filtern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Filter source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Alpha-Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] &lt;br /&gt;
&amp;quot;Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Auswirkung unterschiedlicher Textur-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Textur-Koordinaten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] &lt;br /&gt;
&amp;quot;Verzerrte Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies kann man aber zum Glück korrigieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/55_-_Texturen_Perspektiven-Korrektur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es geht auch 1D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_1D_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles auf einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/70_-_Textur_Array_einzel_Bitmap source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Cubemap Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Framepuffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht der Bildschirm sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Texturen rendern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] &lt;br /&gt;
&amp;quot;Verewigen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die gerenderte Scene auch in ein Bitmap speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Geometrie-Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Schatten ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Instancing ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] &lt;br /&gt;
&amp;quot;Chaotisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.&lt;br /&gt;
Die Anzahl der Instancen ist sehr begrenzt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] &lt;br /&gt;
&amp;quot;Flexibel sollte es sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.&lt;br /&gt;
Die Anzahl der Instancen ist fast unbegrenzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles in einem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann alle Parameter in ein Record packen.&lt;br /&gt;
Die ist mit Uniform nicht möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vektoren und Matrizen ( no OpenGL ) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik|Einleitung Vektorgrafik]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik.png|128px|right]] &lt;br /&gt;
&amp;quot;ohne OpenGL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was nimmt OpenGL einem für Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Einleitung_Vektorgrafik source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Matrix_2D_Demo source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Vektoren_Cube source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Gradient_Triangle source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/20_-_Vektoren_Cube_Z-Buffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_3D_-_Polygon_-_Seite_(Backface_Culling)&amp;diff=27000</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_3D_-_Polygon_-_Seite_(Backface_Culling)&amp;diff=27000"/>
				<updated>2018-08-14T19:00:03Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=3D - Polygon - Seite (Backface Culling) =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Die Meshes ist hier noch 2D, aber '''Backface Culling''' wird in folgenden 3D-Beispielen gebraucht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Defaultmässig zeichnet OpenGL immer die Vorder und Rückseite eines Polygones. Für die meisten Meshes ist dies aber nicht nötig.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einem Würfel ist es nicht nötig, das die Innenseite der Polygone gezeichnet werden, da man diese sowieso nicht sieht.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies spart Rechneleistung, weil jede Pixelüberprüfung Zeit kostet.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit '''glEnable(GL_CULL_FACE);''' wird nur die Vorderseite der Polygone gezeichnet. Ausgenommen man schaltet es mit '''glCullFace(...''' um, so das nur die Rückseite gezeichnet wird.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Beispiel, wird dies mit einem Timer demonstriert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Was dabei wichtig ist, die Polygone müssen immer im Gegenuhrzeigersinn gerendert werden. Auch dies könnte man '''glFrontFace(...''' umstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Dafür gibt es die Parameter '''GL_CW''' für Uhrzeigersinn, und den Default-Parameter '''GL_CCW'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Wen man die Konstanten genau anschaut, sieht man, das das Dreieck im Gegenuhrzegersinn und das Qaudrat im Uhrzeigersinn deklariert ist.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  // Dreieck&lt;br /&gt;
  Triangle: array[0..0] of TFace =&lt;br /&gt;
    (((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0)));&lt;br /&gt;
&lt;br /&gt;
  // Quadrat&lt;br /&gt;
  Quad: array[0..1] of TFace =&lt;br /&gt;
    (((-0.2, -0.6, 0.0), (-0.2, -0.1, 0.0), (0.2, -0.1, 0.0)),&lt;br /&gt;
    ((-0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (0.2, -0.6, 0.0)));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier wird die Backface Culling aktiviert:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
begin&lt;br /&gt;
  glEnable(GL_CULL_FACE);           // Überprüfung einschalten&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier wird zwischen der Rück und Vorder-Seite umgesschalten.&amp;lt;br&amp;gt;&lt;br /&gt;
Man sagt immer, welche Seite nicht gezeichnet wird.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
const&lt;br /&gt;
  CullFace: boolean = False;&lt;br /&gt;
begin&lt;br /&gt;
  if CullFace then begin&lt;br /&gt;
    glCullFace(GL_BACK);      // Rückseite nicht zeichnen.&lt;br /&gt;
  end else begin&lt;br /&gt;
    glCullFace(GL_FRONT);     // Vorderseite nicht zeichnen.&lt;br /&gt;
  end;&lt;br /&gt;
  CullFace := not CullFace;&lt;br /&gt;
  ogc.Invalidate;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  vec3 col = vec3(1.0, 0.0, 0.0);&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Textur_Array_einzel_Bitmap&amp;diff=26999</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Textur_Array_einzel_Bitmap&amp;diff=26999"/>
				<updated>2018-08-12T15:50:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Texturen - Textur Array einzel Bitmap =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Man kann auch in jedem Layer einzeln die Texturen laden.&amp;lt;br&amp;gt;&lt;br /&gt;
Der einzige Unterschied zum kompletten laden ist, man ladet die Texturen einzeln mit SubImage hoch.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Rest ist gleich, wie wen man alles miteinander hoch ladet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Mit '''glTexImage3D(...''' wird nur der Speicher für die Texturen reserviert. Dabei muss man von Anfang an wissen, wie gross die Texturen sind.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit '''glTexSubImage3D(...''' werden dann die Texturen Layer für Layer hochgeladen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die sechs einzelnen Bitmap heisen 1.xpm - 6.xpm .&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
const&lt;br /&gt;
  size = 8;      // Grösse der Texturen&lt;br /&gt;
  anzLayer = 6;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
  bit: TPicture; // Bitmap&lt;br /&gt;
begin&lt;br /&gt;
  bit := TPicture.Create;&lt;br /&gt;
  with bit do begin&lt;br /&gt;
&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D_ARRAY, textureID);&lt;br /&gt;
&lt;br /&gt;
    // Speicher reservieren&lt;br /&gt;
    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, size, size, anzLayer, 0, GL_BGR, GL_UNSIGNED_BYTE, nil);&lt;br /&gt;
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);&lt;br /&gt;
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);&lt;br /&gt;
    for i := 0 to anzLayer - 1 do begin&lt;br /&gt;
&lt;br /&gt;
      // Bitmap von HD laden.&lt;br /&gt;
      LoadFromFile(IntToStr(i + 1) + '.xpm');   // Die Images laden.&lt;br /&gt;
&lt;br /&gt;
      // Texturen hoch laden&lt;br /&gt;
      glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, Width, Height, 1, GL_BGR, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);&lt;br /&gt;
    end;&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D_ARRAY, 0);&lt;br /&gt;
    Free; // Picture frei geben.&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Shader sind gleich, wie wen man alles auf einmal hoch ladet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location =  0) in vec3 inPos;   // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV;    // Textur-Koordinaten&lt;br /&gt;
&lt;br /&gt;
uniform mat4 mat;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4(inPos, 1.0);&lt;br /&gt;
  UV0 = inUV;                           // Textur-Koordinaten weiterleiten.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2DArray Sampler;&lt;br /&gt;
uniform int            Layer;&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler, vec3(UV0, Layer));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Textur_Array_einzel_Bitmap&amp;diff=26998</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Texturen_-_Textur_Array_einzel_Bitmap&amp;diff=26998"/>
				<updated>2018-08-12T15:49:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Texturen - Textur Array einzel Bitmap =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Man kann auch in jedem Layer einzeln die Texturn laden.&amp;lt;br&amp;gt;&lt;br /&gt;
Der einzige Unterschied zum kompletten laden ist, man ladet die Texturen einzeln mit SubImage hoch.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Rest ist gleich, wie wen man alles miteinander hoch ladet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Mit '''glTexImage3D(...''' wird nur der Speicher für die Texturen reserviert. Dabei muss man von Anfang an wissen, wie gross die Texturen sind.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit '''glTexSubImage3D(...''' werden dann die Texturen Layer für Layer hochgeladen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die sechs einzelnen Bitmap heisen 1.xpm - 6.xpm .&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
const&lt;br /&gt;
  size = 8;      // Grösse der Texturen&lt;br /&gt;
  anzLayer = 6;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
  bit: TPicture; // Bitmap&lt;br /&gt;
begin&lt;br /&gt;
  bit := TPicture.Create;&lt;br /&gt;
  with bit do begin&lt;br /&gt;
&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D_ARRAY, textureID);&lt;br /&gt;
&lt;br /&gt;
    // Speicher reservieren&lt;br /&gt;
    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, size, size, anzLayer, 0, GL_BGR, GL_UNSIGNED_BYTE, nil);&lt;br /&gt;
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);&lt;br /&gt;
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);&lt;br /&gt;
    for i := 0 to anzLayer - 1 do begin&lt;br /&gt;
&lt;br /&gt;
      // Bitmap von HD laden.&lt;br /&gt;
      LoadFromFile(IntToStr(i + 1) + '.xpm');   // Die Images laden.&lt;br /&gt;
&lt;br /&gt;
      // Texturen hoch laden&lt;br /&gt;
      glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, Width, Height, 1, GL_BGR, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);&lt;br /&gt;
    end;&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D_ARRAY, 0);&lt;br /&gt;
    Free; // Picture frei geben.&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Shader sind gleich, wie wen man alles auf einmal hoch ladet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location =  0) in vec3 inPos;   // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV;    // Textur-Koordinaten&lt;br /&gt;
&lt;br /&gt;
uniform mat4 mat;&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4(inPos, 1.0);&lt;br /&gt;
  UV0 = inUV;                           // Textur-Koordinaten weiterleiten.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2DArray Sampler;&lt;br /&gt;
uniform int            Layer;&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler, vec3(UV0, Layer));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Alpha_Blending_-_Reihenfolge_sortiert_mit_Texturen&amp;diff=26996</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Alpha_Blending_-_Reihenfolge_sortiert_mit_Texturen&amp;diff=26996"/>
				<updated>2018-08-01T18:11:17Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Alpha Blending - Reihenfolge sortiert mit Texturen =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Da mit Texturen welche Alpha-Blending haben das gleiche Problem besteht, wie mit den Würfeln, muss man auch dort sortieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Da die Position der Bäume keine Drehbewegung haben, reicht ein Vector für dessen Position, eine Matrix ist nicht nötig.&amp;lt;br&amp;gt;&lt;br /&gt;
Für den Boden wird eine Matrix gebraucht, da ich diesen drehe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Zusätzlich habe ich für den Boden noch eine Textur genommen, somit sieht die Scene recht realistisch aus.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wie Texturen funktionieren, in einem späteren Kapitel.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Den Speicher für die Position der Bäume reservieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
  i: Integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to TreeCount - 1 do begin&lt;br /&gt;
    New(TreePosArray[i]);&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Position der Bäume wird zufällig bestimmt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
const&lt;br /&gt;
  d = 10;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to TreeCount - 1 do begin&lt;br /&gt;
    TreePosArray[i]^.x := -d / 2 + Random * d;&lt;br /&gt;
    TreePosArray[i]^.y := 0.0;&lt;br /&gt;
    TreePosArray[i]^.z := -d / 2 + Random * d;&lt;br /&gt;
  end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Boden und die Bäume zeichen.&amp;lt;br&amp;gt;&lt;br /&gt;
Dabei ist es wichtig, das man zuerst den Boden zeichnet, weil die Bäume Alpha-Blending haben.&amp;lt;br&amp;gt;&lt;br /&gt;
Objecte mit Alpha-Blending sollte man immer zum Schluss zeichnen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
&lt;br /&gt;
  procedure QuickSort(var ia: array of PTreePos; ALo, AHi: integer);&lt;br /&gt;
  var&lt;br /&gt;
    Lo, Hi: integer;&lt;br /&gt;
    dummy : PTreePos;&lt;br /&gt;
    Pivot: TTreePos;&lt;br /&gt;
  begin&lt;br /&gt;
    Lo := ALo;&lt;br /&gt;
    Hi := AHi;&lt;br /&gt;
    Pivot := ia[(Lo + Hi) div 2]^;&lt;br /&gt;
    repeat&lt;br /&gt;
      while ia[Lo]^.z &amp;lt; Pivot.z do begin&lt;br /&gt;
        Inc(Lo);&lt;br /&gt;
      end;&lt;br /&gt;
      while ia[Hi]^.z &amp;gt; Pivot.z do begin&lt;br /&gt;
        Dec(Hi);&lt;br /&gt;
      end;&lt;br /&gt;
      if Lo &amp;lt;= Hi then begin&lt;br /&gt;
        dummy := ia[Lo];&lt;br /&gt;
        ia[Lo] := ia[Hi];&lt;br /&gt;
        ia[Hi] := dummy;&lt;br /&gt;
        Inc(Lo);&lt;br /&gt;
        Dec(Hi);&lt;br /&gt;
      end;&lt;br /&gt;
    until Lo &amp;gt; Hi;&lt;br /&gt;
    if Hi &amp;gt; ALo then begin&lt;br /&gt;
      QuickSort(ia, ALo, Hi);&lt;br /&gt;
    end;&lt;br /&gt;
    if Lo &amp;lt; AHi then begin&lt;br /&gt;
      QuickSort(ia, Lo, AHi);&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);        // Frame und Tiefen-Puffer löschen.&lt;br /&gt;
&lt;br /&gt;
  glEnable(GL_CULL_FACE);&lt;br /&gt;
  glCullface(GL_BACK);&lt;br /&gt;
&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
  // --- Zeichne Boden&lt;br /&gt;
  SandTextur.ActiveAndBind;                                   // Boden-Textur binden&lt;br /&gt;
  Matrix.Identity;&lt;br /&gt;
  Matrix.Translate(0.0, 1.0, 0.0);&lt;br /&gt;
  Matrix.Scale(10.0);&lt;br /&gt;
  Matrix.RotateA(Pi / 2);&lt;br /&gt;
&lt;br /&gt;
  Matrix := FrustumMatrix * WorldMatrix * GroundPos * Matrix; // Matrizen multiplizieren.&lt;br /&gt;
&lt;br /&gt;
  Matrix.Uniform(Matrix_ID);                                  // Matrix dem Shader übergeben.&lt;br /&gt;
  glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));&lt;br /&gt;
&lt;br /&gt;
  // --- Zeichne Bäume&lt;br /&gt;
  QuickSort(TreePosArray, 0, TreeCount - 1);                  // Die Bäume sortieren.&lt;br /&gt;
&lt;br /&gt;
  BaumTextur.ActiveAndBind;                                   // Baum-Textur binden&lt;br /&gt;
&lt;br /&gt;
  for i := 0 to TreeCount - 1 do begin&lt;br /&gt;
    Matrix.Identity;&lt;br /&gt;
    Matrix.Translate(TreePosArray[i]^);                       // Die Bäume an die richtige Position bringen&lt;br /&gt;
&lt;br /&gt;
    Matrix := FrustumMatrix * WorldMatrix * Matrix;           // Matrizen multiplizieren.&lt;br /&gt;
&lt;br /&gt;
    Matrix.Uniform(Matrix_ID);&lt;br /&gt;
    glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  ogc.SwapBuffers;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Da sieht man, das es reicht nur den Vector zu drehen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
const&lt;br /&gt;
  rot = 0.0134;&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to TreeCount - 1 do begin&lt;br /&gt;
    TreePosArray[i]^.RotateB(rot);&lt;br /&gt;
  end;&lt;br /&gt;
  GroundPos.RotateB(rot);&lt;br /&gt;
&lt;br /&gt;
  ogc.Invalidate;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location =  0) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
layout (location = 10) in vec2 inUV;  // Textur-Koordinaten&lt;br /&gt;
&lt;br /&gt;
out vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform mat4 Matrix;                  // Matrix für die Drehbewegung und Frustum.&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = Matrix * vec4(inPos, 1.0);&lt;br /&gt;
  UV0         = inUV;                 // Textur-Koordinaten weiterleiten.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fragment-Shader==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec2 UV0;&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D Sampler;              // Der Sampler welchem 0 zugeordnet wird.&lt;br /&gt;
&lt;br /&gt;
out vec4 FragColor;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  FragColor = texture( Sampler, UV0 );  // Die Farbe aus der Textur anhand der Koordinten auslesen.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Index-Puffer&amp;diff=26995</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Index-Puffer&amp;diff=26995"/>
				<updated>2018-08-01T16:01:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Vertex-Puffer - Index-Puffer =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Die Indicien, kann man auch von Anfang an ins VRAM laden, so müssen die Daten nich jedes mal mit '''glDrawElements(...''' neu übegeben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Dafür gibt es den ''' Index Buffer Objects''' (IBO).&amp;lt;br&amp;gt;&lt;br /&gt;
Das Laden geschieht ähnlich wie mit den Vertex-Daten.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Deklaration der Vektor-Koordianten und Indicien Konstanten, dies ist gleich wie ohne Buffer.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  // --- Dreieck&lt;br /&gt;
  // Vertex-Koordinaten&lt;br /&gt;
  Triangle: array[0..2] of TVertex3f =&lt;br /&gt;
    ((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0));&lt;br /&gt;
  // Indicien ( Reihenfolge )&lt;br /&gt;
  Triangle_Indices: array[0..2] of GLint = (0, 1, 2);&lt;br /&gt;
&lt;br /&gt;
  // --- Quadrat&lt;br /&gt;
  // Vertex-Koordinaten&lt;br /&gt;
  Quad: array[0..3] of TVertex3f =&lt;br /&gt;
    ((-0.2, -0.6, 0.0), (0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (-0.2, -0.1, 0.0));&lt;br /&gt;
  // Indicien ( Reihenfolge )&lt;br /&gt;
  Quad_Indices: array[0..5] of GLint = (0, 1, 2, 0, 2, 3);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der IBO muss noch deklariert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Erzeugen des IBI-Puffer geht gleich wie beim VBO-Puffer.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier werden die IBO-Daten in den Buffer geladen, dies geschieht ähnlich, wie bei den Vertex-Daten.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Unterschied ist der zweite Parameter, dieser muss '''GL_ELEMENT_ARRAY_BUFFER''' sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe&lt;br /&gt;
&lt;br /&gt;
  // --- Daten für das Dreieck&lt;br /&gt;
  glBindVertexArray(VBTriangle.VAO);&lt;br /&gt;
&lt;br /&gt;
  // VBO der Vertex-Koordinaten&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // IBO binden und mit den Indices-Daten laden&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBTriangle.IBO);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle_Indices), @Triangle_Indices, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  glEnableVertexAttribArray(10);&lt;br /&gt;
  glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
  // --- Daten für das Quadrat&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
  // VBO der Vertex-Koordinaten&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // IBO binden und mit den Indices-Daten laden&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBQuad.IBO);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Quad_Indices), @Quad_Indices, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  glEnableVertexAttribArray(10);&lt;br /&gt;
  glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Da die Indicien im IBO gespeichert sind muss der dritte Paramter bei '''glDrawElements(...''', nil sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);   // Linien&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  // Zeichne Dreieck&lt;br /&gt;
  glBindVertexArray(VBTriangle.VAO);&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, Length(Triangle_Indices), GL_UNSIGNED_INT, Nil);  // Hier Nil&lt;br /&gt;
&lt;br /&gt;
  // Zeichne Quadrat&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, Nil);      // Hier Nil&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
IBO Freigabe ist glech wie bei dem VBO.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  Shader.Free;&lt;br /&gt;
&lt;br /&gt;
  glDeleteBuffers(1, @VBTriangle.IBO);  // Indices-Buffer freigeben.&lt;br /&gt;
  glDeleteBuffers(1, @VBQuad.IBO);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  vec3 col = vec3(0.0, 1.0, 1.0); // Mint&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26994</id>
		<title>Lazarus - OpenGL 3.3 Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26994"/>
				<updated>2018-08-01T15:58:53Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lazarus - OpenGL 3.3 Tutorial=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.&amp;lt;br&amp;gt;&lt;br /&gt;
==Download==&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]&amp;lt;br&amp;gt;&lt;br /&gt;
==Tutorial==&lt;br /&gt;
=== Einrichten und Einstieg ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] &lt;br /&gt;
&amp;quot;Lazarus mit '''OpenGL 3.3'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was sind die Voraussetzungen.&lt;br /&gt;
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Arbeitsfläche erzeugen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Erste Vectoren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zeichen Routine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.&lt;br /&gt;
Somit stehen einem fast unendliche Effekte zu Verfügung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] &lt;br /&gt;
&amp;quot;Wie sollen die Polygone verarbeitet werden ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Das Herz von OpenGL 3.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sämtliche Effekt werden hier verarbeitet.&lt;br /&gt;
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] &lt;br /&gt;
&amp;quot;Äusere Beinflussung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Mesh sollte nicht statisch sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie bewege ich eine Mesh im Shader.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einer ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer gleich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zusätliche geometrische Berechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Ein Pixel ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Variable auslesen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/45_-_Variablen_Namen_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vertex-Puffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Mesh Daten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie gelangen die Daten der Mesh in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht immer 3D sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Vertex-Daten anstelle von 3D.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles zusammen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur einzeln Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.&lt;br /&gt;
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer am Stück&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch nur einen Teil einer Vertex-Array zeichnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] &lt;br /&gt;
&amp;quot;Eigene Reihenfolge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien im Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Index-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer_dynamisch source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID|VertexID]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|128px|right]] &lt;br /&gt;
&amp;quot;Welcher Vertex ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit gl_VertexID kann man im Vertex-Shader ermitteln, welcher Vertex gerade gezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_VertexID source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur schreiben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/60_-_Vertex-Puffer_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Matrix ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegung im Raum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Matrizen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] &lt;br /&gt;
&amp;quot;Planetarium&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== 3D ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde 3D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] &lt;br /&gt;
&amp;quot;Alles ist zu viel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur Vorn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] &lt;br /&gt;
&amp;quot;Ortografisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird meistens in einem CAD gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht mehr verzerrt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.&lt;br /&gt;
Dies passt man in der Perspektive an.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Alpha Blending ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Reihenfolge ist wichtig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] &lt;br /&gt;
&amp;quot;Zuerst hinten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Meshes sortieren, das Alphablending richtig kommt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch Texturen müssen sortiert werden&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch bei Texturen mit Alphablending ist die Reiehnfolge wichtig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] &lt;br /&gt;
&amp;quot;Es wird Erkennbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Einfachste Variante einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Hintergrund-Beleuchtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Restlicht ist (fast) immer vorhanden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Lichtquellen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Glühbirne&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Schnelle Lichtberechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Detailgetreues Licht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot; (ohne OpenGL)&lt;br /&gt;
&lt;br /&gt;
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe realistisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe wird schwach&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je weiter das Licht weg, je dünkler die Mesh.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Material Eigenschaften ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Materialien sind unterschiedlich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Lichtquelle.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine komplexe Taschenlampe mit Abschwächung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Bump Mapping ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Uniform Buffer Object (UBO) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Uniform als Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Shader-Parameter in einem Puffer zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Shader-Daten aktualisieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.&lt;br /&gt;
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Schneller Wechsel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Verbindungen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Verbindungen mit einem UBO sind möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;UBOs richtig nutzen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gebe Bilder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Polygone können mit Bilder ( Texturen ) überzogen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrer Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturen_von_BMP source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gibt viele Formate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.&lt;br /&gt;
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_mit_oglTextur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] &lt;br /&gt;
&amp;quot;Texturen als Text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_von_XPM source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegte Textur&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_und_Matrixen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] &lt;br /&gt;
&amp;quot;Huckepack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Multitexturing source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] &lt;br /&gt;
&amp;quot;Filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Texturen auf verschiedene Art darstellen und filtern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Filter source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Alpha-Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] &lt;br /&gt;
&amp;quot;Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Auswirkung unterschiedlicher Textur-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Textur-Koordinaten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] &lt;br /&gt;
&amp;quot;Verzerrte Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies kann man aber zum Glück korrigieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Texturen_Perspektiven-Korrektur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es geht auch 1D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/55_-_1D_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles auf einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_Textur_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array_einzel_Bitmap source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Cubemap Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Framepuffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht der Bildschirm sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Texturen rendern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] &lt;br /&gt;
&amp;quot;Verewigen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die gerenderte Scene auch in ein Bitmap speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Geometrie-Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Schatten ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Instancing ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] &lt;br /&gt;
&amp;quot;Chaotisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.&lt;br /&gt;
Die Anzahl der Instancen ist sehr begrenzt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] &lt;br /&gt;
&amp;quot;Flexibel sollte es sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.&lt;br /&gt;
Die Anzahl der Instancen ist fast unbegrenzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles in einem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann alle Parameter in ein Record packen.&lt;br /&gt;
Die ist mit Uniform nicht möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vektoren und Matrizen ( no OpenGL ) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik|Einleitung Vektorgrafik]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik.png|128px|right]] &lt;br /&gt;
&amp;quot;ohne OpenGL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was nimmt OpenGL einem für Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Einleitung_Vektorgrafik source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Matrix_2D_Demo source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Vektoren_Cube source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Gradient_Triangle source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/20_-_Vektoren_Cube_Z-Buffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices_in_VBO&amp;diff=26993</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices_in_VBO&amp;diff=26993"/>
				<updated>2018-08-01T15:56:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: Die Seite wurde geleert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID.png&amp;diff=26992</id>
		<title>Datei:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID.png&amp;diff=26992"/>
				<updated>2018-08-01T15:56:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID&amp;diff=26991</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID&amp;diff=26991"/>
				<updated>2018-08-01T15:55:55Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Vertex-Puffer - VertexID =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit '''gl_VertexID''' kann man im Vertex-Shader ermitteln, welcher Vertex aus der Vertex-Array gezeichnet wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Rendering ist nicht besonderes, es spielt sich alles im Vertex-Shader ab.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Koordinaten der Mesh, maximal 6 Stück&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  Triangle: array[0..0] of TFace2D =&lt;br /&gt;
    (((-0.4, 0.1), (0.4, 0.1), (0.0, 0.7)));&lt;br /&gt;
  Quad: array[0..1] of TFace2D =&lt;br /&gt;
    (((-0.2, -0.6), (-0.2, -0.1), (0.2, -0.1)),&lt;br /&gt;
    (( -0.2, -0.6), (0.2, -0.1), (0.2, -0.6)));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Da es in diesem Beispiel nur maximal 6 Vertex-Punkte gibt, habe ich die VertexID mit einer einfachen Case-Schleife ausgewertet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec2 inPos;&lt;br /&gt;
&lt;br /&gt;
out vec3 col;&lt;br /&gt;
 &lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 0.0, 1.0);&lt;br /&gt;
  switch (gl_VertexID) // Den aktuellen Vertex abfragen.&lt;br /&gt;
  {&lt;br /&gt;
    case 0:  col = vec3(1.0, 0.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 1:  col = vec3(0.0, 1.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 2:  col = vec3(0.0, 0.0, 1.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 3:  col = vec3(1.0, 1.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 4:  col = vec3(0.0, 1.0, 1.0);&lt;br /&gt;
             break;&lt;br /&gt;
    default: col = vec3(1.0, 0.0, 1.0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;&lt;br /&gt;
&lt;br /&gt;
in  vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void) {&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID&amp;diff=26990</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID&amp;diff=26990"/>
				<updated>2018-08-01T15:52:40Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Vertex-Puffer - VertexID =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit '''gl_VertexID''' kann man im Vertex-Shader ermitteln, welcher Vertex aus der Vertex-Array gezeichnet wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Rendering ist nicht besonderes, es spielt sich alles im Vertex-Shader ab.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Da es in diesem Beispiel nur maximal 6 Vertex-Punkte gibt, habe ich die VertexID mit einer einfachen Case-Schleife ausgewertet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec3 inPos;&lt;br /&gt;
&lt;br /&gt;
out vec3 col;&lt;br /&gt;
 &lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 1.0);&lt;br /&gt;
  switch (gl_VertexID) // Den aktuellen Vertex abfragen.&lt;br /&gt;
  {&lt;br /&gt;
    case 0:  col = vec3(1.0, 0.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 1:  col = vec3(0.0, 1.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 2:  col = vec3(0.0, 0.0, 1.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 3:  col = vec3(1.0, 1.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 4:  col = vec3(0.0, 1.0, 1.0);&lt;br /&gt;
             break;&lt;br /&gt;
    default: col = vec3(1.0, 0.0, 1.0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;&lt;br /&gt;
&lt;br /&gt;
in  vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void) {&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID&amp;diff=26989</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_VertexID&amp;diff=26989"/>
				<updated>2018-08-01T15:51:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: Die Seite wurde neu angelegt: „200px&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; =Vertex-Puffer - VertexID = == Einleitung == Mit '''gl_VertexID''' kann ma…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Vertex-Puffer - VertexID =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit '''gl_VertexID''' kann man im Vertex-Shader ermitteln, welcher Vertex aus der Vertex-Array gezeichnet wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Rendering ist nicht besonderes, es spielt sich alles im Vertex-Shader ab.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Da es in diesem Beispiel nur maximal 6 Vertex-Punkte gibt, habe ich die VertexID mit einer einfachen Case-Schleife ausgewertet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec3 inPos;&lt;br /&gt;
&lt;br /&gt;
out vec3 col;&lt;br /&gt;
 &lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 1.0);&lt;br /&gt;
  switch (gl_VertexID) // Den aktuellen Vertex abfragen.&lt;br /&gt;
  {&lt;br /&gt;
    case 0:  col = vec3(1.0, 0.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 1:  col = vec3(0.0, 1.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 2:  col = vec3(0.0, 0.0, 1.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 3:  col = vec3(1.0, 1.0, 0.0);&lt;br /&gt;
             break;&lt;br /&gt;
    case 4:  col = vec3(0.0, 1.0, 1.0);&lt;br /&gt;
             break;&lt;br /&gt;
    default: col = vec3(1.0, 0.0, 1.0);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;&lt;br /&gt;
&lt;br /&gt;
in  vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void) {&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26988</id>
		<title>Lazarus - OpenGL 3.3 Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26988"/>
				<updated>2018-08-01T15:50:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lazarus - OpenGL 3.3 Tutorial=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.&amp;lt;br&amp;gt;&lt;br /&gt;
==Download==&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]&amp;lt;br&amp;gt;&lt;br /&gt;
==Tutorial==&lt;br /&gt;
=== Einrichten und Einstieg ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] &lt;br /&gt;
&amp;quot;Lazarus mit '''OpenGL 3.3'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was sind die Voraussetzungen.&lt;br /&gt;
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Arbeitsfläche erzeugen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Erste Vectoren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zeichen Routine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.&lt;br /&gt;
Somit stehen einem fast unendliche Effekte zu Verfügung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] &lt;br /&gt;
&amp;quot;Wie sollen die Polygone verarbeitet werden ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Das Herz von OpenGL 3.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sämtliche Effekt werden hier verarbeitet.&lt;br /&gt;
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] &lt;br /&gt;
&amp;quot;Äusere Beinflussung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Mesh sollte nicht statisch sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie bewege ich eine Mesh im Shader.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einer ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer gleich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zusätliche geometrische Berechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Ein Pixel ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Variable auslesen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/45_-_Variablen_Namen_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vertex-Puffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Mesh Daten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie gelangen die Daten der Mesh in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht immer 3D sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Vertex-Daten anstelle von 3D.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles zusammen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur einzeln Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.&lt;br /&gt;
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer am Stück&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch nur einen Teil einer Vertex-Array zeichnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] &lt;br /&gt;
&amp;quot;Eigene Reihenfolge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien im Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Index-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer_dynamisch source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur schreiben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_Vertex-Puffer_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID|VertexID]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|128px|right]] &lt;br /&gt;
&amp;quot;Welcher Vertex ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit gl_VertexID kann man im Vertex-Shader ermitteln, welcher Vertex gerade gezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/60_-_VertexID source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Matrix ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegung im Raum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Matrizen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] &lt;br /&gt;
&amp;quot;Planetarium&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== 3D ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde 3D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] &lt;br /&gt;
&amp;quot;Alles ist zu viel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur Vorn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] &lt;br /&gt;
&amp;quot;Ortografisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird meistens in einem CAD gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht mehr verzerrt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.&lt;br /&gt;
Dies passt man in der Perspektive an.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Alpha Blending ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Reihenfolge ist wichtig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] &lt;br /&gt;
&amp;quot;Zuerst hinten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Meshes sortieren, das Alphablending richtig kommt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch Texturen müssen sortiert werden&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch bei Texturen mit Alphablending ist die Reiehnfolge wichtig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] &lt;br /&gt;
&amp;quot;Es wird Erkennbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Einfachste Variante einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Hintergrund-Beleuchtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Restlicht ist (fast) immer vorhanden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Lichtquellen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Glühbirne&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Schnelle Lichtberechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Detailgetreues Licht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot; (ohne OpenGL)&lt;br /&gt;
&lt;br /&gt;
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe realistisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe wird schwach&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je weiter das Licht weg, je dünkler die Mesh.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Material Eigenschaften ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Materialien sind unterschiedlich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Lichtquelle.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine komplexe Taschenlampe mit Abschwächung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Bump Mapping ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Uniform Buffer Object (UBO) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Uniform als Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Shader-Parameter in einem Puffer zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Shader-Daten aktualisieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.&lt;br /&gt;
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Schneller Wechsel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Verbindungen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Verbindungen mit einem UBO sind möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;UBOs richtig nutzen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gebe Bilder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Polygone können mit Bilder ( Texturen ) überzogen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrer Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturen_von_BMP source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gibt viele Formate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.&lt;br /&gt;
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_mit_oglTextur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] &lt;br /&gt;
&amp;quot;Texturen als Text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_von_XPM source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegte Textur&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_und_Matrixen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] &lt;br /&gt;
&amp;quot;Huckepack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Multitexturing source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] &lt;br /&gt;
&amp;quot;Filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Texturen auf verschiedene Art darstellen und filtern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Filter source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Alpha-Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] &lt;br /&gt;
&amp;quot;Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Auswirkung unterschiedlicher Textur-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Textur-Koordinaten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] &lt;br /&gt;
&amp;quot;Verzerrte Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies kann man aber zum Glück korrigieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Texturen_Perspektiven-Korrektur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es geht auch 1D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/55_-_1D_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles auf einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_Textur_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array_einzel_Bitmap source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Cubemap Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Framepuffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht der Bildschirm sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Texturen rendern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] &lt;br /&gt;
&amp;quot;Verewigen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die gerenderte Scene auch in ein Bitmap speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Geometrie-Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Schatten ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Instancing ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] &lt;br /&gt;
&amp;quot;Chaotisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.&lt;br /&gt;
Die Anzahl der Instancen ist sehr begrenzt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] &lt;br /&gt;
&amp;quot;Flexibel sollte es sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.&lt;br /&gt;
Die Anzahl der Instancen ist fast unbegrenzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles in einem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann alle Parameter in ein Record packen.&lt;br /&gt;
Die ist mit Uniform nicht möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vektoren und Matrizen ( no OpenGL ) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik|Einleitung Vektorgrafik]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik.png|128px|right]] &lt;br /&gt;
&amp;quot;ohne OpenGL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was nimmt OpenGL einem für Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Einleitung_Vektorgrafik source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Matrix_2D_Demo source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Vektoren_Cube source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Gradient_Triangle source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/20_-_Vektoren_Cube_Z-Buffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26987</id>
		<title>Lazarus - OpenGL 3.3 Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26987"/>
				<updated>2018-08-01T15:48:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lazarus - OpenGL 3.3 Tutorial=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.&amp;lt;br&amp;gt;&lt;br /&gt;
==Download==&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]&amp;lt;br&amp;gt;&lt;br /&gt;
==Tutorial==&lt;br /&gt;
=== Einrichten und Einstieg ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] &lt;br /&gt;
&amp;quot;Lazarus mit '''OpenGL 3.3'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was sind die Voraussetzungen.&lt;br /&gt;
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Arbeitsfläche erzeugen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Erste Vectoren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zeichen Routine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.&lt;br /&gt;
Somit stehen einem fast unendliche Effekte zu Verfügung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] &lt;br /&gt;
&amp;quot;Wie sollen die Polygone verarbeitet werden ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Das Herz von OpenGL 3.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sämtliche Effekt werden hier verarbeitet.&lt;br /&gt;
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] &lt;br /&gt;
&amp;quot;Äusere Beinflussung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Mesh sollte nicht statisch sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie bewege ich eine Mesh im Shader.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einer ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer gleich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zusätliche geometrische Berechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Ein Pixel ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Variable auslesen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/45_-_Variablen_Namen_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vertex-Puffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Mesh Daten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie gelangen die Daten der Mesh in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht immer 3D sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Vertex-Daten anstelle von 3D.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles zusammen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur einzeln Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.&lt;br /&gt;
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer am Stück&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch nur einen Teil einer Vertex-Array zeichnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] &lt;br /&gt;
&amp;quot;Eigene Reihenfolge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO|Indices in VBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Indices im Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Indices kann man auch in einem VBO speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Indices_in_VBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien im Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_Index-Puffer_dynamisch source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur schreiben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/60_-_Vertex-Puffer_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID|VertexID]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|128px|right]] &lt;br /&gt;
&amp;quot;Welcher Vertex ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit gl_VertexID kann man im Vertex-Shader ermitteln, welcher Vertex gerade gezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/65_-_VertexID source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Matrix ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegung im Raum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Matrizen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] &lt;br /&gt;
&amp;quot;Planetarium&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== 3D ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde 3D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] &lt;br /&gt;
&amp;quot;Alles ist zu viel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur Vorn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] &lt;br /&gt;
&amp;quot;Ortografisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird meistens in einem CAD gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht mehr verzerrt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.&lt;br /&gt;
Dies passt man in der Perspektive an.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Alpha Blending ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Reihenfolge ist wichtig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] &lt;br /&gt;
&amp;quot;Zuerst hinten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Meshes sortieren, das Alphablending richtig kommt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch Texturen müssen sortiert werden&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch bei Texturen mit Alphablending ist die Reiehnfolge wichtig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] &lt;br /&gt;
&amp;quot;Es wird Erkennbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Einfachste Variante einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Hintergrund-Beleuchtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Restlicht ist (fast) immer vorhanden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Lichtquellen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Glühbirne&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Schnelle Lichtberechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Detailgetreues Licht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot; (ohne OpenGL)&lt;br /&gt;
&lt;br /&gt;
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe realistisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe wird schwach&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je weiter das Licht weg, je dünkler die Mesh.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Material Eigenschaften ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Materialien sind unterschiedlich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Lichtquelle.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine komplexe Taschenlampe mit Abschwächung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Bump Mapping ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Uniform Buffer Object (UBO) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Uniform als Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Shader-Parameter in einem Puffer zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Shader-Daten aktualisieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.&lt;br /&gt;
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Schneller Wechsel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Verbindungen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Verbindungen mit einem UBO sind möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;UBOs richtig nutzen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gebe Bilder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Polygone können mit Bilder ( Texturen ) überzogen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrer Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturen_von_BMP source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gibt viele Formate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.&lt;br /&gt;
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_mit_oglTextur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] &lt;br /&gt;
&amp;quot;Texturen als Text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_von_XPM source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegte Textur&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_und_Matrixen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] &lt;br /&gt;
&amp;quot;Huckepack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Multitexturing source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] &lt;br /&gt;
&amp;quot;Filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Texturen auf verschiedene Art darstellen und filtern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Filter source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Alpha-Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] &lt;br /&gt;
&amp;quot;Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Auswirkung unterschiedlicher Textur-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Textur-Koordinaten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] &lt;br /&gt;
&amp;quot;Verzerrte Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies kann man aber zum Glück korrigieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Texturen_Perspektiven-Korrektur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es geht auch 1D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/55_-_1D_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles auf einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_Textur_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array_einzel_Bitmap source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Cubemap Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Framepuffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht der Bildschirm sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Texturen rendern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] &lt;br /&gt;
&amp;quot;Verewigen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die gerenderte Scene auch in ein Bitmap speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Geometrie-Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Schatten ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Instancing ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] &lt;br /&gt;
&amp;quot;Chaotisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.&lt;br /&gt;
Die Anzahl der Instancen ist sehr begrenzt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] &lt;br /&gt;
&amp;quot;Flexibel sollte es sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.&lt;br /&gt;
Die Anzahl der Instancen ist fast unbegrenzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles in einem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann alle Parameter in ein Record packen.&lt;br /&gt;
Die ist mit Uniform nicht möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vektoren und Matrizen ( no OpenGL ) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik|Einleitung Vektorgrafik]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik.png|128px|right]] &lt;br /&gt;
&amp;quot;ohne OpenGL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was nimmt OpenGL einem für Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Einleitung_Vektorgrafik source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Matrix_2D_Demo source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Vektoren_Cube source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Gradient_Triangle source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/20_-_Vektoren_Cube_Z-Buffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices_in_VBO.png&amp;diff=26986</id>
		<title>Datei:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices_in_VBO.png&amp;diff=26986"/>
				<updated>2018-08-01T15:16:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices_in_VBO&amp;diff=26985</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices_in_VBO&amp;diff=26985"/>
				<updated>2018-08-01T15:16:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: Die Seite wurde neu angelegt: „200px&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; =Vertex-Puffer - Indices in VBO = == Einleitung == Die Indices kann…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Vertex-Puffer - Indices in VBO =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Die Indices kann man auch in einen VBO speichern.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Indices in den VBO speichern, geht mit folgedem Befehl '''glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Dies geschieht auch innerhalb der VAO.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe&lt;br /&gt;
&lt;br /&gt;
  // --- Daten für das Dreieck&lt;br /&gt;
  // VAO binden&lt;br /&gt;
  glBindVertexArray(VBTriangle.VAO);&lt;br /&gt;
&lt;br /&gt;
  // Indices-Array mit VBO binden umd mit Daten befüllen.&lt;br /&gt;
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBTriangle.VBO.Indicies);&lt;br /&gt;
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle_Indices), @Triangle_Indices, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // Vertex-Array mit VBO binden umd mit Daten befüllen.&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO.Vertex);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);&lt;br /&gt;
  glEnableVertexAttribArray(10);&lt;br /&gt;
  glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei '''glDrawElements(...''', gibt man als dritten Parameter nur noch '''nil''' mit.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Indices sind im VAO gebunden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);   // Linien&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  // Zeichne Dreieck&lt;br /&gt;
  glBindVertexArray(VBTriangle.VAO);&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, Length(Triangle_Indices), GL_UNSIGNED_INT, nil); // Nur nil&lt;br /&gt;
&lt;br /&gt;
  // Zeichne Quadrat&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, nil); // Nur nil&lt;br /&gt;
&lt;br /&gt;
  ogc.SwapBuffers;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  outColor = vec4(vec3(0.0, 1.0, 1.0), 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26984</id>
		<title>Lazarus - OpenGL 3.3 Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26984"/>
				<updated>2018-08-01T15:15:22Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lazarus - OpenGL 3.3 Tutorial=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.&amp;lt;br&amp;gt;&lt;br /&gt;
==Download==&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]&amp;lt;br&amp;gt;&lt;br /&gt;
==Tutorial==&lt;br /&gt;
=== Einrichten und Einstieg ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] &lt;br /&gt;
&amp;quot;Lazarus mit '''OpenGL 3.3'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was sind die Voraussetzungen.&lt;br /&gt;
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Arbeitsfläche erzeugen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Erste Vectoren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zeichen Routine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.&lt;br /&gt;
Somit stehen einem fast unendliche Effekte zu Verfügung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] &lt;br /&gt;
&amp;quot;Wie sollen die Polygone verarbeitet werden ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Das Herz von OpenGL 3.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sämtliche Effekt werden hier verarbeitet.&lt;br /&gt;
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] &lt;br /&gt;
&amp;quot;Äusere Beinflussung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Mesh sollte nicht statisch sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie bewege ich eine Mesh im Shader.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einer ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer gleich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zusätliche geometrische Berechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Ein Pixel ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Variable auslesen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/50_-_Variablen_Namen_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vertex-Puffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Mesh Daten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie gelangen die Daten der Mesh in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht immer 3D sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Vertex-Daten anstelle von 3D.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles zusammen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur einzeln Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.&lt;br /&gt;
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer am Stück&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch nur einen Teil einer Vertex-Array zeichnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] &lt;br /&gt;
&amp;quot;Eigene Reihenfolge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO|Indices in VBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices in VBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Indices im Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Indices kann man auch in einem VBO speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/42_-_Indices_in_VBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien im Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Index-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer_dynamisch source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur schreiben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_Vertex-Puffer_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID|VertexID]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/60_-_VertexID source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Matrix ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegung im Raum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Matrizen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] &lt;br /&gt;
&amp;quot;Planetarium&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== 3D ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde 3D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] &lt;br /&gt;
&amp;quot;Alles ist zu viel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur Vorn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] &lt;br /&gt;
&amp;quot;Ortografisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird meistens in einem CAD gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht mehr verzerrt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.&lt;br /&gt;
Dies passt man in der Perspektive an.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Alpha Blending ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Reihenfolge ist wichtig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] &lt;br /&gt;
&amp;quot;Zuerst hinten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Meshes sortieren, das Alphablending richtig kommt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch Texturen müssen sortiert werden&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch bei Texturen mit Alphablending ist die Reiehnfolge wichtig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] &lt;br /&gt;
&amp;quot;Es wird Erkennbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Einfachste Variante einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Hintergrund-Beleuchtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Restlicht ist (fast) immer vorhanden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Lichtquellen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Glühbirne&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Schnelle Lichtberechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Detailgetreues Licht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot; (ohne OpenGL)&lt;br /&gt;
&lt;br /&gt;
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe realistisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe wird schwach&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je weiter das Licht weg, je dünkler die Mesh.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Material Eigenschaften ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Materialien sind unterschiedlich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Lichtquelle.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine komplexe Taschenlampe mit Abschwächung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Bump Mapping ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Uniform Buffer Object (UBO) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Uniform als Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Shader-Parameter in einem Puffer zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Shader-Daten aktualisieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.&lt;br /&gt;
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Schneller Wechsel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Verbindungen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Verbindungen mit einem UBO sind möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;UBOs richtig nutzen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gebe Bilder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Polygone können mit Bilder ( Texturen ) überzogen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrer Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturen_von_BMP source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gibt viele Formate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.&lt;br /&gt;
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_mit_oglTextur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] &lt;br /&gt;
&amp;quot;Texturen als Text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_von_XPM source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegte Textur&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_und_Matrixen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] &lt;br /&gt;
&amp;quot;Huckepack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Multitexturing source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] &lt;br /&gt;
&amp;quot;Filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Texturen auf verschiedene Art darstellen und filtern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Filter source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Alpha-Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] &lt;br /&gt;
&amp;quot;Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Auswirkung unterschiedlicher Textur-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Textur-Koordinaten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] &lt;br /&gt;
&amp;quot;Verzerrte Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies kann man aber zum Glück korrigieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Texturen_Perspektiven-Korrektur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es geht auch 1D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_1D_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles auf einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/70_-_Textur_Array_einzel_Bitmap source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Cubemap Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Framepuffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht der Bildschirm sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Texturen rendern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] &lt;br /&gt;
&amp;quot;Verewigen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die gerenderte Scene auch in ein Bitmap speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Geometrie-Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Schatten ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Instancing ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] &lt;br /&gt;
&amp;quot;Chaotisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.&lt;br /&gt;
Die Anzahl der Instancen ist sehr begrenzt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] &lt;br /&gt;
&amp;quot;Flexibel sollte es sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.&lt;br /&gt;
Die Anzahl der Instancen ist fast unbegrenzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles in einem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann alle Parameter in ein Record packen.&lt;br /&gt;
Die ist mit Uniform nicht möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vektoren und Matrizen ( no OpenGL ) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik|Einleitung Vektorgrafik]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik.png|128px|right]] &lt;br /&gt;
&amp;quot;ohne OpenGL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was nimmt OpenGL einem für Arbeit ab.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Einleitung_Vektorgrafik source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/02_-_Matrix_2D_Demo source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Vektoren_Cube source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Gradient_Triangle source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Vektoren_Cube_Z-Buffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices&amp;diff=26983</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices&amp;diff=26983"/>
				<updated>2018-08-01T15:13:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Vertex-Puffer - Indices =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Normalerweise, werden die Polygone der Reihenfolge der Vertex-Konstanten abgearbeitet.&amp;lt;br&amp;gt;&lt;br /&gt;
Man kann aber auch selbst bestimmen, welche Koordinate abgearbeitet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Dafür muss man eine Indices-Array kreieren, welche die Reihenfolge der Koordinaten bestimmt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Der Unterschied zum einfachen Zeichenn ist, das ich noch eine Indicen-Array brauche.&amp;lt;br&amp;gt;&lt;br /&gt;
Und das Zeichnen ist vor allem anders.&amp;lt;br&amp;gt;&lt;br /&gt;
Man verwendet anstelle von '''glDrawArrays(...''', '''glDrawElements(...''', welche als dritten Parameter noch einen Zeiger auf die Indicen-Array bekommt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Deklaration der Vektor-Koordianten und Indicien Konstanten.&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Dreieck sieht man keinen Vorteil bei der Indicien-Version, da das Dreieck sowieso nur aus einem Polygon besteht.&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Quadrat, konnten so schon zwei Koordinaten eingespart werden, da man die Eckpunkte nur einmal angeben muss.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei der einfachen Variante bräuchte es dafür sechs Eckpunte, weil dort zwei Punkte doppelt vorhandnen sein müssen.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einem Würfel ist der Vorteil noch grösser, da braucht es bei der einfachen Version 36 Punkte, bei der Indicien-Version, nur 8 Stück !&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mit den Indicen kann ich sagen, zeichen von Punkt 0-1-2 und von Punkt 0-2-3.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;3 - 2&lt;br /&gt;
| / |&lt;br /&gt;
0 - 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  // --- Dreieck&lt;br /&gt;
  // Vertex-Koordinaten&lt;br /&gt;
  Triangle: array[0..2] of TVertex3f =&lt;br /&gt;
    ((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0));&lt;br /&gt;
  // Indicien ( Reihenfolge )&lt;br /&gt;
  Triangle_Indices: array[0..2] of GLint = (0, 1, 2);&lt;br /&gt;
&lt;br /&gt;
  // --- Quadrat&lt;br /&gt;
  // Vertex-Koordinaten&lt;br /&gt;
  Quad: array[0..3] of TVertex3f =&lt;br /&gt;
    ((-0.2, -0.6, 0.0), (0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (-0.2, -0.1, 0.0));&lt;br /&gt;
  // Indicien ( Reihenfolge )&lt;br /&gt;
  Quad_Indices: array[0..5] of GLint = (0, 1, 2, 0, 2, 3);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei '''glDrawElements(...''', muss als dritten Parameter der Zeiger auf die Indicien-Array übergeben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Ansonsten geht das Zeichen gleich, wie bei der einfachen Methode.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Polygonmodus wurde auf Linien umgestellt, so das man die Polygone besser sieht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);   // Linien&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  // Zeichne Dreieck&lt;br /&gt;
  glBindVertexArray(VBTriangle.VAO);&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, Length(Triangle_Indices), GL_UNSIGNED_INT, @Triangle_Indices);&lt;br /&gt;
&lt;br /&gt;
  // Zeichne Quadrat&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, @Quad_Indices);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  vec3 col = vec3(1.0, 1.0, 0.0); // Gelb&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;br /&gt;
�&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=GLSL_Partikel_2&amp;diff=26982</id>
		<title>GLSL Partikel 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=GLSL_Partikel_2&amp;diff=26982"/>
				<updated>2018-08-01T14:31:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Emitter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:Partikel-Hovercraft.jpg|thumb|256px|Hovercraft wirbelt Staub auf.]]&lt;br /&gt;
Der [[GLSL_Partikel|klassische Ansatz]] eines GPU Partikelsystems verwendet eine oder mehrere Texturen um die Partikel zu speichern. Zur Aktualisierung wird ein Quad in Größe dieser Textur gerendert. Der [[Fragmentshader]] liest die alten Daten aus einem Backbuffer und schreibt die aktualisierten Partikel in den Framebuffer. Dieses Verfahren ist an sich sehr effizient, hat aber einige Nachteile:&lt;br /&gt;
* Es ist sehr kompliziert effizient neue Partikel von der CPU zu emittieren. Die CPU muss immer wissen wo sich aktive Partikel in der Textur befinden. Sind die Lebensdauern der Partikel unterschiedlich (oder gar zufällig) wird dies zu einem echten Problem. In der Regel erfordert dies zumindest die Berechnung der Lebendauer zusätzlich auch auf der CPU durchzuführen, was natürlich nicht der Sinn eines GPU Partikelsystems ist.&lt;br /&gt;
* Da die Partikelanordnung wie gerade beschrieben fragmentiert, muss beim rendern der Partikel immer die vollständige Textur verarbeitet werden, auch wenn eigentlich nur wenige Partikel tatsächlich aktiv sind. Außerdem ist zum rendern ein großes [[VBO]] mit Dummy-Partikeln erforderlich, die eigentlich keine Daten enthalten.&lt;br /&gt;
* Sollen die Partikel zum Beispiel nach der Entfernung zur Kamera sortiert werden, ist dies sehr aufwendig. Auf der GPU verwendet man üblicherweise Odd-Even-Mergesort oder Bitonic-Sort. Beide Algorithmen vergleichen jeweils zwei Elemente und führen dann ggf. einen Tausch (Swap) dieser Elemente aus. Im Fragmentshader lässt sich jedoch die Position eines Fragments nicht mehr nachträglich ändern. Eine Implementierung im Fragmentshader erfordert also, dass jeder Vergleich zweimal durchgeführt wird. Das bedeutet auch, dass jeder Texturzugriff zweimal durchgeführt werden muss. Zudem erfordern beide Algorithmen sehr viele Passes. Für eine Million Partikel (1024²) sind so etwa 210 Passes erforderlich. Dies ist auch bei einer Verteilung über mehrere Frames nicht mehr sinnvoll in Echtzeit durchführbar.&lt;br /&gt;
Durch die Benutzung der Features aktueller Grafikhardware wie dem [[Geometryshader]], [[Transform-Feedback]], [[Instancing]] sowie diverser weiterer Features des Shader Model 4.0 lässt sich hier viel optimieren. Dieser Artikel setzt die Kenntnis dieser Funktionen voraus. Desweiteren sollte man natürlich wissen wie ein [[Partikelsystem|(state-preserving) Partikelsystem]] funktioniert, also zum Beispiel etwas mit den Begriffen [[Partikelsystem:Emitter|Emitter]] und [[Partikelsystem:Forcefield|Forcefield]] anfangen können.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
Ich verwende hier neben OpenGL 2.0 auch zahlreiche Extensions. Wenn man das Grundprinzip verstanden hat sollte es kein Problem sein diese Extensions durch eventuell verfügbare aktuellere Extensions zu ersetzen.&lt;br /&gt;
* [[GL_ARB_texture_float]]&lt;br /&gt;
* [[GL_EXT_texture_integer]]&lt;br /&gt;
* [[GL_EXT_texture_buffer_object]]&lt;br /&gt;
* [[GL_EXT_gpu_shader4]]&lt;br /&gt;
* [[GL_NV_transform_feedback]]&lt;br /&gt;
* [[GL_EXT_geometry_shader4]]&lt;br /&gt;
Zum speichern der Partikeldaten verwende ich mehrere Texturbuffer-Objects (TBO).&lt;br /&gt;
* ein 4x32bit-float Buffer zum speichern der Position und Größe des Partikels (''GL_RGBA32F_ARB'')&lt;br /&gt;
* ein weiterer 4x32bit-float Buffer zum speichern der Velocity und Lebenszeit des Partikels (''GL_RGBA32F_ARB'')&lt;br /&gt;
* ein 32bit-unsigned Buffer zum speichern des aktuellen Zufallsseed (''GL_LUMINANCE32UI_EXT'')&lt;br /&gt;
Alle Partikel werden durch Emitter erzeugt. Da uns später immer die genaue Anzahl der aktiven Partikel bekannt sein wird, müssen die Buffer nicht initialisiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Update ===&lt;br /&gt;
Das wichtigste an einem Partikelsystem ist immer der Update-Schritt. Daher fangen wir auch damit an. Auch wenn wir erst später erfahren wie neu erzeugte Partikel eigentlich in den Buffer kommen, nehmen wir zunächst einmal an die Buffer wären mit aktiven Partikeln gefüllt.&lt;br /&gt;
&lt;br /&gt;
Eine Grafikkarte kann nicht aus einem Buffer lesen und gleichzeitig auch hinein schreiben. Wir benötigen also jeden Buffer doppelt: Einen Inputbuffer aus dem wir als VBO bzw. TBO lesen, während wir in den Outputbuffer via Transform-Feedback schreiben. Nach jedem Updateschritt werden die Rollen der Buffer getauscht.&lt;br /&gt;
&lt;br /&gt;
Zunächst interpretieren wir den Position-Inputbuffer als Vertexbuffer und rendern sämtliche Partikel. Der Vertexshader ist trivial, denn die eigentliche Arbeit verrichtet der Geometryshader. Clipping und alles was danach in der [[:Bild:Pipeline.png|Pipeline]] kommt wird nicht benötigt. Also insbesondere der Rasterizer und der Fragmentshader. Darum schalten wird diesen unnötigen Kram mit {{INLINE_CODE|glEnable(GL_RASTERIZER_DISCARD_NV)}} einfach ab. Man sollte natürlich nicht vergessen das ganze später wieder einzuschalten.&lt;br /&gt;
&lt;br /&gt;
'''Vertexshader''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;void main() {&lt;br /&gt;
	gl_Position = gl_Vertex;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Geometryshader''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;#extension GL_EXT_gpu_shader4 : enable&lt;br /&gt;
#extension GL_EXT_geometry_shader4: enable&lt;br /&gt;
&lt;br /&gt;
uniform samplerBuffer tboVelocity;&lt;br /&gt;
uniform usamplerBuffer tboRandom;&lt;br /&gt;
uniform float timeElapsed;&lt;br /&gt;
&lt;br /&gt;
varying out vec4 velocity_out;&lt;br /&gt;
varying out unsigned int seed;&lt;br /&gt;
&lt;br /&gt;
const vec3 wind = vec3(1.0, 1.0, 2.0);&lt;br /&gt;
&lt;br /&gt;
vec3 constField() {&lt;br /&gt;
	return timeElapsed * wind;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vec3 dampField(vec3 velocity, float strength) {&lt;br /&gt;
	return -velocity*strength*timeElapsed;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vec3 noiseField(float strength) {&lt;br /&gt;
	vec3 result;&lt;br /&gt;
	seed = (seed * 1103515245u + 12345u); result.x = float(seed);&lt;br /&gt;
	seed = (seed * 1103515245u + 12345u); result.y = float(seed);&lt;br /&gt;
	seed = (seed * 1103515245u + 12345u); result.z = float(seed);&lt;br /&gt;
	return timeElapsed * strength * ((result / 4294967296.0) - vec3(0.5,0.5,0.5));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
	// get all particle data&lt;br /&gt;
	vec3 position = gl_PositionIn[0].xyz;&lt;br /&gt;
	float size = gl_PositionIn[0].w;&lt;br /&gt;
&lt;br /&gt;
	vec4 tmp = texelFetchBuffer(tboVelocity, gl_PrimitiveIDIn);&lt;br /&gt;
	vec3 velocity = tmp.xyz;&lt;br /&gt;
	float lifetime = tmp.w;&lt;br /&gt;
&lt;br /&gt;
	// update lifetime and discard dead particles&lt;br /&gt;
	lifetime -= timeElapsed;&lt;br /&gt;
	if (lifetime &amp;lt;= 0.0) { return; }&lt;br /&gt;
&lt;br /&gt;
	// update position and size&lt;br /&gt;
	position += velocity * timeElapsed;&lt;br /&gt;
	size += 0.3 * size * timeElapsed;&lt;br /&gt;
	&lt;br /&gt;
	// read current random seed&lt;br /&gt;
	seed = texelFetchBuffer(tboRandom, gl_PrimitiveIDIn).x;&lt;br /&gt;
&lt;br /&gt;
	// update velocity by applying force fields&lt;br /&gt;
	velocity += dampField(velocity, 0.5);&lt;br /&gt;
	velocity += constField();&lt;br /&gt;
	velocity += noiseField(1.0);&lt;br /&gt;
	&lt;br /&gt;
	// write vertex&lt;br /&gt;
	gl_Position = vec4(position, size);&lt;br /&gt;
	velocity_out = vec4(velocity, lifetime);&lt;br /&gt;
	EmitVertex();&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da wir GL_POINTS rendern ist ein Primitiv genau einen Vertex groß. Aus diesem Grund eignet sich die eingebaute Variable {{INLINE_CODE|gl_PrimitiveIDIn}} perfekt als Arrayindex. Via TexelFetch können wir also Velocity, Lebenszeit und aktuellen Seed auslesen.&lt;br /&gt;
&lt;br /&gt;
Ist die Lebenszeit eines Partikels abgelaufen, brechen wir die Verarbeitung dieses Partikels ab. Die Funktion {{INLINE_CODE|EmitVertex()}} wird also nicht aufgerufen und der Partikel somit unterdrückt. Der entscheidende Vorteil von Transform-Feedback an dieser Stelle ist nun, das beim schreiben in den Outputbuffer &amp;lt;u&amp;gt;keine&amp;lt;/u&amp;gt; Lücke entsteht. Es tritt also keine Fragmentierung auf. Am Ende des Updatevorgangs befinden sich alle Partikel aufgeräumt am Anfang des Buffers. Mit einem Query lässt sich auch die Anzahl der in den Outputbuffer geschriebenen Partikel auslesen, beim nächsten Frame wissen wir also exakt wie viele Partikel wir rendern müssen.&lt;br /&gt;
&lt;br /&gt;
Bezüglich des verwendeten Zufallsgenerators in der Funktion {{INLINE_CODE|noiseField(float)}} sollte man bei Bedarf das [[shader_Zufallsgenerator|Zufallsgenerator]]-Beispiel aus der [[Shadersammlung]] konsultieren. Auch [[GLSL_noise]] könnte von Interesse sein. Der Rest des Update-Shaders sollte eigentlich klar sein.&lt;br /&gt;
&lt;br /&gt;
Via Transform-Feedback werden die Inhalte {{INLINE_CODE|gl_Position}} und den beiden varyings {{INLINE_CODE|velocity_out}} und {{INLINE_CODE|seed}} in ihre jeweiligen Outputbuffer geschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Emitter ===&lt;br /&gt;
Nachdem wir nun den Update-Schritt erledigt haben, stellt sich die Frage wie den nun eigentlich neue Partikel ins System kommen sollen. Dank Transform-Feedback geht dies überraschend einfach. Wir brauchen keine Fragmentierung oder ähnliches beachten, sondern einfach nur die Daten der neuen Partikel ans Ende der jeweiligen Buffer schreiben.&lt;br /&gt;
&lt;br /&gt;
Wir könnten natürlich [[glBufferSubData]] benutzen, aber da wir nicht genau wissen wie viele Partikel gerade aktiv sind, wissen wir nicht in welchen Bereich geschrieben werden muss. Natürlich könnte man jetzt einen Query benutzen um die Anzahl der via Transform-Feedback geschriebenen Partikel zu ermitteln, aber da wir sowieso schon alles eingerichtet haben können wir die neuen Partikel auch einfach rendern.&lt;br /&gt;
&lt;br /&gt;
Während Transform-Feedback aktiv ist, ist es nicht erlaubt den Shader zu wechseln. Aus diesem Grund verwenden wir einfach weiter unseren Update-Shader, wobei wir die Uniform {{INLINE_CODE|timeElapsed}} auf 0 setzen. So werden zwar einige unnötige Berechnungen durchgeführt, aber normalerweise emittiert man sowieso nur einige 100 Partikel pro Frame. Wie die Partikel dann letztlich genau gerendert werden ist daher nur von geringer Bedeutung. Ich verwende hier zunächst mehrere {{INLINE_CODE|std::vector}} um die nach und nach von der Physik und Spiellogik erzeugten Partikel zu sammeln. Einmal pro Frame werden diese dann in Buffer-Objekte geschrieben.&lt;br /&gt;
&lt;br /&gt;
Sollte die maximale Größe der Partikelbuffer überschritten werden, werden die folgenden Partikel von Transform-Feedback stillschweigend unterdrückt. Um im nächsten Frame zu wissen wie viele Partikel aktiv sind, verwenden wir einen Query. Hier nun der Code zum aktualisieren der alten und emittieren der neuen Partikel.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void CParticleSystem::update(double dTimeElapsed) {&lt;br /&gt;
    // flip buffers&lt;br /&gt;
    int input = m_flip;&lt;br /&gt;
    int output = m_flip = (1 - m_flip);&lt;br /&gt;
&lt;br /&gt;
    // setup shader&lt;br /&gt;
    glUseProgram(m_prgMove);&lt;br /&gt;
    glUniform1f(m_locMoveTimeElapsed, (float)dTimeElapsed);&lt;br /&gt;
&lt;br /&gt;
    // setup transform feedback&lt;br /&gt;
    glBindBufferBaseNV(GL_TRANSFORM_FEEDBACK_BUFFER_NV, 0, m_vboPosition[output]);&lt;br /&gt;
    glBindBufferBaseNV(GL_TRANSFORM_FEEDBACK_BUFFER_NV, 1, m_vboVelocity[output]);&lt;br /&gt;
    glBindBufferBaseNV(GL_TRANSFORM_FEEDBACK_BUFFER_NV, 2, m_vboRandom[output]);&lt;br /&gt;
    GLint locations[3] = { m_locMovePosition, m_locMoveVelocity, m_locMoveSeed };&lt;br /&gt;
    glTransformFeedbackVaryingsNV(m_prgMove, 3, locations, GL_SEPARATE_ATTRIBS_NV);&lt;br /&gt;
    glEnable(GL_RASTERIZER_DISCARD_NV);&lt;br /&gt;
    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV, m_qryWritten);&lt;br /&gt;
    glBeginTransformFeedbackNV(GL_POINTS);&lt;br /&gt;
&lt;br /&gt;
    // draw active particles&lt;br /&gt;
    glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
    glBindTexture(GL_TEXTURE_BUFFER_EXT, m_tboRandom[input]);&lt;br /&gt;
    glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
    glBindTexture(GL_TEXTURE_BUFFER_EXT, m_tboVelocity[input]);&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, m_vboPosition[input]);&lt;br /&gt;
    glVertexPointer(4, GL_FLOAT, 0, 0);&lt;br /&gt;
    glEnableClientState(GL_VERTEX_ARRAY);    &lt;br /&gt;
    glDrawArrays(GL_POINTS, 0, m_active);&lt;br /&gt;
    &lt;br /&gt;
    // draw newly emitted particles&lt;br /&gt;
    if (m_emitted &amp;gt; 0) {&lt;br /&gt;
        glUniform1f(m_locMoveTimeElapsed, 0.0f);&lt;br /&gt;
        glActiveTexture(GL_TEXTURE1);&lt;br /&gt;
        glBindTexture(GL_TEXTURE_BUFFER_EXT, m_tboRandomEmit);&lt;br /&gt;
        glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
        glBindTexture(GL_TEXTURE_BUFFER_EXT, m_tboVelocityEmit);&lt;br /&gt;
        glBindBuffer(GL_ARRAY_BUFFER, m_vboPositionEmit);&lt;br /&gt;
        glVertexPointer(4, GL_FLOAT, 0, 0);&lt;br /&gt;
        glDrawArrays(GL_POINTS, 0, m_emitted);&lt;br /&gt;
        m_emitted = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // clean up transform feedback, retrieve count of processed particles&lt;br /&gt;
    glEndTransformFeedbackNV();&lt;br /&gt;
    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV);&lt;br /&gt;
    glGetQueryObjectuiv(m_qryWritten, GL_QUERY_RESULT, &amp;amp;m_active);&lt;br /&gt;
&lt;br /&gt;
    // clean up&lt;br /&gt;
    glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
    glDisable(GL_RASTERIZER_DISCARD_NV);&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, 0);&lt;br /&gt;
    glUseProgram(0);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rendern ===&lt;br /&gt;
Ein Partikelsystem ist natürlich sinnfrei, wenn die Partikel nicht auch irgendwie dargestellt werden. Das ganze ist nicht weiter kompliziert. Wir benötigen weder die Velocity, die Lebenzeit noch den aktuellen Zufallsseed. Daher können wir einfach den Position-Buffer als Vertexbuffer rendern. Die Methode {{INLINE_CODE|render()}} und die verwendeten Shader sollten selbst erklärend sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void CParticleSystem::render(CVector3f vEye) {&lt;br /&gt;
    int input = m_flip;&lt;br /&gt;
&lt;br /&gt;
    // setup shader&lt;br /&gt;
    CVector2i viewport = CViewerWidget::instance()-&amp;gt;getViewport();&lt;br /&gt;
    glUseProgram(m_prgRender);&lt;br /&gt;
    glUniform3f(m_locRenderEye, vEye.x, vEye.y, vEye.z);&lt;br /&gt;
    glUniform1f(m_locRenderViewport, viewport.y);&lt;br /&gt;
&lt;br /&gt;
    // setup vbo, tbo's, etc.&lt;br /&gt;
    glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);&lt;br /&gt;
    glEnable(GL_POINT_SPRITE);&lt;br /&gt;
    glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE); // generate TexCoords automatically&lt;br /&gt;
    glDisable(GL_ALPHA_TEST);&lt;br /&gt;
    glEnable(GL_BLEND);&lt;br /&gt;
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);&lt;br /&gt;
    glDepthMask(GL_FALSE);&lt;br /&gt;
    glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
    glBindTexture(GL_TEXTURE_2D, m_texParticleAlpha);&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, m_vboPosition[input]);&lt;br /&gt;
    glVertexPointer(4, GL_FLOAT, 0, 0);&lt;br /&gt;
    glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
    &lt;br /&gt;
    // draw all active particles&lt;br /&gt;
    glDrawArrays(GL_POINTS, 0, m_active);&lt;br /&gt;
    &lt;br /&gt;
    // clean up    &lt;br /&gt;
    glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
    glDepthMask(GL_TRUE);&lt;br /&gt;
    glDisable(GL_BLEND);&lt;br /&gt;
    glDisable(GL_POINT_SPRITE);&lt;br /&gt;
    glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);&lt;br /&gt;
    glBindBuffer(GL_ARRAY_BUFFER, 0);&lt;br /&gt;
    glUseProgram(0);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vertexshader''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;uniform vec3 eye; // camera position&lt;br /&gt;
uniform float viewportHeight;&lt;br /&gt;
&lt;br /&gt;
varying float alphaScale;&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
    vec4 position = vec4(gl_Vertex.xyz, 1.0);&lt;br /&gt;
    float size = gl_Vertex.w;&lt;br /&gt;
&lt;br /&gt;
    // transform position&lt;br /&gt;
    gl_Position = gl_ModelViewProjectionMatrix * position;&lt;br /&gt;
&lt;br /&gt;
    // calculate pointsize&lt;br /&gt;
    gl_PointSize = (viewportHeight * size) / distance(position.xyz, eye);&lt;br /&gt;
&lt;br /&gt;
    // rendering particles with size 0.0 may result in undefined behaivor&lt;br /&gt;
    gl_PointSize = clamp(gl_PointSize, 0.01, 64.0); &lt;br /&gt;
&lt;br /&gt;
    // derive an alpha value from particle size&lt;br /&gt;
    alphaScale = clamp(0.05 / size, 0.001, 0.2);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Fragmentshader''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;uniform sampler2D texAlpha;&lt;br /&gt;
&lt;br /&gt;
varying float alphaScale;&lt;br /&gt;
&lt;br /&gt;
const vec3 color = vec3(0.384, 0.343, 0.286);&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{	&lt;br /&gt;
    float alpha = texture2D(texAlpha, gl_TexCoord[0].xy).a * alphaScale;&lt;br /&gt;
    if (alpha &amp;lt; 0.0039) { discard; } // discard fragment when alpha smaller than 1/255&lt;br /&gt;
    gl_FragColor = vec4(color, alpha);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Erweiterungen =&lt;br /&gt;
Nun wollen wir das bestehende Partikelsystem erweitern. Es sollte klar sein das die hier beschriebenen Dinge sehr viel Rechenleistung benötigen. Diese Aktionen müssen also möglicherweise über mehrere Frames verteilt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Partikel/Partikel-Interaktion ==&lt;br /&gt;
Es gibt diverse Effekte bei denen man eine direkte Interaktion der Partikel untereinander benötigt. Beispiele sind wirkende Gravitationskräfte zwischen den Partikeln, die Simulation von Luftdruck und ähnliches. &lt;br /&gt;
&lt;br /&gt;
Da wir unsere Partikeldaten in Texturen (bzw. TBOs) gespeichert haben, ist eine solche Interaktion theoretisch leicht zu realisieren. Wir bauen im Update-Shader einfach eine Schleife über sämtliche anderen Partikel ein. Die [http://de.wikipedia.org/wiki/Gravitation#Newtonsches_Gravitationsgesetz Graviationskraft] berechnet sich nach der folgenden Formel. &lt;br /&gt;
:[[Bild:Partikel-Formel-Gravitation.gif]]&lt;br /&gt;
Dabei ist ''G'' die Graviationskonstante, ''M&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' bzw. ''M&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;'' die Masse und ''r'' der Abstand der beiden Partikel. Der Vektor ''e&amp;lt;sub&amp;gt;r&amp;lt;/sub&amp;gt;'' ist die normalisierte Richtung. [http://de.wikipedia.org/wiki/Beschleunigung Beschleunigung] ist Kraft durch Masse, d.h. die Masse des betrachteten Partikels kürzt sich aus der Gleichung.&lt;br /&gt;
:[[Bild:Partikel-Formel-Bescheunigung.gif]]&lt;br /&gt;
Im Beispiel werden einfach die Beschleunigungen zwischen den Partikeln berechnet und aufsummiert. Natürlich ziehen wir so viele Berechnungen wie möglich aus der Schleife hinaus.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;// particle interaction, naive approach&lt;br /&gt;
const float GRAVITATION = 6.67428e-11; // gravitational constant&lt;br /&gt;
vec3 accum = vec3(0,0,0);&lt;br /&gt;
for (int i=0; i&amp;lt;particleCount; ++i) {&lt;br /&gt;
    vec4 other = texelFetchBuffer(tboPosition, i); // other.xyz=Position, other.w=Mass&lt;br /&gt;
    vec3 dir = other.xyz - position;&lt;br /&gt;
    float len = length(dir);&lt;br /&gt;
    if (len &amp;gt; 0.0001) {&lt;br /&gt;
        accum += (other.w / len) * dir;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
velocity += GRAVITATION * timeElapsed * accum;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der aufmerksame Leser wird nun hoffentlich verzweifelt den Kopf geschüttelt haben, den der Aufwand für diese Aktion ist natürlich quadratisch. Bei einem kleinen Partikelsystem mag dies machbar sein, aber bei einer Million Partikel würden wir insgesamt eine Billion Iterationen der inneren Schleife benötigen. Nun, Grafikkarten sind schnell, aber nicht schnell genug um dies in Echtzeit zu erledigen.&lt;br /&gt;
&lt;br /&gt;
Wir benötigten also eine andere Lösung. Es gibt prinzipiell drei verschiedene Ansätze, zumindest sind das die, die mir gerade einfallen.&lt;br /&gt;
# Verteilen der Operationen auf mehrere Frames. Dies macht nur bei mittelgroßen Partikelsystemen Sinn. Für ein doppelt so großes Partikelsystem muss man die Berechnung auf viermal so viele Frames verteilen um mit der gleichen Geschwindigkeit zu rendern. Das ist natürlich aussichtslos, da man immer noch quadratische Laufzeit hat.&lt;br /&gt;
# Verwendung einer Datenstruktur.  Üblicherweise nimmt der Einfluss der Partikel untereinander mit der Entfernung ab. Eigentlich muss man daher nur die Partikel in der näheren Umgebung berücksichtigen. Rekursive Datenstrukturen wie Bäume sind auf der Grafikkarte schwer zu realisieren. Aber man könnte die Eigenschaft ausnutzen das die Partikel sortiert sind. Logischerweise muss man dann die Partikel dann zuerst einmal sortieren, was natürlich ebenfalls sehr aufwendig ist. Aber falls man die Partikel aus einem anderen Grund zum Beispiel nach der Entfernung zur Kamera sortiert hat sollte man dies ausnutzen.&lt;br /&gt;
# Randomisierte Algorithmen zeichnen sich meist durch ihre Einfachheit und Effizienz aus. Einen solchen Ansatz wollen wir im folgenden näher betrachten. &lt;br /&gt;
&lt;br /&gt;
==== Randomisierung ====&lt;br /&gt;
[[Bild:Partikel-Gravitation.jpg|thumb|256px|Gravitationssimulation mit 262144 Partikeln und REP_COUNT=50 bei 39fps auf einer Nvidia GeForce 9800GT. Farben stehen für die Bewegungsrichtung.]]&lt;br /&gt;
Bei hundert tausenden Partikeln ist der Einfluss des einzelnen Partikels gering. Bei diesem Ansatz wählen wir jedes Frame eine neue zufällige Repräsentantenmenge von sagen wir 50 Partikeln. Das Ergebnis rechnen wir dann auf die gesamte Partikelwolke hoch. So erhalten wir eine Approximation der richtigen Lösung. Dies ist definitiv der schnellste Ansatz den die Laufzeit ist nur linear und die Qualität der Approximation lässt sich bequem über die Anzahl der Repräsentanten steuern.  &lt;br /&gt;
&lt;br /&gt;
Man kann die Repräsentantenmenge entweder für jeden Partikel einzeln im Shader generieren oder einmal für alle Partikel gleich als Uniform-Array (oder Textur) übergeben. Die zweite Variante hat den Vorteil, dass die Grafikkarte den Cache besser nutzen kann und man spart natürlich die Berechnung der Zufallszahlen im Shader. Dies sorgte in meinem Versuch für eine etwa 50% höhere Geschwindigkeit, wobei aber insgesamt weniger Partikel berücksichtigt werden und daher die Approximation auch etwas schlechter ist. Letztlich kommt es also ungefähr auf das gleiche hinaus.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel zeige ich hier einmal die erste Variante mit der auch der Screenshot rechts erzeugt wurde. Ich verwende hier wieder den Zufallsgenerator aus dem Artikel [[GLSL_noise|GLSL Noise]].&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;// particle interaction, randomization approach&lt;br /&gt;
const float GRAVITATION = 6.67428e-11; // gravitational constant&lt;br /&gt;
const int REP_COUNT = 50;              // number of representatives&lt;br /&gt;
vec3 accum = vec3(0,0,0);&lt;br /&gt;
for (int c=0; c&amp;lt;REP_COUNT; ++c) {&lt;br /&gt;
    seed = (seed * 1664525u + 1013904223u); &lt;br /&gt;
    int i = int(float(seed) / 4294967296.0 * particleCount);&lt;br /&gt;
    vec4 other = texelFetchBuffer(tboPosition, i);&lt;br /&gt;
    vec3 dir = other.xyz - position;&lt;br /&gt;
    float len = length(dir);&lt;br /&gt;
    if (len &amp;gt; 0.0001) {&lt;br /&gt;
        accum += (other.w / len) * dir;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
velocity += GRAVITATION * timeElapsed * (particleCount/float(REP_COUNT)) * accum;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Split und Merge ====&lt;br /&gt;
Da wir mit dem Geometryshader arbeiten, ist es problemlos möglich Split- oder Merge-Operationen auf die Partikel anzuwenden. Also beispielsweise könnten sich kollidierende Partikel vereinen. Ein Partikel bleibt dabei erhalten und vergrößert seine Masse auf die Summe beider Partikel. Die Bewegungsrichtung wird ebenfalls aus der Summe beider Partikel ermittelt. Der andere Partikel wird aus dem System entfernt, wie wir dies bereits vom Update-Shader im [[#Update|Grundlagen-Abschnitt]] kennen. Natürlich benötigt man irgendeine Konvention welcher der beiden Partikel erhalten bleibt und welcher entfernt wird, da man die Entscheidung natürlich für jeden der beiden Partikel einzeln treffen muss. Anbieten würde sich beispielsweise ein Vergleich der Position im Vertexbuffer ({{INLINE_CODE|gl_PrimitiveIDIn}}).&lt;br /&gt;
&lt;br /&gt;
Umgekehrt könnte ein Partikel in mehrere Teile zerfallen. Dies lässt sich leicht realisieren, der Geometryshader emittiert einfach entsprechend viele Partikel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Sortieren nach Z ==&lt;br /&gt;
Verwendet man zum Beispiel additives Alpha-Blending ist die Reihenfolge in der die Partikel gerendert werden nicht von belang. Arbeitet man dagegen mit einer nicht-assoziativen Blending-Operation, beispielsweise der folgenden, muss man die Partikel eigentlich nach der Entfernung zur Kamera sortieren um ein korrektes Ergebnis zu erzielen.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Insbesondere wenn alle Partikel die gleiche Farbe und einen sehr geringen Alpha-Wert haben ist der Effekt des einzelnen Partikels nur sehr gering. In so einem Fall ist das Ergebnis ohne Sortierung zwar eigentlich falsch, aber man wird kaum einen Fehler entdecken. Auch hier kann man also auf die aufwendige Sortierung verzichten. Natürlich gibt es aber auch Fälle in denen man auf korrektes Rendering angewiesen ist. Das kann der Fall sein wenn man beispielsweise Feuer und Rauch in einem einzigen Partikelsystem verwaltet. Die Farben der Partikel unterscheiden sich stark. Nur mit einer Sortierung der Partikel lässt sich das korrekte Ergebnis erzielen.&lt;br /&gt;
&lt;br /&gt;
Sofern das Partikelsystem auf der CPU läuft ist die Sortierung kaum ein Problem. Die Anzahl der Partikel ist gering, geeignete Algorithmen (z.B. Quick-Sort, Intro-Sort, ...) sind gut erforscht und in jeder guten Standardbibliothek implementiert. Bei einem GPU-Partikelsystem steht man dagegen vor einem Problem. Zum einen verwaltet man üblicherweise wesentlich mehr Partikel, zum anderen arbeitet die GPU parallel und es gibt keinen Random-Write-Access, d.h. die Standard-Algorithmen lassen sich nicht sinnvoll anwenden.&lt;br /&gt;
&lt;br /&gt;
Trotzdem gibt es Algorithmen die es ermöglichen halbwegs effizient auf der GPU zu sortieren.&lt;br /&gt;
* ''Odd-Even Transition Sort'', ein naiver, nicht praktikabler Ansatz, Laufzeit: O(N&amp;amp;sup2; / P)&lt;br /&gt;
* ''Odd-Even Merge Sort'', Laufzeit: O((N log&amp;amp;sup2;N) / P)&lt;br /&gt;
* ''Bitonic Merge Sort'', Laufzeit: O((N log&amp;amp;sup2;N) / P)&lt;br /&gt;
* ''Adaptive Bitonic Sort'', Laufzeit: O((N log N) / P)&lt;br /&gt;
Bei den Angaben zur Laufzeit bezieht sich N auf die Anzahl der Partikel und P auf die Anzahl der parallel arbeitenden Shader-Einheiten.&lt;br /&gt;
&lt;br /&gt;
===Referenzen===&lt;br /&gt;
* P. Kipfer und R. Westermann, [http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter46.html GPU Gems 2, Chapter 46. Improved GPU Sorting], Technische Universität München, 2004&lt;br /&gt;
: Die Algorithmen ''Odd-Even Transition Sort'', ''Odd-Even Merge Sort'' sowie ''Bitonic Merge Sort'' werden hier erklärt.&lt;br /&gt;
* A. Greß und G. Zachmann,  [http://zach.in.tu-clausthal.de/papers/gpu-abisort-ipdps-2006.html GPU-ABiSort: Optimal Parallel Sorting on Stream Architectures], TU Clausthal, 2006&lt;br /&gt;
: Der Algorithmus ''Adaptive Bitonic Sort'' wir hier beschrieben.&lt;br /&gt;
* Bilardi, G. und Nicolau, [http://dspace.library.cornell.edu:8080/bitstream/1813/6609/2/86-769.ps Adaptive Bitonic Sorting: an Optimal Parallel Algorithm for Shared Memory Machines], Cornell University, 1986&lt;br /&gt;
: Brauchbarer mathematischer Beweis für die Aussagen über Bitonic-Sequenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Transparente Schatten (mit Self-Shadows) ==&lt;br /&gt;
===Referenzen===&lt;br /&gt;
* T. Lokovic und E. Veach, [http://graphics.stanford.edu/papers/deepshadows/ Deep Shadow Maps], SIGGRAPH 2000 Proceedings, Addison-Wesley, August 2000&lt;br /&gt;
* C. Dachsbacher† und M. Stamminger, [http://www.vis.uni-stuttgart.de/~dachsbcn/download/tsm.pdf Translucent Shadow Maps], University of Erlangen-Nuremberg, 2003&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
* [[Shader]] : Shader Grundlagen&lt;br /&gt;
* [[Tutorial_glsl|Tutorial GLSL]] : Einführung in GLSL&lt;br /&gt;
* [[GLSL Partikel]] : GPU-Partikelsystem mit älterer Hardware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Technik_oder_Algorithmus]]&lt;br /&gt;
[[Kategorie:Anleitung]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26981</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26981"/>
				<updated>2018-07-30T21:01:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Instancing - Instancen nur in einer Array =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Vorher hatte es für jedes Instance-Attribut eine eigene Array gehabt.&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt sind alle Attribute in einer Array, dies macht den Code einiges übersichtlicher.&amp;lt;br&amp;gt;&lt;br /&gt;
Dafür ist die Übergabe mit '''glVertexAttribPointer(...''' ein wenig komplizierter.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe [[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Deklaration der Array. Es ist nur noch eine Array.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;type&lt;br /&gt;
  TData = record&lt;br /&gt;
    Scale: GLfloat;&lt;br /&gt;
    Matrix: TMatrix;&lt;br /&gt;
    Color: TVector3f;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  Data: array[0..InstanceCount - 1] of TData;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das es ein wenig einfacher wird, habe ich '''ofs''' verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  ofs, i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
  // --- Normale Vektordaten&lt;br /&gt;
  // Daten für Vektoren&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Vertex);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);&lt;br /&gt;
  glEnableVertexAttribArray(0);&lt;br /&gt;
  glVertexAttribPointer(0, 2, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
  // --- Instancen&lt;br /&gt;
  ofs := 0;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, SizeOf(Data), @Data, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // Instance Size&lt;br /&gt;
  glEnableVertexAttribArray(1);&lt;br /&gt;
  glVertexAttribPointer(1, 1, GL_FLOAT, False, SizeOf(TData), nil);&lt;br /&gt;
  glVertexAttribDivisor(1, 1);&lt;br /&gt;
  Inc(ofs, SizeOf(GLfloat));&lt;br /&gt;
&lt;br /&gt;
  // Instance Matrix&lt;br /&gt;
  for i := 0 to 3 do begin&lt;br /&gt;
    glEnableVertexAttribArray(i + 2);&lt;br /&gt;
    glVertexAttribPointer(i + 2, 4, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
    glVertexAttribDivisor(i + 2, 1);&lt;br /&gt;
    Inc(ofs, SizeOf(TVector4f));&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Instance Color&lt;br /&gt;
  glEnableVertexAttribArray(6);&lt;br /&gt;
  glVertexAttribPointer(6, 3, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
  glVertexAttribDivisor(6, 1);&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
An der Zeichenroutine ändert sich nichts.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferSubData(GL_ARRAY_BUFFER, 0, SizeOf(Data), @Data);&lt;br /&gt;
&lt;br /&gt;
  glDrawArraysInstanced(GL_TRIANGLES, 0, Length(Quad) * 3, InstanceCount);&lt;br /&gt;
&lt;br /&gt;
  ogc.SwapBuffers;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Matrizen neu berechnen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to Length(Data) - 1 do begin&lt;br /&gt;
    Data[i].Matrix.RotateC(0.02);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  ogcDrawScene(Sender);  // Neu zeichnen&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
Am Shader hat sich nichts geändert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
#define Instance_Count 200&lt;br /&gt;
&lt;br /&gt;
// Vektor-Daten&lt;br /&gt;
layout (location = 0) in vec2 inPos;&lt;br /&gt;
&lt;br /&gt;
// Instancen&lt;br /&gt;
layout (location = 1) in float Size;&lt;br /&gt;
layout (location = 2) in mat4 mat;&lt;br /&gt;
layout (location = 6) in vec3 Color;&lt;br /&gt;
&lt;br /&gt;
out vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4((inPos * Size), 0.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  col = Color;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
in vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26980</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26980"/>
				<updated>2018-07-30T21:00:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Instancing - Instancen nur in einer Array =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Vorher hatte es für jedes Instance-Attribut eine eigene Array gehabt.&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt sind alle Attribute in einer Array, dies macht den Code einiges übersichtlicher.&amp;lt;br&amp;gt;&lt;br /&gt;
Dafür ist die Übergabe mit '''glVertexAttribPointer(...''' ein wenig komplizierter.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe [[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Deklaration der Array. Es ist nur noch eine Array.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;type&lt;br /&gt;
  TData = record&lt;br /&gt;
    Scale: GLfloat;&lt;br /&gt;
    Matrix: TMatrix;&lt;br /&gt;
    Color: TVector3f;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  Data: array[0..InstanceCount - 1] of TData;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das es ein wenig einfacher wird, habe ich '''ofs''' verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  ofs, i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
  // --- Normale Vektordaten&lt;br /&gt;
  // Daten für Vektoren&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Vertex);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);&lt;br /&gt;
  glEnableVertexAttribArray(0);&lt;br /&gt;
  glVertexAttribPointer(0, 2, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
  // --- Instancen&lt;br /&gt;
  ofs := 0;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, SizeOf(Data), @Data, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // Instance Size&lt;br /&gt;
  glEnableVertexAttribArray(1);&lt;br /&gt;
  glVertexAttribPointer(1, 1, GL_FLOAT, False, SizeOf(TData), nil);&lt;br /&gt;
  glVertexAttribDivisor(1, 1);&lt;br /&gt;
  Inc(ofs, SizeOf(GLfloat));&lt;br /&gt;
&lt;br /&gt;
  // Instance Matrix&lt;br /&gt;
  for i := 0 to 3 do begin&lt;br /&gt;
    glEnableVertexAttribArray(i + 2);&lt;br /&gt;
    glVertexAttribPointer(i + 2, 4, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
    glVertexAttribDivisor(i + 2, 1);&lt;br /&gt;
    Inc(ofs, SizeOf(TVector4f));&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Instance Color&lt;br /&gt;
  glEnableVertexAttribArray(6);&lt;br /&gt;
  glVertexAttribPointer(6, 3, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
  glVertexAttribDivisor(6, 1);&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
An der Zeichenroutine ändert sich nichts.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferSubData(GL_ARRAY_BUFFER, 0, SizeOf(Data), @Data);&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  glDrawArraysInstanced(GL_TRIANGLES, 0, Length(Quad) * 3, InstanceCount);&lt;br /&gt;
&lt;br /&gt;
  ogc.SwapBuffers;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Matrizen neu berechnen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to Length(Data) - 1 do begin&lt;br /&gt;
    Data[i].Matrix.RotateC(0.02);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  ogcDrawScene(Sender);  // Neu zeichnen&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
Am Shader hat sich nichts geändert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
#define Instance_Count 200&lt;br /&gt;
&lt;br /&gt;
// Vektor-Daten&lt;br /&gt;
layout (location = 0) in vec2 inPos;&lt;br /&gt;
&lt;br /&gt;
// Instancen&lt;br /&gt;
layout (location = 1) in float Size;&lt;br /&gt;
layout (location = 2) in mat4 mat;&lt;br /&gt;
layout (location = 6) in vec3 Color;&lt;br /&gt;
&lt;br /&gt;
out vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4((inPos * Size), 0.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  col = Color;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
in vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26979</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26979"/>
				<updated>2018-07-30T20:33:36Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Instancing - Instancen nur in einer Array =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Vorher hatte es für jedes Instance-Attribut eine eigene Array gehabt.&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt sind alle Attribute in einer Array, dies macht den Code einiges übersichtlicher.&amp;lt;br&amp;gt;&lt;br /&gt;
Dafür ist die Übergabe mit '''glVertexAttribPointer(...''' ein wenig komplizierter.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe [[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Deklaration der Array. Es ist nur noch eine Array.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;type&lt;br /&gt;
  TData = record&lt;br /&gt;
    Scale: GLfloat;&lt;br /&gt;
    Matrix: TMatrix;&lt;br /&gt;
    Color: TVector3f;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  Data: array[0..InstanceCount - 1] of TData;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das es ein wenig einfacher wird, habe ich '''ofs''' verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  ofs, i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
  // --- Normale Vektordaten&lt;br /&gt;
  // Daten für Vektoren&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Vertex);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);&lt;br /&gt;
  glEnableVertexAttribArray(0);&lt;br /&gt;
  glVertexAttribPointer(0, 2, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
  // --- Instancen&lt;br /&gt;
  ofs := 0;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, SizeOf(Data), @Data, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // Instance Size&lt;br /&gt;
  glEnableVertexAttribArray(1);&lt;br /&gt;
  glVertexAttribPointer(1, 1, GL_FLOAT, False, SizeOf(TData), nil);&lt;br /&gt;
  glVertexAttribDivisor(1, 1);&lt;br /&gt;
  Inc(ofs, SizeOf(GLfloat));&lt;br /&gt;
&lt;br /&gt;
  // Instance Matrix&lt;br /&gt;
  for i := 0 to 3 do begin&lt;br /&gt;
    glEnableVertexAttribArray(i + 2);&lt;br /&gt;
    glVertexAttribPointer(i + 2, 4, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
    glVertexAttribDivisor(i + 2, 1);&lt;br /&gt;
    Inc(ofs, SizeOf(TVector4f));&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Instance Color&lt;br /&gt;
  glEnableVertexAttribArray(6);&lt;br /&gt;
  glVertexAttribPointer(6, 3, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
  glVertexAttribDivisor(6, 1);&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
An der Zeichenroutine ändert sich nichts.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferSubData(GL_ARRAY_BUFFER, 0, SizeOf(Data), @Data);&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  glDrawArraysInstanced(GL_TRIANGLES, 0, Length(Quad) * 3, InstanceCount);&lt;br /&gt;
&lt;br /&gt;
  ogc.SwapBuffers;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Matrizen neu berechnen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to Length(Data) - 1 do begin&lt;br /&gt;
    Data[i].Matrix.RotateC(0.02);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  ogcDrawScene(Sender);  // Neu zeichnen&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
Am Shader hat sich nichts geändert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
#define Instance_Count 200&lt;br /&gt;
&lt;br /&gt;
// Vektor-Daten&lt;br /&gt;
layout (location = 0) in vec2 inPos;&lt;br /&gt;
&lt;br /&gt;
// Instancen&lt;br /&gt;
layout (location = 1) in float Size;&lt;br /&gt;
layout (location = 2) in mat4 mat;&lt;br /&gt;
layout (location = 6) in vec3 Color;&lt;br /&gt;
&lt;br /&gt;
out vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4((inPos * Size), 0.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  col = Color;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
in vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26978</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Instancing_-_Instancen_nur_in_einer_Array&amp;diff=26978"/>
				<updated>2018-07-30T20:31:26Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Instancing - Instancen nur in einer Array =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Vorher hatte es für jedes Instance-Attribut eine eigene Array gehabt.&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt sind alle Attribute in einer Array, dies macht den Code einiges übersichtlicher.&amp;lt;br&amp;gt;&lt;br /&gt;
Dafür ist die Übergabe mit '''glVertexAttribPointer(...''' ein weniig komplizierter.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe [[Vertex-Puffer - Nur eine Array]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Deklaration der Array. Es ist nur noch eine Array.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;type&lt;br /&gt;
  TData = record&lt;br /&gt;
    Scale: GLfloat;&lt;br /&gt;
    Matrix: TMatrix;&lt;br /&gt;
    Color: TVector3f;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  Data: array[0..InstanceCount - 1] of TData;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das es ein wenig einfacher wird, habe ich '''ofs''' verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
var&lt;br /&gt;
  ofs, i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
&lt;br /&gt;
  // --- Normale Vektordaten&lt;br /&gt;
  // Daten für Vektoren&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Vertex);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);&lt;br /&gt;
  glEnableVertexAttribArray(0);&lt;br /&gt;
  glVertexAttribPointer(0, 2, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
  // --- Instancen&lt;br /&gt;
  ofs := 0;&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, SizeOf(Data), @Data, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // Instance Size&lt;br /&gt;
  glEnableVertexAttribArray(1);&lt;br /&gt;
  glVertexAttribPointer(1, 1, GL_FLOAT, False, SizeOf(TData), nil);&lt;br /&gt;
  glVertexAttribDivisor(1, 1);&lt;br /&gt;
  Inc(ofs, SizeOf(GLfloat));&lt;br /&gt;
&lt;br /&gt;
  // Instance Matrix&lt;br /&gt;
  for i := 0 to 3 do begin&lt;br /&gt;
    glEnableVertexAttribArray(i + 2);&lt;br /&gt;
    glVertexAttribPointer(i + 2, 4, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
    glVertexAttribDivisor(i + 2, 1);&lt;br /&gt;
    Inc(ofs, SizeOf(TVector4f));&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Instance Color&lt;br /&gt;
  glEnableVertexAttribArray(6);&lt;br /&gt;
  glVertexAttribPointer(6, 3, GL_FLOAT, False, SizeOf(TData), Pointer(ofs));&lt;br /&gt;
  glVertexAttribDivisor(6, 1);&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
An der Zeichenroutine ändert sich nichts.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.ogcDrawScene(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
  Shader.UseProgram;&lt;br /&gt;
&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO.Instance);&lt;br /&gt;
  glBufferSubData(GL_ARRAY_BUFFER, 0, SizeOf(Data), @Data);&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  glDrawArraysInstanced(GL_TRIANGLES, 0, Length(Quad) * 3, InstanceCount);&lt;br /&gt;
&lt;br /&gt;
  ogc.SwapBuffers;&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Matrizen neu berechnen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
  i: integer;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 0 to Length(Data) - 1 do begin&lt;br /&gt;
    Data[i].Matrix.RotateC(0.02);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  glBindVertexArray(VBQuad.VAO);&lt;br /&gt;
  ogcDrawScene(Sender);  // Neu zeichnen&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
Am Shader hat sich nichts geändert.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
#define Instance_Count 200&lt;br /&gt;
&lt;br /&gt;
// Vektor-Daten&lt;br /&gt;
layout (location = 0) in vec2 inPos;&lt;br /&gt;
&lt;br /&gt;
// Instancen&lt;br /&gt;
layout (location = 1) in float Size;&lt;br /&gt;
layout (location = 2) in mat4 mat;&lt;br /&gt;
layout (location = 6) in vec3 Color;&lt;br /&gt;
&lt;br /&gt;
out vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = mat * vec4((inPos * Size), 0.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  col = Color;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader:==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
out vec4 outColor;   // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
in vec3 col;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  outColor = vec4(col, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Nur_eine_Array&amp;diff=26977</id>
		<title>Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Nur_eine_Array&amp;diff=26977"/>
				<updated>2018-07-30T20:30:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|200px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=Vertex-Puffer - Nur eine Array =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Man kann die Vertex-Daten, auch alles in einen Daten-Block schreiben. Hier werden die Vector- und Color - Daten alle in einen Block geschrieben.&amp;lt;br&amp;gt;&lt;br /&gt;
In den vorherigen Beispielen hat es für die Vector- und  Color - Daten eine separate TFace-Array gehabt.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier werden zwei Möglichkeiten vorgestellt, wie die Daten in der Array sind.&amp;lt;br&amp;gt;&lt;br /&gt;
Variante1: '''Vec0, Col0, ..., Vecn, Coln'''&amp;lt;br&amp;gt;&lt;br /&gt;
Variante2: '''Vec0, ..., Vecn, Col0, ..., Coln'''&amp;lt;br&amp;gt;&lt;br /&gt;
Die hat noch den Vorteil, das nur ein '''VBO''' angelegt werden muss, obwohl mehrere Attribute in der Array sind.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die zwei Daten-Varianten:&amp;lt;br&amp;gt;&lt;br /&gt;
Variante 0: '''XYZ RGB XYZ RGB XYZ RGB XYZ RGB XYZ RGB XYZ RGB'''&amp;lt;br&amp;gt;&lt;br /&gt;
Variante 1: '''XYZ XYZ XYZ XYZ XYZ XYZ RGB RGB RGB RGB RGB RGB'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bei dem zweiten Quadrat, sind die Y-Werte gespiegelt, es sollten zwei Quadrate sichtbar sein.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;const&lt;br /&gt;
  QuadVektor0: array[0..1] of TFace2 =&lt;br /&gt;
    // Vec, Col, Vec, Col, ....&lt;br /&gt;
    (((-0.2, 0.6, 0.0, 1.0, 0.0, 0.0), (-0.2, 0.1, 0.0, 0.0, 1.0, 0.0), (0.2, 0.1, 0.0, 1.0, 1.0, 0.0)),&lt;br /&gt;
    ((-0.2, 0.6, 0.0, 1.0, 0.0, 0.0), (0.2, 0.1, 0.0, 1.0, 1.0, 0.0), (0.2, 0.6, 0.0, 0.0, 1.0, 1.0)));&lt;br /&gt;
  QuadVektor1: array[0..3] of TFace =&lt;br /&gt;
    // Vec&lt;br /&gt;
    (((-0.2, -0.6, 0.0), (-0.2, -0.1, 0.0), (0.2, -0.1, 0.0)),&lt;br /&gt;
    ((-0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (0.2, -0.6, 0.0)),&lt;br /&gt;
    // Col&lt;br /&gt;
    ((1.0, 0.0, 1.0), (1.0, 1.0, 0.0), (1.0, 1.0, 1.0)),&lt;br /&gt;
    ((1.0, 0.0, 1.0), (1.0, 1.0, 1.0), (0.0, 1.0, 1.0)));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier die wichtigste Änderung:&amp;lt;br&amp;gt;&lt;br /&gt;
Relevant sind die zwei letzten Parameter von '''glVertexAttribPointer(...'''&amp;lt;br&amp;gt;&lt;br /&gt;
Was irritiert der einte Parameter ist direkt ein Integer, der andere braucht eine Typenumwandlung auf einen Pointer.&amp;lt;br&amp;gt;&lt;br /&gt;
Der zweitletzte Parameter (stride), gibt das '''Byte''' Offset, zum nächsten Attribut-Wert an, repektive die Schritt/Block-grösse.&amp;lt;br&amp;gt;&lt;br /&gt;
Der letzte Parameter (pointer), gibt die Position zum ersten Attribut-Wert an.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Werte sind immer als '''Byte''', somit muss man bei einem '''glFloat''' immer '''4x''' rechnen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Varinate 0:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Vektoren beginnen bei 0, Die Grösse ist 24Byte = 6 glFloat x 4 entspricht '''XYZRGB'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Farben beginnen beim 12Byte. Die Grösse ist mit 24Byte gleich wie bei den Vektoren.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Varinate 1:&amp;lt;br&amp;gt;&lt;br /&gt;
Da die Vektoren hintereinander stehen, darf dieser Default (0) sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Farben beginnen beim 72Byte.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure TForm1.InitScene;&lt;br /&gt;
begin&lt;br /&gt;
  glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe&lt;br /&gt;
&lt;br /&gt;
  // --- Daten für Quadrat 0&lt;br /&gt;
  glBindVertexArray(VBQuad0.VAO);&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad0.VBO); // Nur ein VBO erforderlich&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVektor0), @QuadVektor0, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // Vektor&lt;br /&gt;
  glEnableVertexAttribArray(10);&lt;br /&gt;
  glVertexAttribPointer(10, 3, GL_FLOAT, False, 24, nil);  // nil = Pointer(0)&lt;br /&gt;
&lt;br /&gt;
  // Farbe&lt;br /&gt;
  glEnableVertexAttribArray(11);&lt;br /&gt;
  glVertexAttribPointer(11, 3, GL_FLOAT, False, 24, Pointer(12));&lt;br /&gt;
&lt;br /&gt;
  // --- Daten für Quadrat 1&lt;br /&gt;
  glBindVertexArray(VBQuad1.VAO);&lt;br /&gt;
  glBindBuffer(GL_ARRAY_BUFFER, VBQuad1.VBO); // Nur ein VBO erforderlich&lt;br /&gt;
  glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVektor1), @QuadVektor1, GL_STATIC_DRAW);&lt;br /&gt;
&lt;br /&gt;
  // Vektor&lt;br /&gt;
  glEnableVertexAttribArray(10);&lt;br /&gt;
  glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);&lt;br /&gt;
&lt;br /&gt;
  // Farbe&lt;br /&gt;
  glEnableVertexAttribArray(11);&lt;br /&gt;
  glVertexAttribPointer(11, 3, GL_FLOAT, False, 0, Pointer(72));&lt;br /&gt;
end;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Zeichnen ist gleich, wie wen man separate Datenblöcke hätte. &amp;lt;br&amp;gt;&lt;br /&gt;
Es wurde das '''Length(...''' entfernt, da die einte Array zwei und die andere vier Elemente hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Was aber sicher ist, das beide Quadrate aus sechs Vektoren bestehen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;  // Zeichne Quadrat 0&lt;br /&gt;
  glBindVertexArray(VBQuad0.VAO);&lt;br /&gt;
  glDrawArrays(GL_TRIANGLES, 0, 6);  // 6 Vertex pro Quadrat&lt;br /&gt;
&lt;br /&gt;
  // Zeichne Quadrat 1&lt;br /&gt;
  glBindVertexArray(VBQuad1.VAO);&lt;br /&gt;
  glDrawArrays(GL_TRIANGLES, 0, 6);  // 6 Vertex pro Quadrat&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Vertex-Shader:==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Im Shader gibt es keine Änderung, da es diesem egal ist, wie '''glVertexAttribPointer(...''' die Daten übergibt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten&lt;br /&gt;
layout (location = 11) in vec3 inCol; // Farbe&lt;br /&gt;
&lt;br /&gt;
out vec4 Color;                       // Farbe, an Fragment-Shader übergeben&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position = vec4(inPos, 1.0);&lt;br /&gt;
  Color = vec4(inCol, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Fragment-Shader==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;glsl&amp;quot;&amp;gt;#version 330&lt;br /&gt;
&lt;br /&gt;
in vec4 Color;      // interpolierte Farbe vom Vertexshader&lt;br /&gt;
out vec4 outColor;  // ausgegebene Farbe&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  outColor = Color; // Die Ausgabe der Farbe&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Autor: [[Mathias]]&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Nur_eine_Array.png&amp;diff=26976</id>
		<title>Datei:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Nur_eine_Array.png&amp;diff=26976"/>
				<updated>2018-07-29T21:05:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: Mathias lud eine neue Version von Datei:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26975</id>
		<title>Lazarus - OpenGL 3.3 Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26975"/>
				<updated>2018-07-29T20:47:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lazarus - OpenGL 3.3 Tutorial=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.&amp;lt;br&amp;gt;&lt;br /&gt;
==Download==&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]&amp;lt;br&amp;gt;&lt;br /&gt;
==Tutorial==&lt;br /&gt;
=== Einrichten und Einstieg ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] &lt;br /&gt;
&amp;quot;Lazarus mit '''OpenGL 3.3'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was sind die Voraussetzungen.&lt;br /&gt;
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Arbeitsfläche erzeugen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Erste Vectoren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zeichen Routine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.&lt;br /&gt;
Somit stehen einem fast unendliche Effekte zu Verfügung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] &lt;br /&gt;
&amp;quot;Wie sollen die Polygone verarbeitet werden ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Das Herz von OpenGL 3.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sämtliche Effekt werden hier verarbeitet.&lt;br /&gt;
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] &lt;br /&gt;
&amp;quot;Äusere Beinflussung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Mesh sollte nicht statisch sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie bewege ich eine Mesh im Shader.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einer ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer gleich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zusätliche geometrische Berechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Ein Pixel ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Wichtige Funktionen|Wichtige Funktionen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Wichtige Funktionen.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/45_-_Wichtige_Funktionen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Variable auslesen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/50_-_Variablen_Namen_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vertex-Puffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Mesh Daten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie gelangen die Daten der Mesh in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht immer 3D sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Vertex-Daten anstelle von 3D.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles zusammen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur einzeln Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.&lt;br /&gt;
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer am Stück&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch nur einen Teil einer Vertex-Array zeichnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] &lt;br /&gt;
&amp;quot;Eigene Reihenfolge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien im Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Index-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer_dynamisch source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur schreiben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_Vertex-Puffer_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Matrix ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegung im Raum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Matrizen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] &lt;br /&gt;
&amp;quot;Planetarium&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== 3D ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde 3D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] &lt;br /&gt;
&amp;quot;Alles ist zu viel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur Vorn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] &lt;br /&gt;
&amp;quot;Ortografisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird meistens in einem CAD gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht mehr verzerrt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.&lt;br /&gt;
Dies passt man in der Perspektive an.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Alpha Blending ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Reihenfolge ist wichtig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] &lt;br /&gt;
&amp;quot;Es wird Erkennbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Einfachste Variante einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Hintergrund-Beleuchtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Restlicht ist (fast) immer vorhanden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Lichtquellen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Glühbirne&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Schnelle Lichtberechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Detailgetreues Licht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot; (ohne OpenGL)&lt;br /&gt;
&lt;br /&gt;
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe realistisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe wird schwach&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je weiter das Licht weg, je dünkler die Mesh.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Material Eigenschaften ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Materialien sind unterschiedlich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine komplexe Taschenlampe mit Abschwächung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Bump Mapping ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Uniform Buffer Object (UBO) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Uniform als Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Shader-Parameter in einem Puffer zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Shader-Daten aktualisieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.&lt;br /&gt;
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Schneller Wechsel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Verbindungen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Verbindungen mit einem UBO sind möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;UBOs richtig nutzen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gebe Bilder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Polygone können mit Bilder ( Texturen ) überzogen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrer Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturen_von_BMP source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gibt viele Formate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.&lt;br /&gt;
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_mit_oglTextur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] &lt;br /&gt;
&amp;quot;Texturen als Text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_von_XPM source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegte Textur&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_und_Matrixen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] &lt;br /&gt;
&amp;quot;Huckepack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Multitexturing source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] &lt;br /&gt;
&amp;quot;Filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Texturen auf verschiedene Art darstellen und filtern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Filter source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Alpha-Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] &lt;br /&gt;
&amp;quot;Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Auswirkung unterschiedlicher Textur-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Textur-Koordinaten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] &lt;br /&gt;
&amp;quot;Verzerrte Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies kann man aber zum Glück korrigieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Texturen_Perspektiven-Korrektur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur mehrmals zeichnen|Textur mehrmals zeichnen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur mehrmals zeichnen.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/55_-_Textur_mehrmals_zeichnen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es geht auch 1D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_1D_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles auf einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/70_-_Textur_Array_einzel_Bitmap source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Cubemap Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Framepuffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht der Bildschirm sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Texturen rendern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] &lt;br /&gt;
&amp;quot;Verewigen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die gerenderte Scene auch in ein Bitmap speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader Effekte ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Blur|Blur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Blur.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/00_-_Blur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Sobel|Sobel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Sobel.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/05_-_Sobel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kacheln|Kacheln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kacheln.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/10_-_Kacheln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kreis|Kreis]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kreis.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/15_-_Kreis source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Hello World|Hello World]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Hello World.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/20_-_Hello_World source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Geometrie-Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Schatten ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Instancing ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] &lt;br /&gt;
&amp;quot;Chaotisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.&lt;br /&gt;
Die Anzahl der Instancen ist sehr begrenzt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] &lt;br /&gt;
&amp;quot;Flexibel sollte es sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.&lt;br /&gt;
Die Anzahl der Instancen ist fast unbegrenzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles in einem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann alle Parameter in ein Record packen.&lt;br /&gt;
Die ist mit Uniform nicht möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vektoren und Matrizen ( no OpenGL ) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Matrix_2D_Demo source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Vektoren_Cube source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Gradient_Triangle source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Vektoren_Cube_Z-Buffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer SSE|Vektoren Cube Z-Buffer SSE]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer SSE.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/20_-_Vektoren_Cube_Z-Buffer_SSE source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26974</id>
		<title>Lazarus - OpenGL 3.3 Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&amp;diff=26974"/>
				<updated>2018-07-28T16:12:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mathias: /* Instancing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lazarus - OpenGL 3.3 Tutorial=&lt;br /&gt;
==Einleitung==&lt;br /&gt;
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.&amp;lt;br&amp;gt;&lt;br /&gt;
==Download==&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]&amp;lt;br&amp;gt;&lt;br /&gt;
==Tutorial==&lt;br /&gt;
=== Einrichten und Einstieg ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] &lt;br /&gt;
&amp;quot;Lazarus mit '''OpenGL 3.3'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was sind die Voraussetzungen.&lt;br /&gt;
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Arbeitsfläche erzeugen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] &lt;br /&gt;
&amp;quot;Erste Vectoren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zeichen Routine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.&lt;br /&gt;
Somit stehen einem fast unendliche Effekte zu Verfügung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] &lt;br /&gt;
&amp;quot;Wie sollen die Polygone verarbeitet werden ?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Das Herz von OpenGL 3.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sämtliche Effekt werden hier verarbeitet.&lt;br /&gt;
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einfachste Abbarbeitung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die minimalste Version eines Shaders.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] &lt;br /&gt;
&amp;quot;Äusere Beinflussung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Mesh sollte nicht statisch sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie bewege ich eine Mesh im Shader.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Einer ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer gleich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Zusätliche geometrische Berechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Ein Pixel ist langweilig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Wichtige Funktionen|Wichtige Funktionen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Wichtige Funktionen.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/45_-_Wichtige_Funktionen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Variable auslesen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/50_-_Variablen_Namen_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Vertex-Puffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Mesh Daten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie gelangen die Daten der Mesh in die Grafikkarte.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht immer 3D sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Vertex-Daten anstelle von 3D.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles zusammen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur einzeln Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur Dreiecke&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.&lt;br /&gt;
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer am Stück&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch nur einen Teil einer Vertex-Array zeichnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] &lt;br /&gt;
&amp;quot;Eigene Reihenfolge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien im Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Index-Puffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] &lt;br /&gt;
&amp;quot;Indizien dynamisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer_dynamisch source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht nur schreiben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_Vertex-Puffer_auslesen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Matrix ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegung im Raum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Matrizen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] &lt;br /&gt;
&amp;quot;Planetarium&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== 3D ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde 3D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] &lt;br /&gt;
&amp;quot;Alles ist zu viel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur Vorn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] &lt;br /&gt;
&amp;quot;Ortografisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird meistens in einem CAD gebraucht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht mehr verzerrt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.&lt;br /&gt;
Dies passt man in der Perspektive an.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Alpha Blending ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] &lt;br /&gt;
&amp;quot;Die Reihenfolge ist wichtig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Beleuchtung ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] &lt;br /&gt;
&amp;quot;Es wird Erkennbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Einfachste Variante einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Hintergrund-Beleuchtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein Restlicht ist (fast) immer vorhanden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Lichtquellen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Glühbirne&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Schnelle Lichtberechnung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;Detailgetreues Licht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot; (ohne OpenGL)&lt;br /&gt;
&lt;br /&gt;
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe realistisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] &lt;br /&gt;
&amp;quot;Taschenlampe wird schwach&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je weiter das Licht weg, je dünkler die Mesh.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Material Eigenschaften ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Materialien sind unterschiedlich&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] &lt;br /&gt;
&amp;quot;Eine Taschenlampe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Eine komplexe Taschenlampe mit Abschwächung.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Bump Mapping ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] &lt;br /&gt;
&amp;quot;Sonnenlicht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Uniform Buffer Object (UBO) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Uniform als Buffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Shader-Parameter in einem Puffer zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] &lt;br /&gt;
&amp;quot;Shader-Daten aktualisieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.&lt;br /&gt;
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] &lt;br /&gt;
&amp;quot;Schneller Wechsel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrere Verbindungen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Verbindungen mit einem UBO sind möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] &lt;br /&gt;
&amp;quot;UBOs richtig nutzen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gebe Bilder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Polygone können mit Bilder ( Texturen ) überzogen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] &lt;br /&gt;
&amp;quot;Mehrer Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturen_von_BMP source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es gibt viele Formate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.&lt;br /&gt;
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_mit_oglTextur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] &lt;br /&gt;
&amp;quot;Texturen als Text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_von_XPM source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] &lt;br /&gt;
&amp;quot;Bewegte Textur&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_und_Matrixen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] &lt;br /&gt;
&amp;quot;Huckepack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Multitexturing source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] &lt;br /&gt;
&amp;quot;Filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann Texturen auf verschiedene Art darstellen und filtern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Filter source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Alpha-Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] &lt;br /&gt;
&amp;quot;Koordinaten&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Auswirkung unterschiedlicher Textur-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Textur-Koordinaten source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] &lt;br /&gt;
&amp;quot;Verzerrte Texturen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies kann man aber zum Glück korrigieren.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Texturen_Perspektiven-Korrektur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur mehrmals zeichnen|Textur mehrmals zeichnen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur mehrmals zeichnen.png|128px|right]] &lt;br /&gt;
&amp;quot;Es werde Transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Texturen transparent darzustellen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/55_-_Textur_mehrmals_zeichnen source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] &lt;br /&gt;
&amp;quot;Es geht auch 1D&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_1D_Textur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles auf einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/70_-_Textur_Array_einzel_Bitmap source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Cubemap Texturen ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder einzeln, aber nur ein Puffer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bitmaps einzeln in einen Textur-Puffer laden.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Framepuffer ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] &lt;br /&gt;
&amp;quot;Es muss nicht der Bildschirm sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Texturen rendern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] &lt;br /&gt;
&amp;quot;Verewigen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann die gerenderte Scene auch in ein Bitmap speichern.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Shader Effekte ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Blur|Blur]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Blur.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/00_-_Blur source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Sobel|Sobel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Sobel.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/05_-_Sobel source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kacheln|Kacheln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kacheln.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/10_-_Kacheln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kreis|Kreis]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Kreis.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/15_-_Kreis source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Hello World|Hello World]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader Effekte - Hello World.png|128px|right]] &lt;br /&gt;
&amp;quot;Drehung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wie drehe ich eine Mesh mit Hilfe einer Matrix.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/30_-_Shader_Effekte/20_-_Hello_World source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Geometrie-Shader ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] &lt;br /&gt;
&amp;quot;Bilder direkt aus Bitmap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Schatten ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Instancing ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] &lt;br /&gt;
&amp;quot;Nur einmal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] &lt;br /&gt;
&amp;quot;Chaotisch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.&lt;br /&gt;
Die Anzahl der Instancen ist sehr begrenzt.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] &lt;br /&gt;
&amp;quot;Flexibel sollte es sein&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.&lt;br /&gt;
Die Anzahl der Instancen ist fast unbegrenzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] &lt;br /&gt;
&amp;quot;Alles in einem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann alle Parameter in ein Record packen.&lt;br /&gt;
Die ist mit Uniform nicht möglich.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] &lt;br /&gt;
&amp;quot;Nicht immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
&lt;br /&gt;
=== Vektoren und Matrizen ( no OpenGL ) ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Matrix_2D_Demo source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Vektoren_Cube source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Gradient_Triangle source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Vektoren_Cube_Z-Buffer source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer SSE|Vektoren Cube Z-Buffer SSE]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer SSE.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/20_-_Vektoren_Cube_Z-Buffer_SSE source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/60_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;br /&gt;
=== Versuche ===&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - Erste Textur SubImage|Erste Textur SubImage]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - Erste Textur SubImage.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/00_-_Erste_Textur_SubImage source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap|MipMap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/05_-_MipMap source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap Kacheln|MipMap Kacheln]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap Kacheln.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/10_-_MipMap_Kacheln source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap|MipMap]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/15_-_MipMap source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap diskret|MipMap diskret]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap diskret.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/20_-_MipMap_diskret source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap diskret-2|MipMap diskret-2]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - MipMap diskret-2.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/25_-_MipMap_diskret-2 source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - UBO Array Versuche|UBO Array Versuche]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - UBO Array Versuche.png|128px|right]] &lt;br /&gt;
&amp;quot;Auch eine Glühbirne reflektiert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Material mit Punkt-Licht.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/30_-_UBO_Array_Versuche source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - Laser|Laser]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - Laser.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/35_-_Laser source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - Laser LichtShow|Laser LichtShow]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - Laser LichtShow.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/40_-_Laser_LichtShow source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - Shader Demos|Shader Demos]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - Shader Demos.png|128px|right]] &lt;br /&gt;
&amp;quot;Jetzt wird es komplex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dem Shader kann man auch ganze Fraktale berechnen.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/45_-_Shader_Demos source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - SSE Speedtest|SSE Speedtest]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - SSE Speedtest.png|128px|right]] &lt;br /&gt;
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar &lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/50_-_SSE_Speedtest source]&lt;br /&gt;
|-&lt;br /&gt;
![[Lazarus - OpenGL 3.3 Tutorial - Versuche - SEE|SEE]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Versuche - SEE.png|128px|right]] &lt;br /&gt;
&amp;quot;Vorn ist grösser&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Versuche/55_-_SEE source]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]&lt;/div&gt;</summary>
		<author><name>Mathias</name></author>	</entry>

	</feed>