https://wiki.delphigl.com/api.php?action=feedcontributions&user=I0n0s&feedformat=atomDGL Wiki - Benutzerbeiträge [de]2024-03-28T14:05:20ZBenutzerbeiträgeMediaWiki 1.27.4https://wiki.delphigl.com/index.php?title=DGL_Treffen/2020/Organisation&diff=27055DGL Treffen/2020/Organisation2020-09-02T20:15:36Z<p>I0n0s: /* Was kostet das? */</p>
<hr />
<div>Coronale Grüße!<br />
<br />
==Wo?==<br />
<br />
Ferienhaus<br />
Dorum-Neufeld<br />
<br />
Fischersiedlung 6<br />
Ortsteil Dorum-Neufeld<br />
27639 Wurster Nordseeküste<br />
<br />
<br />
==Wann?==<br />
*Anreise: Sa. 5.09.2020 15 Uhr<br />
*Abreise: Sa. 19.09.2020 10 Uhr<br />
<br />
==Was kostet das?==<br />
Ferienwohnung: 1475.00€<br />
Kurtaxe: 210€<br />
<br />
==Wer kommt mit?==<br />
Bis zu 7 Pers. Aktuell 5.<br />
<br />
<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|<br />
|<br />
|-<br />
|i0n0s<br />
|14<br />
|<br />
|<br />
|-<br />
|Flash<br />
|14<br />
|Bahn<br />
| ARG Ost: mit der Bahn ab Chemnitz<br />
|-<br />
|Tania<br />
|14<br />
| -<br />
| Mit Kevin/der Bahn<br />
|-<br />
|Frase<br />
|14<br />
| -<br />
| Mit Kevin/der Bahn<br />
|-<br />
|}</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2020/Organisation&diff=27053DGL Treffen/2020/Organisation2020-08-13T15:50:40Z<p>I0n0s: /* Was kostet das? */</p>
<hr />
<div>Coronale Grüße!<br />
<br />
==Wo?==<br />
<br />
Ferienhaus<br />
Dorum-Neufeld<br />
<br />
Fischersiedlung 6<br />
Ortsteil Dorum-Neufeld<br />
27639 Wurster Nordseeküste<br />
<br />
<br />
==Wann?==<br />
*Anreise: Sa. 5.09.2020 15 Uhr<br />
*Abreise: Sa. 19.09.2020 10 Uhr<br />
<br />
==Was kostet das?==<br />
Ferienwohnung: 1335.00€<br />
<br />
==Wer kommt mit?==<br />
Bis zu 7 Pers. Aktuell 5.<br />
<br />
<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|<br />
|<br />
|-<br />
|i0n0s<br />
|14<br />
|<br />
|<br />
|-<br />
|Flash<br />
|14<br />
|PKW<br />
| ARG Ost: 2-3 Plätze im Wagen (?) frei ab Chemnitz<br />
|-<br />
|Tania<br />
|14<br />
| -<br />
| Mit Kevin<br />
|-<br />
|Frase<br />
|14<br />
| -<br />
| <br />
|-<br />
|}</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2020/Organisation&diff=27052DGL Treffen/2020/Organisation2020-08-13T15:42:39Z<p>I0n0s: /* Wann? */</p>
<hr />
<div>Coronale Grüße!<br />
<br />
==Wo?==<br />
<br />
Ferienhaus<br />
Dorum-Neufeld<br />
<br />
Fischersiedlung 6<br />
Ortsteil Dorum-Neufeld<br />
27639 Wurster Nordseeküste<br />
<br />
<br />
==Wann?==<br />
*Anreise: Sa. 5.09.2020 15 Uhr<br />
*Abreise: Sa. 19.09.2020 10 Uhr<br />
<br />
==Was kostet das?==<br />
<br />
<br />
==Wer kommt mit?==<br />
Bis zu 7 Pers. Aktuell 5.<br />
<br />
<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|<br />
|<br />
|-<br />
|i0n0s<br />
|14<br />
|<br />
|<br />
|-<br />
|Flash<br />
|14<br />
|PKW<br />
| ARG Ost: 2-3 Plätze im Wagen (?) frei ab Chemnitz<br />
|-<br />
|Tania<br />
|14<br />
| -<br />
| Mit Kevin<br />
|-<br />
|Frase<br />
|14<br />
| -<br />
| <br />
|-<br />
|}</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2020/Organisation&diff=27051DGL Treffen/2020/Organisation2020-08-13T15:42:29Z<p>I0n0s: /* Wann? */</p>
<hr />
<div>Coronale Grüße!<br />
<br />
==Wo?==<br />
<br />
Ferienhaus<br />
Dorum-Neufeld<br />
<br />
Fischersiedlung 6<br />
Ortsteil Dorum-Neufeld<br />
27639 Wurster Nordseeküste<br />
<br />
<br />
==Wann?==<br />
*Anreise: Sa. 5.09.2020<br />
*Abreise: Sa. 19.09.2020<br />
<br />
==Was kostet das?==<br />
<br />
<br />
==Wer kommt mit?==<br />
Bis zu 7 Pers. Aktuell 5.<br />
<br />
<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|<br />
|<br />
|-<br />
|i0n0s<br />
|14<br />
|<br />
|<br />
|-<br />
|Flash<br />
|14<br />
|PKW<br />
| ARG Ost: 2-3 Plätze im Wagen (?) frei ab Chemnitz<br />
|-<br />
|Tania<br />
|14<br />
| -<br />
| Mit Kevin<br />
|-<br />
|Frase<br />
|14<br />
| -<br />
| <br />
|-<br />
|}</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial&diff=27047Lazarus - OpenGL 3.3 Tutorial2019-12-02T10:16:27Z<p>I0n0s: /* 3D */</p>
<hr />
<div>=Lazarus - OpenGL 3.3 Tutorial=<br />
==Einleitung==<br />
Hinweis: Die Sourcen auf GitHub sind aktueller als das Wiki.<br><br />
Auch befinden sich Beispiele auf GitHub, welche im Wiki nicht dokumentiert sind.<br><br />
==Download==<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial alle Sourcen (github)]<br><br />
==Tutorial==<br />
=== Einrichten und Einstieg ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten|Lazarus fuer OpenGL einrichten]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|128px|right]] <br />
"Lazarus mit '''OpenGL 3.3'''"<br />
<br />
Was sind die Voraussetzungen.<br />
Und wie richte ich '''Lazarus''' ein, das dies mit '''OpenGL 3.3''' funktioniert.<br />
<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/00_-_Lazarus_fuer_OpenGL_einrichten source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen|Context erzeugen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Context erzeugen.png|128px|right]] <br />
"Eine Arbeitsfläche erzeugen"<br />
<br />
Das OpenGL etwas auf den Bildschirm ausgeben kann, wird ein '''Context''', Zeichenfläche gebraucht.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/05_-_Context_erzeugen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden|VAO - Daten laden]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|128px|right]] <br />
"Erste Vectoren"<br />
<br />
Das OpenGL weis, was ausgegeben werden muss, speichert man die Eckpunkte einer Mesh in eine Vektor-Array.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/10_-_VAO_-_Daten_laden source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader|Erster Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Erster Shader.png|128px|right]] <br />
"Zeichen Routine"<br />
<br />
Bevor OpenGL etwas ausgeben kann, werden die Daten in einem '''Shader'''-Programm abgearbeitet.<br />
Somit stehen einem fast unendliche Effekte zu Verfügung.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/15_-_Erster_Shader source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus|Polygonmodus]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Polygonmodus.png|128px|right]] <br />
"Wie sollen die Polygone verarbeitet werden ?"<br />
<br />
Die Dreiecke/Linien können als Eckpunkte, Drahtgitter oder Vollflächig ausgegeben werden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/01_-_Einrichten_und_Einstieg/20_-_Polygonmodus source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Shader ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader|Einleitung und laden der Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einleitung und laden der Shader.png|128px|right]] <br />
"Das Herz von OpenGL 3.3"<br />
<br />
Sämtliche Effekt werden hier verarbeitet.<br />
Was ist ein Shader und wie lädt man ihn in die Grafikkarte.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/00_-_Einleitung_und_laden_der_Shader source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader|Einfachster Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|128px|right]] <br />
"Einfachste Abbarbeitung"<br />
<br />
Die minimalste Version eines Shaders.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/05_-_Einfachster_Shader source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen|Uniform Variablen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|128px|right]] <br />
"Äusere Beinflussung"<br />
<br />
Wie kann ich den Ablauf des Shaders von aussen beeinflussen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/10_-_Uniform_Variablen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung|Erste Bewegung]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Erste Bewegung.png|128px|right]] <br />
"Die Mesh sollte nicht statisch sein"<br />
<br />
Wie bewege ich eine Mesh im Shader.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/15_-_Erste_Bewegung source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader|Mehrere Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Mehrere Shader.png|128px|right]] <br />
"Einer ist langweilig"<br />
<br />
Wie kann ich verschiedene Shader benutzen, da man nicht auf allen Meshes die gleichen Efffekte will.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/20_-_Mehrere_Shader source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen|Schleifen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Schleifen.png|128px|right]] <br />
"Nicht immer gleich"<br />
<br />
Im Shader kann man auch verschiedene Abläufe steuern, die if-Schleife.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/25_-_Schleifen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader|Geometrie Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|128px|right]] <br />
"Zusätliche geometrische Berechnung"<br />
<br />
Ein Zusatz-Shader, der zB. Vektoren verdoppeln kann.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/30_-_Geometrie_Shader source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen|Punkte verschieden darstellen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Punkte verschieden darstellen.png|128px|right]] <br />
"Ein Pixel ist langweilig"<br />
<br />
Man kann einen Punkt auf verschiedene Arten darstellen, mit dem Shader eine einfache Sache.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/35_-_Punkte_verschieden_darstellen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot|Shader Mandelbrot]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Shader Mandelbrot.png|128px|right]] <br />
"Jetzt wird es komplex"<br />
<br />
Mit dem Shader kann man auch ganze Fraktale berechnen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/40_-_Shader_Mandelbrot source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen|Variablen Namen auslesen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Variablen Namen auslesen.png|128px|right]] <br />
"Variable auslesen"<br />
<br />
Man kann auch ermitteln, welche Variablen im Shader verwendet werden.<br />
<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/02_-_Shader/45_-_Variablen_Namen_auslesen source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Vertex-Puffer ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer|Einfachster Vertex-Puffer]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Einfachster Vertex-Puffer.png|128px|right]] <br />
"Mesh Daten"<br />
<br />
Wie gelangen die Daten der Mesh in die Grafikkarte.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/00_-_Einfachster_Vertex-Puffer source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh|Mehrere Vertex-Puffer, Mehrarbige Mesh]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Mehrere Vertex-Puffer, Mehrarbige Mesh.png|128px|right]] <br />
"Nicht nur Koordinaten"<br />
<br />
Die Vector-Daten können mehr enthalten als nur die Koordinaten, hier sind es die Farben der Face.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/05_-_Mehrere_Vertex-Puffer,_Mehrarbige_Mesh source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D|Vertex-Puffer in 2D]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer in 2D.png|128px|right]] <br />
"Es muss nicht immer 3D sein"<br />
<br />
Andere Vertex-Daten anstelle von 3D.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/10_-_Vertex-Puffer_in_2D source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array|Nur eine Array]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Nur eine Array.png|128px|right]] <br />
"Alles zusammen"<br />
<br />
Man kann Koordianten, Farben, etc., alles in einen Puffer ablegen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/15_-_Nur_eine_Array source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren|Vertex-Daten zur Laufzeit modifizieren]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|128px|right]] <br />
"Es werde dynamisch"<br />
<br />
Man kann die Vertex-Daten zu Laufzeit modifizieren und neu in die Grafikkarte laden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/20_-_Vertex-Daten_zur_Laufzeit_modifizieren source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke)|Shapes (Dreiecke)]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Dreiecke).png|128px|right]] <br />
"Nicht nur einzeln Dreiecke"<br />
<br />
Man kann die Dreiecke auch zur einer Strip oder Fan zusamenfügen, dies spart Platz im VRAM.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/25_-_Shapes_(Dreiecke) source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte)|Shapes (Linien und Punkte)]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Shapes (Linien und Punkte).png|128px|right]] <br />
"Nicht nur Dreiecke"<br />
<br />
Ein Vektor-Puffer kann auch aus Linien oder Punkte bestehen.<br />
'''GL_QUAD''', '''GL_POLYGON''', so wie im alten OpenGL, gibt es '''nicht''' mehr.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/30_-_Shapes_(Linien_und_Punkte) source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays|DrawArrays]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - DrawArrays.png|128px|right]] <br />
"Nicht immer am Stück"<br />
<br />
Man kann auch nur einen Teil einer Vertex-Array zeichnen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/35_-_DrawArrays source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices|Indices]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|128px|right]] <br />
"Eigene Reihenfolge"<br />
<br />
Man kann auch eine Liste erstellen und die Reihenfolge der Vertex-Daten selbst betimmen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/40_-_Indices source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer|Index-Puffer]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|128px|right]] <br />
"Indizien im Puffer"<br />
<br />
Auch die Liste der Punkte (Indizien), kann man in einem Puffer ablegen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/45_-_Index-Puffer source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch|Index-Puffer dynamisch]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer dynamisch.png|128px|right]] <br />
"Indizien dynamisch"<br />
<br />
Auch der Indizien-Puffer kann man zur Laufzeit modifizieren.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/50_-_Index-Puffer_dynamisch source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID|VertexID]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - VertexID.png|128px|right]] <br />
"Welcher Vertex ?"<br />
<br />
Mit gl_VertexID kann man im Vertex-Shader ermitteln, welcher Vertex gerade gezeichnet wird.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/55_-_VertexID source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen|Vertex-Puffer auslesen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Puffer auslesen.png|128px|right]] <br />
"Nicht nur schreiben"<br />
<br />
Ein Vertex-Puffer kann man auch von der Grafikkarte wieder auslesen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/03_-_Vertex-Puffer/60_-_Vertex-Puffer_auslesen source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Matrix ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix|Was ist eine Matrix]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|128px|right]] <br />
"Bewegung im Raum"<br />
<br />
Mit eine 4x4 Matrix, kann man sämtliche Bewegungen im Raum darstellen. Verschiebung, Drehung, Skalierung und sogar Perspektive ist mit dieser Matrix möglich.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/00_-_Was_ist_eine_Matrix source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren|Matrix Rotieren]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Rotieren.png|128px|right]] <br />
"Drehung"<br />
<br />
Wie drehe ich eine Mesh mit Hilfe einer Matrix.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/05_-_Matrix_Rotieren source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren|Matrix Verschieben und Multiplizieren]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Matrix Verschieben und Multiplizieren.png|128px|right]] <br />
"Mehrere Matrizen"<br />
<br />
Verschiedene Matrizen können multiplizert werden, soomit sind mehrere Bewegungen der Mesh möglich.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/10_-_Matrix_Verschieben_und_Multiplizieren source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium|Kleines Planetarium]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Kleines Planetarium.png|128px|right]] <br />
"Planetarium"<br />
<br />
Ein Planetarium ist eine gute Demonstration, wie man Matrizen multipliziert.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/04_-_Matrix/15_-_Kleines_Planetarium source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== 3D ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel|Erster-Wuerfel]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Erster-Wuerfel.png|128px|right]] <br />
"Es werde 3D"<br />
<br />
Anhand eines Würfels sieht man sehr gut die Räumlichkeit einer Scene.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/00_-_Erster-Wuerfel source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)|Polygon - Seite (Backface Culling)]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png|128px|right]] <br />
"Alles ist zu viel"<br />
<br />
Wie unterbinde ich es, das die Rückseite eines Polygones gerendert wird.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/05_-_Polygon_-_Seite_(Backface_Culling) source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer|Tiefenbuffer]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png|128px|right]] <br />
"Nur Vorne"<br />
<br />
Es sollte nur das gerendert werden, was man auch sieht, verdecktes sollte nicht gerendert werden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/10_-_Tiefenbuffer source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion|Orthogonalprojektion]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Orthogonalprojektion.png|128px|right]] <br />
"Ortografisch"<br />
<br />
Wird meistens in einem CAD gebraucht.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/15_-_Orthogonalprojektion source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum)|Fluchtpunktperspektive (Frustum)]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Fluchtpunktperspektive (Frustum).png|128px|right]] <br />
"Vorn ist grösser"<br />
<br />
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/20_-_Fluchtpunktperspektive_(Frustum) source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport)|Betrachtungs - Fenster (Viewport)]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - 3D - Betrachtungs - Fenster (Viewport).png|128px|right]] <br />
"Nicht mehr verzerrt"<br />
<br />
Ein Quadrat sollte ein Quadrat bleiben, auch wen das Ausgabefenster nicht Quadratisch ist.<br />
Dies passt man in der Perspektive an.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/05_-_3D/25_-_Betrachtungs_-_Fenster_(Viewport) source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
<br />
=== Alpha Blending ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending|Einfaches Alpha Blending]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Einfaches Alpha Blending.png|128px|right]] <br />
"Es werde transparent"<br />
<br />
Mit Alpha-Blending ist es erst möglich Fensterscheiben oder Bäume mit OpenGL darzustellen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/00_-_Einfaches_Alpha_Blending source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig|Die Reihenfolge ist wichtig]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Die Reihenfolge ist wichtig.png|128px|right]] <br />
"Die Reihenfolge ist wichtig"<br />
<br />
Bei Alpha-Blendig ist es sehr wichtig, in welcher Reihenfolge die Polygone/Meshes gezeichnet werden. Mit dem Z-Pufer ist s leider '''nicht''' getan.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/05_-_Die_Reihenfolge_ist_wichtig source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln|Reihenfolge sortiert mit Wuerfeln]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Wuerfeln.png|128px|right]] <br />
"Zuerst hinten"<br />
<br />
Meshes sortieren, das Alphablending richtig kommt.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/10_-_Reihenfolge sortiert_mit_Wuerfeln source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen|Reihenfolge sortiert mit Texturen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Reihenfolge sortiert mit Texturen.png|128px|right]] <br />
"Auch Texturen müssen sortiert werden"<br />
<br />
Auch bei Texturen mit Alphablending ist die Reiehnfolge wichtig.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/15_-_Reihenfolge sortiert_mit_Texturen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Alpha-Kanal abfragen und ingnorieren|Alpha-Kanal abfragen und ingnorieren]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Alpha Blending - Alpha-Kanal abfragen und ingnorieren.png|128px|right]] <br />
"Transparent ingnorieren"<br />
<br />
Bei Transparent den Z-Buffer ingnorieren.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/06_-_Alpha_Blending/20_-_Alpha-Kanal_abfragen_und_ingnorieren source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Beleuchtung ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung|Einfache Beleuchtung]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Einfache Beleuchtung.png|128px|right]] <br />
"Es wird Erkennbar"<br />
<br />
Einfachste Variante einer Beleuchtung.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/00_-_Einfache_Beleuchtung source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light|Ambient Light]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Ambient Light.png|128px|right]] <br />
"Hintergrund-Beleuchtung"<br />
<br />
Ein Restlicht ist (fast) immer vorhanden.<br />
<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/05_-_Ambient_Light source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light|Directional Light]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Directional Light.png|128px|right]] <br />
"Sonnenlicht"<br />
<br />
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/10_-_Directional_Light source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen|Mehrere Directional Light Quellen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Mehrere Directional Light Quellen.png|128px|right]] <br />
"Mehrere Lichtquellen"<br />
<br />
So würde es aussehen, wen es eine rote, grüne und eine blaue Sonne gäbe.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/15_-_Mehrere_Directional_Light_Quellen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel|Point Light Kugel]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Kugel.png|128px|right]] <br />
"Eine Glühbirne"<br />
<br />
Das Licht strahlt alles von einem Punkt aus in alle Richtungen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/20_-_Point_Light_Kugel source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader|Point Light Vertex-Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Vertex-Shader.png|128px|right]] <br />
"Schnelle Lichtberechnung"<br />
<br />
Die Berechnung des Lichtes erfolgt im Vertex-Shader. Damit ist die Berechnung sehr schnell, dafür nimmt man Detail-Verlust in Kauf.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/25_-_Point_Light_Vertex-Shader source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader|Point Light Fragment-Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Point Light Fragment-Shader.png|128px|right]] <br />
"Detailgetreues Licht"<br />
<br />
Die Berechnung wird in den Fragemnt-Shader ausgelagert. Dies ist nicht mehr so schnell, dafür aber umso Detailreicher.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/30_-_Point_Light_Fragment-Shader source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht|Grundlage Spot Licht]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Grundlage Spot Licht.png|128px|right]] <br />
"Eine Taschenlampe" (ohne OpenGL)<br />
<br />
Dies zeigt die Grundlage der Berechnung eines Lichtstrahles einer Taschnelampe.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/35_-_Grundlage_Spot_Licht source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel|Spot Light, einfacher Kegel]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, einfacher Kegel.png|128px|right]] <br />
"Taschenlampe"<br />
<br />
Mesh anstrahlen mit einer Taschenlampe. Normalenberechnung wird ingnoriert.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/40_-_Spot_Light,_einfacher_Kegel source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale|Spot Light, mit Normale]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, mit Normale.png|128px|right]] <br />
"Taschenlampe realistisch"<br />
<br />
Jetzt werden auch schräge Flächen (Normale) berücksichtigt.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/45_-_Spot_Light,_mit_Normale source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen|Spot Light, Abschwaechen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Beleuchtung - Spot Light, Abschwaechen.png|128px|right]] <br />
"Taschenlampe wird schwach"<br />
<br />
Je weiter das Licht weg, je dünkler die Mesh.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/07_-_Beleuchtung/50_-_Spot_Light,_Abschwaechen source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Material Eigenschaften ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light|Material Directional Light]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Directional Light.png|128px|right]] <br />
"Materialien sind unterschiedlich"<br />
<br />
Je nach Material wird das Licht anders reflektiert. Hier das Sonnenlicht.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/00_-_Material_Directional_Light source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light|Material Point Light]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Point Light.png|128px|right]] <br />
"Auch eine Glühbirne reflektiert"<br />
<br />
Material mit Punkt-Lichtquelle.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/05_-_Material_Point_Light source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light|Material Spot Light]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Material Eigenschaften - Material Spot Light.png|128px|right]] <br />
"Eine Taschenlampe"<br />
<br />
Eine komplexe Taschenlampe mit Abschwächung.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/15_-_Material_Eigenschaften/10_-_Material_Spot_Light source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Bump Mapping ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping|Einfachstes Bump Mapping]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Einfachstes Bump Mapping.png|128px|right]] <br />
"Sonnenlicht"<br />
<br />
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/00_-_Einfachstes_Bump_Mapping source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping|Bump Mapping]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Bump Mapping - Bump Mapping.png|128px|right]] <br />
"Sonnenlicht"<br />
<br />
Das Licht kommt alles von der gleichen Seite, so wie beim Sonnenlicht. Dies ist das am meisten verwendete Licht.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/16_-_Bump_Mapping/05_-_Bump_Mapping source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Uniform Buffer Object (UBO) ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO|Einfacher UBO]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Einfacher UBO.png|128px|right]] <br />
"Uniform als Buffer"<br />
<br />
Mehrere Shader-Parameter in einem Puffer zusammenfassen.<br />
<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/00_-_Einfacher_UBO source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren|UBO Zur Laufzeit aktualisieren]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - UBO Zur Laufzeit aktualisieren.png|128px|right]] <br />
"Shader-Daten aktualisieren"<br />
<br />
Ohne diese Funktion, würden UBOs gar keinen Sinn machen.<br />
Sämtliche Änderungen zur Laufzeit, Farbe, Licht, etc., werden auf diese Art gemacht.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/05_-_UBO_Zur_Laufzeit_aktualisieren source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO|Mehrer UBO]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer UBO.png|128px|right]] <br />
"Schneller Wechsel"<br />
<br />
Wen man mehrere UBOs hat, kann man sehr schnell die UniformParameter austauschen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/10_-_Mehrer_UBO source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint|Mehrer Shader und BindingPoint]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrer Shader und BindingPoint.png|128px|right]] <br />
"Mehrere Verbindungen"<br />
<br />
Mehrere Verbindungen mit einem UBO sind möglich.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/15_-_Mehrer_Shader_und_BindingPoint source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader|Mehrere UBOs in einem Shader]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Uniform Buffer Object (UBO) - Mehrere UBOs in einem Shader.png|128px|right]] <br />
"UBOs richtig nutzen"<br />
<br />
Es werden alle Parameter, inklusive der Matrizen, via UBO übergeben.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/17_-_Uniform_Buffer_Object_(UBO)/20_-_Mehrere_UBOs_in_einem_Shader source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Texturen ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur|Erste Textur]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Erste Textur.png|128px|right]] <br />
"Es gebe Bilder"<br />
<br />
Die Polygone können mit Bilder ( Texturen ) überzogen werden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/00_-_Erste_Textur source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen|Mehrere Texturen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Mehrere Texturen.png|128px|right]] <br />
"Mehrer Texturen"<br />
<br />
Man kann mehrere Texturen auf dem VRAM ablegen. Und diese bei Bedarf abrufen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/05_-_Mehrere_Texturen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden|Texturn austauschen, Auschnitt laden]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden.png|128px|right]] <br />
"Nur ein Teil, austauschen"<br />
<br />
Es kann auch nur ein Teil eines Texturpuffers beschrieben werden.<br />
Auch ist es möglich die Textur zur Laufzeit auszutauschen.<br />
<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/10_-_Texturn_austauschen,_Auschnitt_laden source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP|Texturen von BMP]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von BMP.png|128px|right]] <br />
"Bilder direkt aus Bitmap"<br />
<br />
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/15_-_Texturen_von_BMP source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur|Texturen mit oglTextur]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen mit oglTextur.png|128px|right]] <br />
"Es gibt viele Formate"<br />
<br />
Da es sehr viele Formate gibt, habe ich eine Klasse geschrieben, welche einem die Arbeit der Erkennung abnimmt.<br />
'''Hinweis:''' Wen jemand ein Format hat, welches nicht erkannt wird, bitte im Forum melden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/20_-_Texturen_mit_oglTextur source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM|Texturen von XPM]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen von XPM.png|128px|right]] <br />
"Texturen als Text"<br />
<br />
Dank des '''XPM'''-Format, kann man sehr einfach eine Textur als ASCII-Text erstellen. Es ist '''kein''' Grafikprogramm nötig.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/25_-_Texturen_von_XPM source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen|Texturen und Matrixen]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen.png|128px|right]] <br />
"Bewegte Textur"<br />
<br />
Mit einer Matrix ist es möglich, eine Textur auf der Mesh zu skalieren/bewegen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/30_-_Texturen_und_Matrixen source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing|Multitexturing]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing.png|128px|right]] <br />
"Huckepack"<br />
<br />
Man kann mehrere Texturen übereinanderlegen (Multitexturing ).<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/35_-_Multitexturing source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter|Filter]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Filter.png|128px|right]] <br />
"Filter"<br />
<br />
Man kann Texturen auf verschiedene Art darstellen und filtern.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/40_-_Filter source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur|Alpha-Textur]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Alpha-Textur.png|128px|right]] <br />
"Es werde Transparent"<br />
<br />
Es ist auch möglich Texturen transparent darzustellen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/45_-_Alpha-Textur source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten|Textur-Koordinaten]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur-Koordinaten.png|128px|right]] <br />
"Koordinaten"<br />
<br />
Die Auswirkung unterschiedlicher Textur-Koordinaten.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/50_-_Textur-Koordinaten source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur|Texturen Perspektiven-Korrektur]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen Perspektiven-Korrektur.png|128px|right]] <br />
"Verzerrte Texturen"<br />
<br />
Dies kann man aber zum Glück korrigieren.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/55_-_Texturen_Perspektiven-Korrektur source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur|1D Textur]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur.png|128px|right]] <br />
"Es geht auch 1D"<br />
<br />
Texturen können auch 1D sein, eine Linie mit Farb-Punkten.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/60_-_1D_Textur source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array|Textur Array]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array.png|128px|right]] <br />
"Alles auf einmal"<br />
<br />
Mehrere Texturen in einem Textur-Puffer. ( Textur-Array )<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/65_-_Textur_Array source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap|Textur Array einzel Bitmap]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap.png|128px|right]] <br />
"Bilder einzeln, aber nur ein Puffer"<br />
<br />
Bitmaps einzeln in einen Textur-Puffer laden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/20_-_Texturen/70_-_Textur_Array_einzel_Bitmap source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Cubemap Texturen ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel|Wuerfel]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Wuerfel.png|128px|right]] <br />
"Bilder einzeln, aber nur ein Puffer"<br />
<br />
Bitmaps einzeln in einen Textur-Puffer laden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/00_-_Wuerfel source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung|Umgebung]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Umgebung.png|128px|right]] <br />
"Bilder einzeln, aber nur ein Puffer"<br />
<br />
Bitmaps einzeln in einen Textur-Puffer laden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/05_-_Umgebung source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel|Kugel]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Cubemap Texturen - Kugel.png|128px|right]] <br />
"Bilder einzeln, aber nur ein Puffer"<br />
<br />
Bitmaps einzeln in einen Textur-Puffer laden.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/22_-_Cubemap_Texturen/10_-_Kugel source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Framepuffer ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern|In Textur rendern]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - In Textur rendern.png|128px|right]] <br />
"Es muss nicht der Bildschirm sein"<br />
<br />
Man kann auch in Texturen rendern.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/00_-_In_Textur_rendern source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern|Framepuffer speichern]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Framepuffer - Framepuffer speichern.png|128px|right]] <br />
"Verewigen"<br />
<br />
Man kann die gerenderte Scene auch in ein Bitmap speichern.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/25_-_Framepuffer/05_-_Framepuffer_speichern source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Geometrie-Shader ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien|Breite Linien]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - Breite Linien.png|128px|right]] <br />
"Bilder direkt aus Bitmap"<br />
<br />
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/00_-_Breite_Linien source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY|GL TRIANGLE STRIP ADJACENCY]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Geometrie-Shader - GL TRIANGLE STRIP ADJACENCY.png|128px|right]] <br />
"Bilder direkt aus Bitmap"<br />
<br />
Texturen können recht einfach von einer Bitmap in das VRAM kopiert werden, es muss nur das format bekannt sein.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/35_-_Geometrie-Shader/05_-_GL_TRIANGLE_STRIP_ADJACENCY source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Schatten ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh|Eine einfache Mesh]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Schatten - Eine einfache Mesh.png|128px|right]] <br />
"Vorn ist grösser"<br />
<br />
Mit der Fluchtpunktperspektive werden Objekte kleiner je weiter sie von einem weg sind, so wie es in der Realität auch der Fall ist.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/45_-_Schatten/00_-_Eine_einfache_Mesh source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Instancing ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance|Einfachste Instance]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Einfachste Instance.png|128px|right]] <br />
"Nur einmal"<br />
<br />
Mit Instancen kann man eine Mesh mehrmals mit einem Aufruf zeichen.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/00_-_Einfachste_Instance source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform|Instance mit Uniform]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit Uniform.png|128px|right]] <br />
"Chaotisch"<br />
<br />
Will man eigene Parameter der Meshes, kann man die per Uniform-Array übergeben.<br />
Die Anzahl der Instancen ist sehr begrenzt.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/05_-_Instance_mit_Uniform source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut|Instance mit VertexAttribut]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instance mit VertexAttribut.png|128px|right]] <br />
"Flexibel sollte es sein"<br />
<br />
Nimmt man ein Vertex-Attribut ist man viel flexibler mit Instancen.<br />
Die Anzahl der Instancen ist fast unbegrenzt.<br />
<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/10_-_Instance_mit_VertexAttribut source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array|Instancen nur in einer Array]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - Instancen nur in einer Array.png|128px|right]] <br />
"Alles in einem"<br />
<br />
Man kann alle Parameter in ein Record packen.<br />
Die ist mit Uniform nicht möglich.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/15_-_Instancen_nur_in_einer_Array source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor|VertexAttribDivisor]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Instancing - VertexAttribDivisor.png|128px|right]] <br />
"Nicht immer"<br />
<br />
Man kann bestimmen, das der Zeiger in der Instance nicht jedes mal erhöht wird.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/50_-_Instancing/20_-_VertexAttribDivisor source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]<br />
=== Vektoren und Matrizen ( no OpenGL ) ===<br />
{|{{Prettytable_B1}} width="100%"<br />
!width="15%"|Link<br />
!width="85%"|Beschreibung<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik|Einleitung Vektorgrafik]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Einleitung Vektorgrafik.png|128px|right]] <br />
"ohne OpenGL"<br />
<br />
Was nimmt OpenGL einem für Arbeit ab.<br />
<br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/00_-_Einleitung_Vektorgrafik source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo|Matrix 2D Demo]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Matrix 2D Demo.png|128px|right]] <br />
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar <br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/05_-_Matrix_2D_Demo source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube|Vektoren Cube]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube.png|128px|right]] <br />
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar <br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/10_-_Vektoren_Cube source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle|Gradient Triangle]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Gradient Triangle.png|128px|right]] <br />
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar <br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/15_-_Gradient_Triangle source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer|Vektoren Cube Z-Buffer]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Z-Buffer.png|128px|right]] <br />
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar <br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/20_-_Vektoren_Cube_Z-Buffer source]<br />
|-<br />
![[Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture|Vektoren Cube Texture]]<br />
{{Level_2}} <br />
|[[Image:Lazarus - OpenGL 3.3 Tutorial - Vektoren und Matrizen ( no OpenGL ) - Vektoren Cube Texture.png|128px|right]] <br />
Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar Kommentar <br />
* [https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/tree/master/90_-_Vektoren_und_Matrizen_(_no_OpenGL_)/25_-_Vektoren_Cube_Texture source]<br />
|-<br />
|}<br />
[https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial Inhaltsverzeichnis]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Matrix_-_Was_ist_eine_Matrix&diff=27046Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix2019-12-02T10:13:10Z<p>I0n0s: </p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Matrix - Was ist eine Matrix.png|200px]]<br><br><br />
=Matrix - Was ist eine Matrix =<br />
== Einleitung ==<br />
Der mathematische Teil von Matrix wird hier nicht behandelt, in diesem Tutorial geht es nur um die Anwendung davon.<br><br />
<br><br />
Wen jemand den mathematischen Teil interessiert, gibt es schon fertige Tutorials dazu.<br><br />
Der zweite Grund, ich versteht das auch nicht ganz, und somit will ich verhindern, das ich etwas falsches weiter gebe. :ops:<br><br />
<br><br />
Was ein wenig irritiert, auf der '''2D'''-Ebene wird eine '''3x3'''-Matrix verwendet und in der '''3D'''-Ebene eine 4'''x4'''-Matrix.<br><br />
Einfach gesagt, die vorderen Spalten beinhalten die Richtung und Skalierung, die hinterste Spalte die Position.<br><br />
<br><br />
Ich habe eine fertige Bibliotheke für Matrizen, bei der ich die gängigen Funktionen beschreiben will.<br><br />
Es wird hier fast nur eine '''4x4'''-Matrix verwendet, die Standard mässig so auf gebaut ist:<br><br />
{| class="wikitable"<br />
| style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 <br />
|-<br />
|}<br />
Die Abbildung zeigt eine Einheitsmatrix, die meisten OpenGL-Funktionen nehmen diese als Basis. Mit der 4x4-Matrix sind alle Bewegungen, Skalierungen, inklusive Perspektive möglich.<br><br />
Hier eine kleine Einführung, die zeigt, welche Werte in der Matrix für die verschiedenen Bewegungen verändert werden.<br><br />
<br><br />
Die Matrix bildet die drei Achsen und eine Verschiebung ab. Die grossen Buchstaben zeigen die Achse, die kleinen die Position der Achsen.<br><br />
Die hinterste Spalte gibt die Verschiebung an. Die unterste Zeile wird nur verändert bei Perspektiven und bei Multiplikationen,<br><br />
{| class="wikitable"<br />
| style="width:3em;height:3em;text-align:center"| Xx || style="width:3em;height:3em;text-align:center"| Yx || style="width:3em;height:3em;text-align:center"| Zx || style="width:3em;height:3em;text-align:center"| x0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| Xy || style="width:3em;height:3em;text-align:center"| Yy || style="width:3em;height:3em;text-align:center"| Zy || style="width:3em;height:3em;text-align:center"| y0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| Xz || style="width:3em;height:3em;text-align:center"| Yz || style="width:3em;height:3em;text-align:center"| Zz || style="width:3em;height:3em;text-align:center"| z0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 <br />
|-<br />
|}<br />
<br><br />
Für die Verschiebungen ('''Translate'''):<br><br />
{| class="wikitable"<br />
| style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| tx <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| ty <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| tz <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 <br />
|-<br />
|}<br />
<br><br />
<br><br />
Für die Skalierung ('''Scale'''):<br><br />
{| class="wikitable"<br />
| style="width:3em;height:3em;text-align:center"| sx || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| tx <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| sy || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| ty <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| sz || style="width:3em;height:3em;text-align:center"| tz <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 <br />
|-<br />
|}<br />
<br><br />
<br><br />
Für die Rotation A-Achse ('''RotateA'''):<br><br />
{| class="wikitable"<br />
| style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| cos(d) ||-sin(d) || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| sin(d) || style="width:3em;height:3em;text-align:center"| cos(d) || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 <br />
|-<br />
|}<br />
<br><br />
<br><br />
Für die Rotation B-Achse ('''RotateB'''):<br><br />
{| class="wikitable"<br />
| style="width:3em;height:3em;text-align:center"| cos(d) || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| sin(d) || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| -sin(d) || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| cos(d) || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 <br />
|-<br />
|}<br />
<br><br />
<br><br />
Für die Rotation C-Achse ('''RotateC'''):<br><br />
{| class="wikitable"<br />
| style="width:3em;height:3em;text-align:center"| cos(d) ||-sin(d) || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| sin(d) || style="width:3em;height:3em;text-align:center"| cos(d) || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 || style="width:3em;height:3em;text-align:center"| 0 <br />
|-<br />
| style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 0 || style="width:3em;height:3em;text-align:center"| 1 <br />
|-<br />
|}<br />
<br><br><br />
Die Anwendung der '''Matrix-Bibliothek''' ist sehr einfach, so das man nicht mal wissen muss, wie eine Matrix aufgebaut ist.<br><br />
<syntaxhighlight lang="pascal">var<br />
Matrix : TMatrix;<br />
<br />
begin<br />
Matrix.Indenty; // Matrix Indenty setzen.<br />
<br />
Matrix.xxxx(...); // Modifikationen der Matrix.<br />
Matrix.Uniform(ID_im_Shader); // Die Matrix dem Shader übergeben.</syntaxhighlight><br />
Ausser im ersten Beispiel werde ich nur noch diese '''Bibliothek''' verwenden. Somit werden die Beispiele sehr übersichtlich.<br><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Index-Puffer&diff=27045Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer2019-12-02T10:10:45Z<p>I0n0s: /* Einleitung */</p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer.png|200px]]<br><br><br />
=Vertex-Puffer - Index-Puffer =<br />
== Einleitung ==<br />
Die Indicien, kann man auch von Anfang an ins VRAM laden, so müssen die Daten nich jedes mal mit '''glDrawElements(...''' neu übegeben werden.<br><br />
Dafür gibt es den ''' Index Buffer Objects''' (IBO).<br><br />
Das Laden geschieht ähnlich wie mit den Vertex-Daten.<br><br />
<br><br><br />
Die Deklaration der Vektor-Koordianten und Indicien Konstanten, dies ist gleich wie ohne Buffer.<br><br />
<syntaxhighlight lang="pascal">const<br />
// --- Dreieck<br />
// Vertex-Koordinaten<br />
Triangle: array[0..2] of TVertex3f =<br />
((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0));<br />
// Indicien ( Reihenfolge )<br />
Triangle_Indices: array[0..2] of GLint = (0, 1, 2);<br />
<br />
// --- Quadrat<br />
// Vertex-Koordinaten<br />
Quad: array[0..3] of TVertex3f =<br />
((-0.2, -0.6, 0.0), (0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (-0.2, -0.1, 0.0));<br />
// Indicien ( Reihenfolge )<br />
Quad_Indices: array[0..5] of GLint = (0, 1, 2, 0, 2, 3);</syntaxhighlight><br />
Der IBO muss noch deklariert werden.<br><br />
Das Erzeugen des IBI-Puffer geht gleich wie beim VBO-Puffer.<br><br />
Hier werden die IBO-Daten in den Buffer geladen, dies geschieht ähnlich, wie bei den Vertex-Daten.<br><br />
Der Unterschied ist der zweite Parameter, dieser muss '''GL_ELEMENT_ARRAY_BUFFER''' sein.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.InitScene;<br />
begin<br />
glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe<br />
<br />
// --- Daten für das Dreieck<br />
glBindVertexArray(VBTriangle.VAO);<br />
<br />
// VBO der Vertex-Koordinaten<br />
glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);<br />
glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);<br />
<br />
// IBO binden und mit den Indices-Daten laden<br />
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBTriangle.IBO);<br />
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle_Indices), @Triangle_Indices, GL_STATIC_DRAW);<br />
<br />
glEnableVertexAttribArray(10);<br />
glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);<br />
<br />
// --- Daten für das Quadrat<br />
glBindVertexArray(VBQuad.VAO);<br />
<br />
// VBO der Vertex-Koordinaten<br />
glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO);<br />
glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);<br />
<br />
// IBO binden und mit den Indices-Daten laden<br />
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBQuad.IBO);<br />
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Quad_Indices), @Quad_Indices, GL_STATIC_DRAW);<br />
<br />
glEnableVertexAttribArray(10);<br />
glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);<br />
end;</syntaxhighlight><br />
Da die Indicien im IBO gespeichert sind muss der dritte Paramter bei '''glDrawElements(...''', nil sein.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);<br />
begin<br />
glClear(GL_COLOR_BUFFER_BIT);<br />
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Linien<br />
Shader.UseProgram;<br />
<br />
// Zeichne Dreieck<br />
glBindVertexArray(VBTriangle.VAO);<br />
glDrawElements(GL_TRIANGLES, Length(Triangle_Indices), GL_UNSIGNED_INT, Nil); // Hier Nil<br />
<br />
// Zeichne Quadrat<br />
glBindVertexArray(VBQuad.VAO);<br />
glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, Nil); // Hier Nil</syntaxhighlight><br />
IBO Freigabe ist gleich wie bei dem VBO.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
Shader.Free;<br />
<br />
glDeleteBuffers(1, @VBTriangle.IBO); // Indices-Buffer freigeben.<br />
glDeleteBuffers(1, @VBQuad.IBO);</syntaxhighlight><br />
<br><br><br />
<br />
==Vertex-Shader:==<br />
<br><br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten<br />
<br />
void main(void)<br />
{<br />
gl_Position = vec4(inPos, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Fragment-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
out vec4 outColor; // ausgegebene Farbe<br />
<br />
void main(void)<br />
{<br />
vec3 col = vec3(0.0, 1.0, 1.0); // Mint<br />
outColor = vec4(col, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Indices&diff=27044Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices2019-12-02T10:09:59Z<p>I0n0s: </p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Indices.png|200px]]<br><br><br />
=Vertex-Puffer - Indices =<br />
== Einleitung ==<br />
Normalerweise, werden die Polygone in der Reihenfolge der Vertex-Konstanten abgearbeitet.<br><br />
Man kann aber auch selbst bestimmen, welche Koordinate abgearbeitet werden.<br><br />
Dafür muss man eine Indices-Array kreieren, welche die Reihenfolge der Koordinaten bestimmt.<br><br />
<br><br />
Der Unterschied zum einfachen Zeichenn ist, das ich noch eine Indicen-Array brauche.<br><br />
Und das Zeichnen ist vor allem anders.<br><br />
Man verwendet anstelle von '''glDrawArrays(...''', '''glDrawElements(...''', welche als dritten Parameter noch einen Zeiger auf die Indicen-Array bekommt.<br><br />
<br><br><br />
Die Deklaration der Vektor-Koordianten und Indicien Konstanten.<br><br />
Beim Dreieck sieht man keinen Vorteil bei der Indicien-Version, da das Dreieck sowieso nur aus einem Polygon besteht.<br><br />
Beim Quadrat, konnten so schon zwei Koordinaten eingespart werden, da man die Eckpunkte nur einmal angeben muss.<br><br />
Bei der einfachen Variante bräuchte es dafür sechs Eckpunte, weil dort zwei Punkte doppelt vorhandnen sein müssen.<br><br />
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 !<br><br />
<br><br />
Mit den Indicen kann ich sagen, zeichne mir von Punkt 0-1-2 und von Punkt 0-2-3.<br><br />
<br><br />
<syntaxhighlight lang="text">3 - 2<br />
| / |<br />
0 - 1</syntaxhighlight><br />
<syntaxhighlight lang="pascal">const<br />
// --- Dreieck<br />
// Vertex-Koordinaten<br />
Triangle: array[0..2] of TVertex3f =<br />
((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0));<br />
// Indicien ( Reihenfolge )<br />
Triangle_Indices: array[0..2] of GLint = (0, 1, 2);<br />
<br />
// --- Quadrat<br />
// Vertex-Koordinaten<br />
Quad: array[0..3] of TVertex3f =<br />
((-0.2, -0.6, 0.0), (0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (-0.2, -0.1, 0.0));<br />
// Indicien ( Reihenfolge )<br />
Quad_Indices: array[0..5] of GLint = (0, 1, 2, 0, 2, 3);</syntaxhighlight><br />
Bei '''glDrawElements(...''', muss als dritten Parameter der Zeiger auf die Indicien-Array übergeben werden.<br><br />
Ansonsten geht das Zeichen gleich, wie bei der einfachen Methode.<br><br />
Der Polygonmodus wurde auf Linien umgestellt, so das man die Polygone besser sieht.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);<br />
begin<br />
glClear(GL_COLOR_BUFFER_BIT);<br />
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Linien<br />
Shader.UseProgram;<br />
<br />
// Zeichne Dreieck<br />
glBindVertexArray(VBTriangle.VAO);<br />
glDrawElements(GL_TRIANGLES, Length(Triangle_Indices), GL_UNSIGNED_INT, @Triangle_Indices);<br />
<br />
// Zeichne Quadrat<br />
glBindVertexArray(VBQuad.VAO);<br />
glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, @Quad_Indices);</syntaxhighlight><br />
<br><br><br />
<br />
==Vertex-Shader:==<br />
<br><br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten<br />
<br />
void main(void)<br />
{<br />
gl_Position = vec4(inPos, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Fragment-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
out vec4 outColor; // ausgegebene Farbe<br />
<br />
void main(void)<br />
{<br />
vec3 col = vec3(1.0, 1.0, 0.0); // Gelb<br />
outColor = vec4(col, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Vertex-Puffer_-_Vertex-Daten_zur_Laufzeit_modifizieren&diff=27043Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren2019-12-02T10:06:35Z<p>I0n0s: </p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren.png|200px]]<br><br><br />
=Vertex-Puffer - Vertex-Daten zur Laufzeit modifizieren =<br />
== Einleitung ==<br />
Bis jetzt waren die Vertexdaten immer statisch. Man kann diese aber auch zur Laufzeit neu in den Vertex-Puffer schreiben.<br><br />
<br><br />
Da sich nicht nur die Koordinaten ändern, sondern auch die Grösse des Mesh, muss die TFaceArray eine '''dynamische''' Array sein.<br><br />
Zur Demonstration, werden alle 1/2 Sekunden neue Vertex-Daten geladen.<br><br />
Dafür habe ich einen Kreis gewählt, der zufällig jedes mal eine andere Anzahl Sektoren bekommt. Die Farben der Vektoren werden auch zufällig erzeugt.<br><br />
<br><br><br />
Zusätzlich ist noch eine '''TFaceArray''' hinzugekommen.<br><br />
Das sieht man, das die '''TFaceArray''' für das Mesh dynamisch ist.<br><br />
<br><br />
Für die einzelnen Meshes gibt es nun einen Record, welcher mit '''size''' die Grösse der TFace-Array speichert.<br><br />
Auch habe ich die Objekt-Namen von '''VBO''' und '''VAO''' in den Record genommen.<br><br />
'''size''' ist erforderlich, weil ich die Arraygrösse im RAM auf Null setze. Sobald die Vertex-Daten sich im VRAM befinden, werden die Daten im RAM nicht mehr gebraucht.<br><br />
Bei einem sehr grossen Mesh kann man damit kostbares RAM sparen.<br><br />
<syntaxhighlight lang="pascal">type<br />
TVertex3f = array[0..2] of GLfloat;<br />
TFace = array[0..2] of TVertex3f;<br />
TFaceArray = array of TFace; // neu<br />
<br />
TMesh = record // Record für die Mesh-Daten, welcher auch size enthält.<br />
Vector, Color: TFaceArray; // Vertex-Daten.<br />
size: integer; // Die Grösse der Vertex-Daten.<br />
VBuffer: TVB; // VBO und VAO der Mesh.<br />
end;</syntaxhighlight><br />
Deklaration der beiden Meshes. Ich habe bewusst die Meshes in ein Array genommen.<br><br />
Somit kann man vieles mit einer For-To-Schleife machen. Was den Vorteil hat, wen man mehrere Meshes hat, man erspart sich viel Tipparbeit.<br><br />
<syntaxhighlight lang="pascal">var<br />
CircleMesh: array[0..1] of TMesh;</syntaxhighlight><br />
Mit dieser Funktion werden neue Vertex-Daten berechnet.<br><br />
Es wird ein Kreis mit zufälliger Anzahl Sektoren erzeugt, somit hat man unterschiedlich lange Vertex-Daten.<br><br />
Mit '''ofsx''' wird das Mesh in der X-Achse verschoben.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.CreateVertex(var Mesh: TMesh; ofsx: GLfloat);<br />
const<br />
r = 0.5; // Radius des Kreises.<br />
var<br />
i, j: integer;<br />
begin<br />
with Mesh do begin<br />
size := Random(maxSektor - 3) + 3;<br />
SetLength(Vector, size);<br />
SetLength(Color, size);<br />
for i := 0 to size - 1 do begin<br />
for j := 0 to 2 do begin<br />
Color[i, j, 0] := Random();<br />
Color[i, j, 1] := Random();<br />
Color[i, j, 2] := Random();<br />
end;<br />
<br />
Vector[i, 0, 0] := ofsx;<br />
Vector[i, 0, 1] := 0;<br />
Vector[i, 0, 2] := 0;<br />
<br />
Vector[i, 1, 0] := sin(Pi * 2 / size * i) * r + ofsx;<br />
Vector[i, 1, 1] := cos(Pi * 2 / size * i) * r;<br />
Vector[i, 1, 2] := 0;<br />
<br />
Vector[i, 2, 0] := sin(Pi * 2 / size * (i + 1)) * r + ofsx;<br />
Vector[i, 2, 1] := cos(Pi * 2 / size * (i + 1)) * r;<br />
Vector[i, 2, 2] := 0;<br />
end;<br />
end;<br />
end;</syntaxhighlight><br />
Hier werden schon mal die ersten Vertex-Daten erzeugt.<br><br />
Später werden neue Daten in einem Timer erzeugt.<br><br />
Mit UpdateScene werden sie dann in das VRAM geladen.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
ogc := TContext.Create(Self);<br />
ogc.OnPaint := @ogcDrawScene;<br />
<br />
Randomize;<br />
<br />
CreateScene;<br />
<br />
CreateVertex(CircleMesh[0], 0.5); // Vertex-Daten erzeugen.<br />
CreateVertex(CircleMesh[1], -0.5);<br />
<br />
UpdateScene(0); // Vertex-Daten in VRAM schreiben.<br />
UpdateScene(1); // Vertex-Daten in VRAM schreiben.<br />
Timer1.Enabled := True;<br />
end;</syntaxhighlight><br />
Das Anlegen der Puffer geht mit einer Schleife viel einfacher.<br><br />
Bei den zwei Meshes wie bei diesem Beispiel hier, sind die Ersparnisse nicht so gross, aber will man zB. 20 Kreise darstellen, sieht dies schon viel anders aus.<br><br />
<br><br />
Da die Vertex-Daten erst zur Laufzeit geladen/geändert werden, wird mit '''glBufferData(...''' nur der Speicher dafür reserviert.<br><br />
<br><br />
Auch ist der zweite Parameter (size) etwas anders angegeben, wen man nur SizeOf(Array) macht, würden nur 4Byte zurückgeliefert (Die Grösse des Zeigers der Array).<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;<br />
var<br />
i: integer;<br />
begin<br />
Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Fragmentshader.glsl')]);<br />
Shader.UseProgram;<br />
<br />
for i := 0 to Length(CircleMesh) - 1 do begin<br />
with CircleMesh[i] do begin<br />
glGenVertexArrays(1, @VBuffer.VAO);<br />
glGenBuffers(1, @VBuffer.VBOvert);<br />
glGenBuffers(1, @VBuffer.VBOcol);<br />
<br />
glBindVertexArray(VBuffer.VAO);<br />
<br />
// Vektor<br />
glBindBuffer(GL_ARRAY_BUFFER, VBuffer.VBOvert);<br />
glBufferData(GL_ARRAY_BUFFER, sizeof(TFace) * maxSektor, nil, GL_DYNAMIC_DRAW); // Nur Speicher reservieren.<br />
glEnableVertexAttribArray(10);<br />
glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);<br />
<br />
// Farbe<br />
glBindBuffer(GL_ARRAY_BUFFER, VBuffer.VBOcol);<br />
glBufferData(GL_ARRAY_BUFFER, sizeof(TFace) * maxSektor, nil, GL_DYNAMIC_DRAW);<br />
glEnableVertexAttribArray(11);<br />
glVertexAttribPointer(11, 3, GL_FLOAT, False, 0, nil);<br />
end;<br />
end;<br />
end;</syntaxhighlight><br />
Da der Speicher im VRAM schon reserviert ist, kann man mit '''glBufferSubData(...''' nur noch die Vertex-Daten in das VRAM schreiben/ersetzen.<br><br />
<br><br />
Nach dem Schreiben ins VRAM , können mit '''SetLength(...''' die Daten im RAM entfernt werden.<br><br />
Wenn die Daten einmal im VRAM sind, werden sie im RAM nicht mehr gebraucht.<br><br />
<br><br />
Der Zeiger auf die Vertex-Daten, bei '''glBufferSubData(...''' hat sich ein wenig verändert.<br><br />
Anstelle von '''@''' muss man bei einer dynamischen Array mit '''Pointer''' arbeiten.<br><br />
Auch wenn man mit '''glBufferData(...''' schreiben würden muss man es bei der dynamischen Array so machen.<br><br />
Ansonsten wird der Zeiger der Array übergeben, anstelle der Daten selbst, da die Array selbst nur ein Zeiger auf die Daten ist.<br><br />
<br><br />
Mit '''MeshNr''' wird die Mesh angegben, welche neu in das VRAM kopiert werden soll.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.UpdateScene(MeshNr: integer);<br />
var<br />
i: integer;<br />
begin<br />
glClearColor(0.6, 0.6, 0.4, 1.0);<br />
<br />
with CircleMesh[MeshNr] do begin<br />
glBindVertexArray(VBuffer.VAO);<br />
<br />
// Vektor<br />
glBindBuffer(GL_ARRAY_BUFFER, VBuffer.VBOvert);<br />
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(TFace) * size, Pointer(Vector)); // Daten ins VRAM schreiben.<br />
SetLength(Vector, 0); // Daten im RAM entfernen.<br />
<br />
// Farbe<br />
glBindBuffer(GL_ARRAY_BUFFER, VBuffer.VBOcol);<br />
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(TFace) * size, Pointer(Color));<br />
SetLength(Color, 0);<br />
end;<br />
end;</syntaxhighlight><br />
Das Zeichen ist nichts besonderes, ausser das es jetzt mit einer Schleife läuft.<br><br />
<syntaxhighlight lang="pascal">// Zeichne Kreise<br />
for i := 0 to Length(CircleMesh) - 1 do begin<br />
with CircleMesh[i] do begin<br />
glBindVertexArray(VBuffer.VAO);<br />
glDrawArrays(GL_TRIANGLES, 0, size * 3);<br />
end;<br />
end;</syntaxhighlight><br />
Mit einem Timer werden alle 1/2 Sekunden neue Vertex-Daten erzeugt und in das VRAM geladen.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.Timer1Timer(Sender: TObject);<br />
const<br />
za: integer = 0;<br />
begin<br />
Inc(za);<br />
if za = 5 then begin // Mesh 0 neu erzeugen und laden<br />
CreateVertex(CircleMesh[0], 0.5);<br />
UpdateScene(0); // Daten mit dem VAO 0 binden.<br />
ogc.Invalidate; // Neu zeichnen.<br />
end else if za = 10 then begin // Mesh 1 neu erzeugen und laden<br />
CreateVertex(CircleMesh[1], -0.5);<br />
UpdateScene(1); // Daten mit dem VAO 1 binden<br />
ogc.Invalidate; // Neu zeichnen.<br />
za := 0;<br />
end;<br />
end;</syntaxhighlight><br />
<br><br><br />
Bei den Shadern gibt es nichts besonders.<br><br />
<br><br />
==Vertex-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten<br />
layout (location = 11) in vec3 inCol; // Farbe<br />
<br />
out vec4 Color; // Farbe, an Fragment-Shader übergeben<br />
<br />
void main(void)<br />
{<br />
gl_Position = vec4(inPos, 1.0);<br />
Color = vec4(inCol, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Fragment-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
in vec4 Color; // interpolierte Farbe vom Vertexshader<br />
out vec4 outColor; // ausgegebene Farbe<br />
<br />
void main(void)<br />
{<br />
outColor = Color; // Die Ausgabe der Farbe<br />
}<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Shader_-_Geometrie_Shader&diff=27042Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader2019-12-02T09:52:12Z<p>I0n0s: /* Einleitung */</p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Geometrie Shader.png|200px]]<br><br><br />
=Shader - Geometrie Shader =<br />
== Einleitung ==<br />
Hier wird ganz kurz der Geometrie-Shader erwähnt.<br><br />
In diesem Beispiel wird nicht ins Detail eingegangen, es sollte nur zeigen für was Geometrie-Shader gut sind.<br><br />
Die Funktion hier im Beispiel ist, die beiden Meshes werden kopiert und anschliessend nach Links und Rechts verschoben.<br><br />
Auch bekommt die linke Version eine andere Farbe als die rechte.<br><br />
<br><br />
Man kann einen Geometrie-Shader auch Nutzen um automatisch die Normale auszurechnen, welche für Beleuchtungs-Effekte gebraucht wird.<br><br />
Was eine Normale ist, wird später im Kapitel Beleuchtung erklärt.<br><br />
<br><br />
Der Lazarus-Code ist nichts besonderes, er rendert die üblichen zwei Meshes Dreieck und Quadrat.<br><br />
Die einzige Besondeheit ist, dass zu den üblichen zwei Shader noch ein Geometrie-Shader geladen wird.<br><br />
<br><br><br />
Hier ist die einzige Besonderheit, dass im Constructor von TShader ein dritter Shader-Code mitgegeben wird.<br><br />
<br><br />
Wenn man bei der Shader-Klasse einen dritten Shader mit gibt, wird automatisch erkannt, das noch ein Geometrie-Shader dazu kommt.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;<br />
begin<br />
Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Geometrieshader.glsl'), FileToStr('Fragmentshader.glsl')]);<br />
Shader.UseProgram;</syntaxhighlight><br />
<br><br><br />
<br />
==Vertex-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten<br />
<br />
void main(void)<br />
{<br />
gl_Position = vec4(inPos, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Geometrie-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
#define distance 0.5<br />
<br />
layout(triangles) in;<br />
layout(triangle_strip, max_vertices = 9) out;<br />
<br />
out vec3 Color; // Farb-Ausgabe für den Fragment-Shader <br />
<br />
void main(void)<br />
{<br />
<br />
// Linke Meshes<br />
for(int i = 0; i < gl_in.length(); i++)<br />
{<br />
gl_Position = gl_in[i].gl_Position + vec4(-distance, 0.0, 0.0, 0.0); // nach Links verschieben<br />
Color = vec3(1.0, 0.0, 0.0); // Links Rot<br />
EmitVertex();<br />
}<br />
EndPrimitive();<br />
<br />
<br />
// Rechte Meshes<br />
for(int i = 0; i < gl_in.length(); i++)<br />
{<br />
gl_Position = gl_in[i].gl_Position + vec4(distance, 0.0, 0.0, 0.0); // nach Rechts verschieben<br />
Color = vec3(0.0, 1.0, 0.0); // Rechts Grün<br />
EmitVertex();<br />
}<br />
EndPrimitive();<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Fragment-Shader==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
in vec3 Color; // Farbe vom Geometrie-Shader.<br />
out vec4 outColor; // Ausgegebene Farbe.<br />
<br />
void main(void)<br />
{<br />
outColor = vec4(Color, 0.1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Shader_-_Uniform_Variablen&diff=27041Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen2019-12-02T09:45:11Z<p>I0n0s: /* Einleitung */</p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Uniform Variablen.png|200px]]<br><br><br />
=Shader - Uniform Variablen =<br />
== Einleitung ==<br />
Hier wird die Farbe des Meshes über eine Unifom-Variable an den Shader übergeben, somit kann die Farbe zur Laufzeit geändert werden.<br><br />
Unifom-Variablen dienen dazu, um Parameter den Shader-Objecte zu übergeben. Meistens sind dies Matrizen, oder wie hier im Beispiel die Farben.<br><br />
Oder auch Beleuchtung-Parameter, zB. die Position des Lichtes.<br><br />
<br><br><br />
Deklaration der ID, welche auf die Unifom-Variable im Shader zeigt, und die Variable, welche die Farbe für den Vektor enthält.<br><br />
Da man die Farbe als Vektor übergibt, habe ich dafür den Typ '''TVertex3f''' gewählt. Seine Komponenten beschreiben den Rot-, Grün- und Blauanteil der Farbe.<br><br />
<syntaxhighlight lang="pascal">var<br />
Color_ID: GLint; // ID<br />
MyColor: TVertex3f; // Farbe</syntaxhighlight><br />
Dieser Code wurde um eine Zeile '''UniformLocation''' erweitert.<br><br />
Diese ermittelt die ID, wo sich '''Color''' im Shader befindet.<br><br />
<br><br />
Vor dem Ermitteln muss mit '''UseProgram''' der Shader aktviert werden, von dem man lesen will.<br><br />
Im Hintergrund wird dabei '''glGetUniformLocation(ProgrammID,...''' aufgerufen.<br><br />
Der Vektor von MyColor ist in RGB (Rot, Grün, Blau).<br><br />
<br><br />
Der String in '''UniformLocation''' muss identisch mit dem Namen der Uniform-Variable im Shader sein. '''Wichtig:''' Es muss auf Gross- und Kleinschreibung geachtet werden.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;<br />
begin<br />
Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Fragmentshader.glsl')]);<br />
Shader.UseProgram;<br />
Color_ID := Shader.UniformLocation('Color'); // Ermittelt die ID von "Color".<br />
// MyColor Blau zuweisen.<br />
MyColor[0] := 0.0;<br />
MyColor[1] := 0.0;<br />
MyColor[2] := 1.0;</syntaxhighlight><br />
Hier wird die Uniform-Variable übergeben. Für diese vec3-Variable gibt es zwei Möglichkeiten.<br><br />
Mit '''glUniform3fv...''' kann man sie als ganzen Vektor übergeben.<br><br />
Mit '''glUniform3f(...''' kann man die Komponenten der Farben auch einzeln übergeben.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);<br />
begin<br />
glClear(GL_COLOR_BUFFER_BIT);<br />
Shader.UseProgram;<br />
<br />
// Zeichne Dreieck<br />
glUniform3fv(Color_ID, 1, @MyColor); // Als Vektor<br />
glBindVertexArray(VBTriangle.VAO);<br />
glDrawArrays(GL_TRIANGLES, 0, Length(Triangle) * 3);<br />
<br />
// Zeichne Quadrat<br />
glUniform3f(Color_ID, 1.0, 0.0, 0.0); // Einzel<br />
glBindVertexArray(VBQuad.VAO);<br />
glDrawArrays(GL_TRIANGLES, 0, Length(Quad) * 3);<br />
<br />
ogc.SwapBuffers;<br />
end;</syntaxhighlight><br />
Folgende Prozedur weist dem Vektor <b<MyColor''' eine andere Farbe zu.<br><br />
Dafür wird ein einfaches Menü verwendet.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.MenuItemClick(Sender: TObject);<br />
begin<br />
case TMainMenu(Sender).Tag of<br />
0: begin // Rot<br />
MyColor[0] := 1.0;<br />
MyColor[1] := 0.0;<br />
MyColor[2] := 0.0;<br />
end;<br />
1: begin // Grün<br />
MyColor[0] := 0.0;<br />
MyColor[1] := 1.0;<br />
MyColor[2] := 0.0;<br />
end;<br />
2: begin // Blau<br />
MyColor[0] := 0.0;<br />
MyColor[1] := 0.0;<br />
MyColor[2] := 1.0;<br />
end;<br />
end;<br />
ogc.Invalidate; // Manuelle Aufruf von DrawScene.<br />
end;</syntaxhighlight><br />
<br><br><br />
<br />
==Vertex-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten<br />
<br />
void main(void)<br />
{<br />
gl_Position = vec4(inPos, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Fragment-Shader:==<br />
<br><br />
Hier ist die Uniform-Variable '''Color''' hinzugekommen.<br><br />
Diese habe ich nur im Fragment-Shader deklariert, da diese nur hier gebraucht wird.<br><br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
uniform vec3 Color; // Farbe von Uniform<br />
out vec4 outColor; // ausgegebene Farbe<br />
<br />
void main(void)<br />
{<br />
outColor = vec4(Color, 1.0); // Das 1.0 ist der Alpha-Kanal, hat hier keine Bedeutung.<br />
}<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Shader_-_Einfachster_Shader&diff=27040Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader2019-12-02T09:42:52Z<p>I0n0s: /* Einleitung */</p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|200px]]<br><br><br />
=Shader - Einfachster Shader =<br />
== Einleitung ==<br />
Hier wird ein sehr einfacher Shader geladen, welcher nichts anderes macht, als die Dreiecke rot darzustellen.<br><br />
<br><br><br />
Hier wird noch ein Objekt der Klasse TShader deklariert.<br><br />
<syntaxhighlight lang="pascal">type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
procedure FormCreate(Sender: TObject);<br />
procedure FormDestroy(Sender: TObject);<br />
private<br />
ogc: TContext;<br />
Shader: TShader; // Shader-Object</syntaxhighlight><br />
Dieser Code wurde um 2 Zeilen erweitert.<br><br />
<br><br />
In der ersten Zeile wird der Shader in die Grafikkarte geladen.<br><br />
Da die Shader-Objecte als Text-Dateien vorliegen, wird hier '''FileToStr(Datei)''' verwendet.<br><br />
Die zweite Zeile aktiviert den Shader.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;<br />
begin<br />
Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Fragmentshader.glsl')]);<br />
Shader.UseProgram;</syntaxhighlight><br />
Beim Zeichnen muss man auch mit '''Shader[x].UseProgram(...''' den Shader wählen, wenn man mehr als einen Shader verwendet.<br><br />
In der Shader-Klasse steht nichts anderes als'''glUseProgram(ShaderID);''' .<br><br />
Bei diesem Mini-Code mit nur einem Shader könnte dies weggelassen werden.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);<br />
begin<br />
glClear(GL_COLOR_BUFFER_BIT);<br />
<br />
Shader.UseProgram;</syntaxhighlight><br />
Am Ende werden mit '''Shader.Free''' die Shader in der Grafikkarte wieder freigeben.<br><br />
In diesem Destruktor steht '''glDeleteShader(ShaderID);'''<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
Shader.Free;</syntaxhighlight><br />
<br><br><br />
Die Kommentare im Shader werden auch dem der Grafik-Teiber übergeben, aber dieser ingnoriert sie dann.<br><br />
Wer Shader möglichst schnell laden möchte, sollte die Kommentare im Vorfeld entfernen. Auch jede Leerzeile und jede Einrückung bremst ein wenig ab.<br><br />
Auf die später Zeichengeschwindigkeit hat dies aber keinen Einfluss.<br><br />
Aber hier im Tutorial wird voll auf solche Optimierungen verzichtet, da wir übersichtlichen Shader-Code sehen wollen.<br><br />
<br><br><br />
<br />
==Vertex-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten<br />
<br />
void main(void)<br />
{<br />
gl_Position = vec4(inPos, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Fragment-Shader==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
out vec4 outColor; // ausgegebene Farbe<br />
<br />
void main(void)<br />
{<br />
outColor = vec4(1.0, 0.0, 0.0, 1.0); // Die Ausgabe ist immer Rot<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
So könnte ein optimierter Shader-Code aussehen, dafür ist er aber sehr schlecht leserlich.<br><br />
==Vertex-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
layout(location=10)in vec3 inPos;<br />
void main(void){gl_Position=vec4(inPos, 1.0);}<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Shader_-_Einfachster_Shader&diff=27039Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader2019-12-02T09:42:25Z<p>I0n0s: /* Einleitung */</p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png|200px]]<br><br><br />
=Shader - Einfachster Shader =<br />
== Einleitung ==<br />
Hier wird ein sehr einfacher Shader geladen, welcher nichts anderes macht, als die Dreiecke rot darzustellen.<br><br />
<br><br><br />
Hier wird noch ein Objekt der Klasse TShader deklariert.<br><br />
<syntaxhighlight lang="pascal">type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
procedure FormCreate(Sender: TObject);<br />
procedure FormDestroy(Sender: TObject);<br />
private<br />
ogc: TContext;<br />
Shader: TShader; // Shader-Object</syntaxhighlight><br />
Dieser Code wurde um 2 Zeilen erweitert.<br><br />
<br><br />
In der ersten Zeile wird der Shader in die Grafikkarte geladen.<br><br />
Da die Shader-Objecte als Text-Dateien vorliegen, wird hier '''FileToStr(Datei)''' verwendet.<br><br />
Die zweite Zeile aktiviert den Shader.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;<br />
begin<br />
Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Fragmentshader.glsl')]);<br />
Shader.UseProgram;</syntaxhighlight><br />
Beim Zeichnen muss man auch mit '''Shader[x].UseProgram(...''' den Shader wählen, wenn man mehr als einen Shader verwendet.<br><br />
In der Shader-Klasse steht nichts anderes als'''glUseProgram(ShaderID);''' .<br><br />
Bei diesem Mini-Code mit nur einem Shader könnte dies weggelassen werden.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);<br />
begin<br />
glClear(GL_COLOR_BUFFER_BIT);<br />
<br />
Shader.UseProgram;</syntaxhighlight><br />
Am Ende werden mit '''Shader.Free''' die Shader in der Grafikkarte wieder freigeben.<br><br />
In diesem Destruktor steht '''glDeleteShader(ShaderID);'''<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
Shader.Free;</syntaxhighlight><br />
<br><br><br />
Die Kommentare im Shader werden auch dem der Grafik-Teiber übergeben, aber dieser ingnoriert sie dann.<br><br />
Wer Shader möglichst schnell laden möchte, sollte die Kommentare im Vorfeld entfernen. Auch jede Leerzeile und jede Einrückung bremsen ein wenig ab.<br><br />
Auf die später Zeichengeschwindigkeit hat dies aber keinen Einfluss.<br><br />
Aber hier im Tutorial wird voll auf solche Optimierungen verzichtet, da wir übersichtlichen Shader-Code sehen wollen.<br><br />
<br><br><br />
<br />
==Vertex-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten<br />
<br />
void main(void)<br />
{<br />
gl_Position = vec4(inPos, 1.0);<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
==Fragment-Shader==<br />
<syntaxhighlight lang="glsl">#version 330<br />
<br />
out vec4 outColor; // ausgegebene Farbe<br />
<br />
void main(void)<br />
{<br />
outColor = vec4(1.0, 0.0, 0.0, 1.0); // Die Ausgabe ist immer Rot<br />
}<br />
</syntaxhighlight><br />
<br><br><br />
So könnte ein optimierter Shader-Code aussehen, dafür ist er aber sehr schlecht leserlich.<br><br />
==Vertex-Shader:==<br />
<syntaxhighlight lang="glsl">#version 330<br />
layout(location=10)in vec3 inPos;<br />
void main(void){gl_Position=vec4(inPos, 1.0);}<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Einrichten_und_Einstieg_-_VAO_-_Daten_laden&diff=27038Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden2019-12-02T09:38:36Z<p>I0n0s: /* Einrichten und Einstieg - VAO - Daten laden */</p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - VAO - Daten laden.png|200px]]<br><br><br />
=Einrichten und Einstieg - VAO - Daten laden =<br />
== Einleitung ==<br />
Hier werden zum ersten Mal Vertex-Daten ins VRAM geladen.<br><br />
'''Hinweis:''' Je nach Grafiktreiber kann es sein, dass man keine Ausgabe sieht, weil noch kein Shader geladen ist. Mehr dazu im nächsten Tutorial.<br><br />
Mit dem original NVidia- und Intel-Treiber sollten die Mesh unter Linux und Windows sichtbar sein.<br><br />
Mit dem Mesa-Treiber unter Linux mit einer NVidia-Karte ist nichts sichtbar.<br><br />
<br><br><br />
Typen-Deklaration für die Face-Daten.<br><br />
<syntaxhighlight lang="pascal">type<br />
TVertex3f = array[0..2] of GLfloat;<br />
TFace = array[0..2] of TVertex3f;</syntaxhighlight><br />
Koordinaten für das Mesh, hier ein Dreieck und ein Quadrat, welches wir später in das VRAM (Video-Ram) rendern.<br><br />
<syntaxhighlight lang="pascal">const<br />
Triangle: array[0..0] of TFace =<br />
(((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0)));<br />
Quad: array[0..1] of TFace =<br />
(((-0.2, -0.6, 0.0), (-0.2, -0.1, 0.0), (0.2, -0.1, 0.0)),<br />
((-0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (0.2, -0.6, 0.0)));</syntaxhighlight><br />
Für den Contexterzeugung und sonstige OpenGL-Inizialisationen, übernimmt der grösste Teil, die Klasse '''TContext''', der Unit '''oglContext'''.<br><br />
Anstelle von '''Self''', kann auch ein anderes '''TWinControl''' angegeben werden, zB. ein '''TPanel'''.<br><br />
<br><br />
Am Ende müssen noch diese beiden Prozeduren aufgerufen werden, welche die Puffer für die Mesh erzeugen und die Vertexkoordinaten in den Puffer laden.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
ogc := TContext.Create(Self); // Den Context erzeugen und OpenGL inizialisieren.<br />
ogc.OnPaint := @ogcDrawScene; // OnPaint-Ereigniss von dem Contextfenster.<br />
<br />
CreateScene; // Puffer anlegen.<br />
InitScene; // Vertex-Daten in den Buffer schreiben.<br />
end;</syntaxhighlight><br />
Buffer für Vertex-Daten anlegen.<br><br />
<br><br />
Mit '''glGenVertexArrays(...''' wird ein '''Vertex Array Object''' für jedes Mesh erzeugt.<br><br />
Mit '''glGenBuffers(...''' wird ein '''Vertex Buffer Object''' für die Vertex-Daten des Meshes erzeugt.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;<br />
begin<br />
glGenVertexArrays(1, @VBTriangle.VAO);<br />
glGenVertexArrays(1, @VBQuad.VAO);<br />
<br />
glGenBuffers(1, @VBTriangle.VBO);<br />
glGenBuffers(1, @VBQuad.VBO);<br />
end;</syntaxhighlight><br />
Die folgenden Anweisungen laden die Vertex-Daten in das VRAM.<br><br />
<br><br />
Mit '''glBindVertexArray(...''' wird das gewünschte Mesh gebunden, so das man mit '''glBufferData(...''' die Vertex-Daten in das VRAM schreiben kann.<br><br />
Mit '''glEnableVertexAttribArray(...''' gibt man an, welches Layout man im Shader will.<br><br />
Mit '''glVertexAttribPointer(...''' gibt man an, in welchem Format man die Vertex-Daten übergeben hat.<br><br />
Der erste Parameter ('''Index''') muss mit den Wert bei '''location''' im Shader übereinstimmen, dies ist momentan aber nicht relevant, da (noch) gar kein Shader geladen ist.<br><br />
<br><br />
'''InitScene''' kann zur Laufzeit mit anderen Daten geladen werden.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.InitScene;<br />
begin<br />
glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe<br />
<br />
// Daten für das Dreieck<br />
glBindVertexArray(VBTriangle.VAO);<br />
glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);<br />
glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);<br />
glEnableVertexAttribArray(0);<br />
glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);<br />
<br />
// Daten für das Quadrat<br />
glBindVertexArray(VBQuad.VAO);<br />
glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO);<br />
glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);<br />
glEnableVertexAttribArray(0);<br />
glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);<br />
end;</syntaxhighlight><br />
Jetzt wird das gerenderte Objekt im VRAM auf dem Bildschirm ausgegeben.<br><br />
<br><br />
Da kommt ein grosser Vorteil von OpenGL 3.3 zu Geltung.<br><br />
<br><br />
Man muss nur noch mit '''glBindVertexArray(...''' das Mesh wählen, das man ausgeben will.<br><br />
Gezeichnet wird dann mit '''glDrawArrays(...''', meistens werden mit '''GL_TRIANGLES''' Dreiecke ausgegeben.<br><br />
Quadrate und Polygone gehen NICHT mehr, so wie man es noch mit '''glBegin(...''' konnte !<br><br />
<br><br />
Shapes, welche funktionieren:<br><br />
* GL_POINTS<br><br />
* GL_LINES<br><br />
* GL_LINE_STRIP<br><br />
* GL_LINE_LOOP<br><br />
* GL_TRIANGLES<br><br />
* GL_TRIANGLE_STRIP<br><br />
* GL_TRIANGLE_FAN<br><br />
<br><br />
Da gibt es noch Spezial-Versionen, diese sind aber nur mit einem Geometrie-Shader sinnvoll.<br><br />
Zu den Geometrie-Shadern komme ich später.<br><br />
<br><br />
* GL_LINES_ADJACENCY<br><br />
* GL_LINE_STRIP_ADJACENCY<br><br />
* GL_TRIANGLES_ADJACENCY<br><br />
* GL_TRIANGLE_STRIP_ADJACENCY<br><br />
<br><br />
Zum Schluss muss noch der Frame-Puffer auf den Bildschirm kopiert werden.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);<br />
begin<br />
glClear(GL_COLOR_BUFFER_BIT);<br />
<br />
// Zeichne Dreieck<br />
glBindVertexArray(VBTriangle.VAO);<br />
glDrawArrays(GL_TRIANGLES, 0, Length(Triangle) * 3);<br />
<br />
// Zeichne Quadrat<br />
glBindVertexArray(VBQuad.VAO);<br />
glDrawArrays(GL_TRIANGLES, 0, Length(Quad) * 3);<br />
<br />
ogc.SwapBuffers;<br />
end;</syntaxhighlight><br />
Am Ende muss man die angelegten '''Vertex Array Objects''' und '''Vertex Buffer Objects''' wieder freigeben.<br><br />
<syntaxhighlight lang="pascal">procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
glDeleteVertexArrays(1, @VBTriangle.VAO);<br />
glDeleteVertexArrays(1, @VBQuad.VAO);<br />
<br />
glDeleteBuffers(1, @VBTriangle.VBO);<br />
glDeleteBuffers(1, @VBQuad.VBO);<br />
end;<br />
</syntaxhighlight><br />
<br />
<br>Autor: [[Mathias]]<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Lazarus_-_OpenGL_3.3_Tutorial_-_Einrichten_und_Einstieg_-_Lazarus_fuer_OpenGL_einrichten&diff=27037Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten2019-12-02T09:34:10Z<p>I0n0s: /* Einleitung */</p>
<hr />
<div>[[Image:Lazarus - OpenGL 3.3 Tutorial - Einrichten und Einstieg - Lazarus fuer OpenGL einrichten.png|200px]]<br><br><br />
=Einrichten und Einstieg - Lazarus fuer OpenGL einrichten =<br />
== Einleitung ==<br />
'''Vorwort:'''<br><br><br />
'''OpenGL 3.3''' scheint auf den ersten Blick viel komplizierter als das alte OpenGL.<br><br />
Man wird von Anfang an mit vielem Neuen konfrontiert.<br><br />
Früher konnte man einfach<br><br />
<syntaxhighlight lang="pascal">glBegin(...<br />
..<br />
glEnd</syntaxhighlight><br />
und fertig.<br><br />
Jetzt muss man sich mit Shadern und Vertex-Buffern auseinandersetzen.<br><br />
Auch muss man sich selbst um die Matrizen und die Beleuchtung kümmern.<br><br />
<br><br />
Aber dafür ist die Belohnung sehr gross, man ist sehr flexibel und man kann (fast) alles machen, was Effekte anbelangt.<br><br />
Früher war man einfach auf die Fixed-Function-Pipeline der Grafikkarte angewiesen und jede war etwas anders.<br><br />
Wenn eine Karte nur zwei Lichter hatte, dann hatte sie nur zwei.<br><br />
Da man es aber jetzt selbst macht, kann man fast beliebig viel machen, egal ob diffus, etc.<br><br />
<br><br />
Ich hoffe, mit diesem Tutorial wird der eine oder andere für OpenGL 3.3 begeistert werden.<br><br />
Wenn man diesen Einstieg mal geschafft hat, wird man auch mit den höheren Versionen klarkommen.<br><br />
<br><br />
Auf der Hauptseite werde ich noch ein Package veröffentlichen, welches einem den Einstieg sehr einfach macht.<br><br />
Dort sind fertige Shader und Units für Matrizen, Texturen, Vertex-Puffer, etc. vorhanden.<br><br />
<br><br><br />
'''Voraussetzung:'''<br><br><br />
* FPC 3.0.2 oder höher.<br><br />
* Lazarus 1.6.4 oder höher.<br><br />
* Mindestens OpenGL 3.3 fähige Grafikkarte.<br><br />
* Grundkenntnisse mit FPC und Lazarus.<br><br />
* Grundkenntnisse C/C++ für die Shader-Programmierung.<br><br />
<br><br />
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.<br><br />
Dies ist gähnend langsam, aber für die ersten Gehversuche im Tutorial reicht dies. ( Getestet mit Linux Mint 64Bit 18.x )<br><br />
<br><br />
'''Installation:'''<br><br><br />
FPC und Lazarus installieren.<br><br />
<br><br />
Bei Lazarus muss unter <i>'''"Package --> Installierte Packages einrichten... --> Verfügbar für Installation"'''</i>, zuerst das Package <i>'''LazOpenGLContext x.x.x'''</i> installiert werden.<br><br />
<br><br />
Das Tutorial sollte unter Linux und Windows laufen, auf dem Mac habe ich es nicht probiert.<br><br />
<br><br />
Wenn Lazarus bei der Neukompilierung unter Linux Probleme macht, könnte Folgendes das Problem sein:<br><br />
Unter auf Debian oder Ubuntu basierenden Linux-Distributionen muss evtl. noch Folgendes installiert werden.<br><br />
<syntaxhighlight lang="pascal">sudo apt-get install freeglut3-dev</syntaxhighlight><br />
Somit sollten alle Beispiele kompilierbar sein.<br><br />
<br><br />
Die Sourcen zum Tutorial, kann man alle auf der Hauptseite herunterladen.<br><br />
Es ist eine Zip, welche auch alle Bibliotheken (Units) enthält.<br><br />
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,<br><br />
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.<br><br />
Für die ogl-Package ist noch Package BRGABitmap erforderlich, diese lässt sich bequem über <i>'''"Package --> Online-Package-Manger --> BGRABitmap"'''</i> installieren.<br><br />
<br><br />
Die wichtigsten Funktionen der ogl-Package:<br><br />
* '''dglOpenGL''': Der Header für die OpenGL-Funktionen.<br><br />
* '''oglContex''': Erzeugt einen Zeichencontext, ohne diesem ist keine OpenGL-Ausgabe möglich.<br><br />
* '''oglShader''': Enthält Funktionen um den Shader-Code in die Grafikkarte zu laden.<br><br />
* '''oglVertex''': Verschiedene Vertex-Deklarationen und Funktionen/Berechnungen.<br><br />
* '''oglMatrix''': Verschiedene Matrix-Deklarationen und Funktionen/Berechnungen.<br><br />
* '''oglTextur''': Funktionen für das Hochladen von Texturen.<br><br />
<br><br />
<br><br />
Es sind viele OpenGL spezifische Sachen ausserhalb von Form deklariert, bei einer sauberen objektorientierten Programmierung ist dies nicht üblich.<br><br />
Hier wurde es einfachheitshalber der Übersichtlichkeit gemacht.<br><br />
<br><br />
Wen man weis, wie man mit '''Delphi''' einen OpenGL-Context erzeugt, sollte dieses Tutorial auch mit Delphi funktionieren.<br><br />
<br><br />
Wenn Fehler gefunden werden, dann bitte hier melden:<br><br />
* [https://delphigl.com/forum/viewtopic.php?f=14&t=11566 DGL-Forum]<br />
oder<br><br />
* [http://www.lazarusforum.de/viewtopic.php?f=29&t=11373&hilit=opengl+tutorial Lazarus-Forum]<br />
<br />
<br>Autor: [[Mathias]]<br />
<br />
== Siehe auch ==<br />
* Übersichtseite [[Lazarus - OpenGL 3.3 Tutorial]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2019/Organisation&diff=27031DGL Treffen/2019/Organisation2019-09-08T21:04:18Z<p>I0n0s: /* Fahrplan */</p>
<hr />
<div><br />
= Orga =<br />
<br />
== Raumkonstellation ==<br />
<br />
# Doppel Bett<br />
#* Thomas<br />
#* Nini<br />
# Einzelbett<br />
#* i0n0s<br />
# Einzelbett<br />
#* Flash<br />
# Einzelbett<br />
#* Frase<br />
# Einzelbett<br />
#* Phobeus<br />
# Einzelbett<br />
#* Pixelschubser<br />
# Einzelbett<br />
#* End<br />
<br />
==Fahrplan==<br />
<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash <br />
|PKW ab Berlin? <br />
|(Frase + 1 Platz im PKW frei.)<br />
|-<br />
|i0n0s<br />
|PKW ab Gießen über Berlin<br />
|(belegt)<br />
|-<br />
|Phobeus<br />
|PKW ab Hamburg (ARG Nord)<br />
| <br />
|-<br />
|Pixelschubser<br />
| ?<br />
|<br />
|-<br />
|End<br />
| Flo?<br />
|<br />
|-<br />
|Frase<br />
|Nürnberg -> Berlin, dann via Flash<br />
|Zustieg bei Flash im Berliner Norden<br />
|-<br />
|Thomas & Nini<br />
|Via i0n0s<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
= Essen =<br />
<br />
== Hauptgerichte: ==<br />
<br />
https://www.chefkoch.de/rezepte/3216831478679797/Kartoffelsuppe-mit-Gemueseeinlage.html<br />
<br />
https://www.chefkoch.de/rezepte/272411104287283/Lasagne-mit-buntem-Gemuese.html<br />
<br />
https://www.chefkoch.de/rezepte/148291065256295/Zwiebelsuppe-franzoesische-Art.html (mit Gemüsebrüge statt Fleischbrühe)<br />
<br />
https://www.chefkoch.de/rezepte/2922871444587593/Vegetarisches-Thai-Curry-mit-Kokosmilch-fuer-Geniesser.html<br />
<br />
https://www.chefkoch.de/rezepte/1350991210704/Tortellini-aus-dem-Ofen.html (geht natürlich auch ohne den Schinken)<br />
<br />
https://www.chefkoch.de/rezepte/3227981480245936/Spaetzle-mit-Champignon-Rahm-Sauce.html<br />
<br />
https://www.chefkoch.de/rezepte/148978964319/Tomatensuppe.html (schmeckt auch super wenn man noch Gnocchi reinmacht)<br />
<br />
https://www.chefkoch.de/rezepte/2322571370268259/Asiatische-Mie-Nudeln-mit-Gemuese-gebraten.html<br />
<br />
https://www.chefkoch.de/rezepte/595441159189225/Chili-sin-Carne.html<br />
<br />
https://www.rezeptwelt.de/hauptgerichte-mit-gemuese-rezepte/pasta-in-paprika-cheddar-sosse/hhiayg61-e3c2a-207386-cfcd2-pcp02m7v<br />
<br />
https://www.chefkoch.de/rezepte/389651126291925/Quattro-Formaggi.html (mit irgendeiner Pasta)<br />
<br />
https://www.chefkoch.de/rezepte/193101081875403/Pilzragout-mit-Semmelknoedel.html (geht natürlich auch ohne Bacon)<br />
<br />
https://www.chefkoch.de/rezepte/1847311299234839/Killer-Mac-and-Cheese.html<br />
<br />
== Snacks/Salate/Beilagen: ==<br />
<br />
https://www.chefkoch.de/rezepte/3519451524912866/Vegetarischer-Taco-Salat.html<br />
<br />
https://www.chefkoch.de/rezepte/1349881239714469/Melonen-Rucola-Salat-mit-Feta.html<br />
<br />
https://www.chefkoch.de/rezepte/543061151735261/Nudelsalat-mit-Joghurt-Dip.html<br />
<br />
https://www.chefkoch.de/rezepte/1819441295342197/Kartoffelsalat-mit-Avocado.html<br />
<br />
https://www.chefkoch.de/rezepte/2102521339361536/Deftige-Muffins.html<br />
<br />
https://www.chefkoch.de/rezepte/1395581244471444/Kaesestangen-aus-Blaetterteig.html<br />
<br />
https://www.chefkoch.de/rezepte/998571205222584/Kraeuterbutter-Zwiebel-Muffins.html<br />
<br />
https://www.chefkoch.de/rezepte/107771045311561/Leckere-gefuellte-Kartoffeln.html<br />
<br />
https://www.chefkoch.de/rezepte/682471170749212/Mini-Pizzaschnecken.html (geht natürlich auch veggie nur mit Gemüse)<br />
<br />
https://www.chefkoch.de/rezepte/2007071325278890/Vegane-Gemuesefrikadellen.html<br />
<br />
https://www.rezeptwelt.de/backen-herzhaft-rezepte/zucchini-feta-muffins/4e7avmvh-dc621-905827-cfcd2-45ntc3ci<br />
<br />
https://www.rezeptwelt.de/backen-herzhaft-rezepte/pizza-ring/nbm69krr-5f3da-578240-cfcd2-twmtc6jp (geht natürlich auch veggie)<br />
<br />
https://www.rezeptwelt.de/grundrezepte-rezepte/tomaten-knobi-falte/pq08pv7g-4312d-461293-cfcd2-lej25uez<br />
<br />
https://www.rezeptwelt.de/hauptgerichte-mit-gemuese-rezepte/zucchini-puffer-glutenfrei-weizenfrei/adx81qya-60b88-327159-cfcd2-9yn0ptkw<br />
<br />
https://www.rezeptwelt.de/backen-herzhaft-rezepte/mini-kaesehoernchen-suchtfaktor/g8uam4h2-51fe6-174536-cfcd2-zujmpnp4<br />
<br />
== Coole Projekte/Spielzeug im Schlepptau ==<br />
<br />
# VR ?<br />
# QAMFIO (Quests, Achievements, Meta, Friends, IO) zusammen gehackt mit AWS Cognito, LDAP, NodeJS(typescript), neDB, Unity 3D, WebSocket</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2017/Organisation&diff=26379DGL Treffen/2017/Organisation2017-06-01T17:09:01Z<p>I0n0s: /* Was gibts zu essen? */</p>
<hr />
<div>Wie bereits im Forum angedroht, planen wir momentan ein DGL-Treffen in Schweden im Juli 2017. Hierfür geht es an einen See in Ryd.<br />
<br />
;Thema: "Going Wild" ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&t=11569 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
S25105<br />
Södra Rimshult 2,<br />
Ryd<br />
<br />
[http://www.novasol.de/p/S25105?PE=8&K=0&SD=01-07-2017&DUR=14&ED=15-07-2017&wt.si_n=NormalSearchBookingFlow#overview-tab Novasol Link]<br />
<br />
Latitude:56.41619, Longitude:14.7563549.<br />
<br />
<br />
==Wann?==<br />
*Anreise: Sa. 01.07.2017<br />
*Abreise: Sa. 15.07.2017<br />
<br />
==Was kostet das?==<br />
Ein Preis von 500€-700€ wird angestrebt. Letztendlich hängt der Preis davon ab, wieviel verzerrt und unternommen wird. Anreise erfolgt gemeinsam über Gruppen. Die Anreise bis zu einem gemeinsamen Treffpunkt muss selbstständig organisiert werden.<br />
Die Verpflegung erfolgt üblicherweise über eine Umlage und wir holen uns gemeinsam etwas.<br />
<br />
Die Abrechnung erfolgt einige Wochen nach Ende. Wer einen längeren Zahlungshorizont braucht, sollte dies bitte vorher bei Phobeus melden.<br />
Sollte jemand aus Kostengründen nicht teilnehmen können, kann er sich per Mail an Phobeus wenden.<br />
<br />
==Wer kommt mit?==<br />
Zumindest nicht mehr, wer sich nicht bisher angemeldet hat. Es sind 8 Betten im Haus und diese sind bereits alle belegt. Bitte beim nächsten Mal rechtzeitig melden und alle mit Bedarf können mitkommen ;)<br />
<br />
ARG = Anreisegruppe ;)<br />
<br />
[[Datei:DGL_Treffen_2017_Feldkarte.jpg|200px|thumb|right|Feldkarte für die Anfahrt]]<br />
<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|PKW <br />
|(ARG Nord: 1 Plätze im PKW frei ab Hamburg.)<br />
|-<br />
|i0n0s<br />
|14<br />
|PKW <br />
|(ARG SÜD: 1 Platz im PKW frei ab Gießen.)<br />
|-<br />
|Pixelschubser<br />
|14<br />
| -<br />
|(Anreise über ARG Nord)<br />
|-<br />
|Flash<br />
|14<br />
|PKW<br />
| ARG Ost: 2-3 Plätze im Wagen (?) frei ab Chemnitz<br />
|-<br />
|TAK2004<br />
|14<br />
| -<br />
| Anreise über ARG Ost?<br />
|-<br />
|Frase<br />
|14<br />
| -<br />
| Anreise über ARG Ost<br />
|-<br />
|End<br />
|14<br />
| -<br />
| Anreise über ARG Süd oder ARG Nord<br />
|-<br />
| ''belegt''<br />
| <br />
| -<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Die Anreisedetails stehen noch nicht fest. Mögliche Anreise einen Tag vorher und Übernachtung in Hamburg bei Phobeus ist möglich. Von dort aus geht es Richtung Rostock, wo der nächste Treffpunkt für die Überfahrt mit der Fähre ist. Von da aus geht es dann mit dem Auto bis zum Ziel<br />
<br />
==Was muss man persönlich mitbringen?==<br />
* ggf. Reisekasse für eigene Einkäufe (Schweden hat keinen Euro!)<br />
* Bettwäsche und Handtücher<br />
* Wechsel-Kleidung<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs- und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel <br />
* Badesachen (inkl. Sonnencreme, Mückencreme)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.)<br />
<br />
==Was müssen wir gemeinsammitbringen?==<br />
* Klopapier<br />
* Netzwerkkabel (!!!!)<br />
* Steckdosenleisten (!!!!!)<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Elektronik (1 Router, Laptop, Netzwerkkabel, Fotoapparat)<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Spiel und Spannung<br />
*Eine große weiße Leinwand zum bewundern (?)<br />
*Ausgebildete Barkeeper<br />
*Baden und Grillen<br />
*Mini-LAN<br />
*Virtuelle Realitäten (?)<br />
*Live Projektvorstellung<br />
*Wildnis pur! (To be discussed, ob draußen oder drinnen)<br />
<br />
==Was gibts zu essen?==<br />
<br />
Wir kochen und essen gemeinschaftlich. So kommt jeder an die Reihe und sollte entsprechend etwas parat haben. Jeder Koch verfügt über eine beliebige Anzahl an Hilfssklaven. Urbanen Legenden zufolge sollen schlechte Köche früher häufiger mal über Bord gegangen sein. Zudem verhindern satte Beuche Aufstände bereits im Keim!<br />
<br />
Hauptmahlzeiten<br />
{|{{Prettytable_B1}}<br />
!Koch<br />
!Speise<br />
!Benötigte Zutaten<br />
|-<br />
|Flow<br />
|Köttbullar<br />
|http://www.lecker.de/schwedische-rezepte-49945.html<br />
|-<br />
|Flash<br />
|Franz. Spektorte (LowCarb/Carb)<br />
|http://www.chefkoch.de/rezepte/1635271271083105/Franzoesischer-Schinkenkuchen.html<br />
Zutaten p.P. lowCarb (Füllung only):<br />
* 150g Schinken<br />
* 150g Käse<br />
* 150ml saure Sahne<br />
* 3Eier<br />
* Salz, Pfeffer, Weißwein, Chili etc nach Geschmack<br />
|-<br />
|Alle<br />
|Grillen<br />
|Steak, Würste, Speck, Garnelen, (Lottencreme - rezept wird ermittelt)<br />
|-<br />
|Pixelschubser<br />
|Lasagne<br />
|Folgt<br />
|-<br />
|Thomas<br />
|Spinat(selbstgemacht), Kartoffeln und Ei<br />
|REZEPT/ZUTATEN<br />
|-<br />
|Thomas<br />
|Schupfnudeln , wurst käse überbacken<br />
|Rezept<br />
|-<br />
|i0n0s<br />
|Knödel mit Sauerkraut<br />
|Mehl, Hefe, Sauerkraut, deftiges Fleisch<br />
|-<br />
|i0n0s<br />
|Zucchinipuffer<br />
|Zucchini, Zwiebel, Dill, Eier, Mehl, Apfelmuß<br />
|-<br />
|Pixelschubser<br />
|Gemüsepfanne<br />
|Champignons, Bambussprossen, Garnelen, Gewürze, Oel, Paprika, Putenbrust, Mais, Zucchini, Zwiebel<br />
|-<br />
|i0n0s<br />
|Borschtsch<br />
|http://www.essen-und-trinken.de/rezepte/38531-rzpt-russischer-borschtsch<br />
|-<br />
|WER<br />
|WAS<br />
|REZEPT/ZUTATEN<br />
|}<br />
<br />
Zwischenmahlzeiten / Snacks<br />
{|{{Prettytable_B1}}<br />
!Koch<br />
!Speise<br />
!Benötigte Zutaten<br />
|-<br />
|Flow<br />
|Surströmming<br />
|Surströmming<br />
|-<br />
|Flow<br />
|Strammer Max<br />
|}<br />
<br />
==Einkaufsliste==<br />
<br />
Alt aus Dänemark und nur als Orientierung drin:<br />
----Frühstück-----<br />
*100 Eier<br />
*3kg Bacon<br />
*14kg Müsli<br />
*40l H-Milch<br />
*100 Aufback-Brötchen (ohne Kühlung!)<br />
*8 Aufback-Baguettes (ohne Kühlung!)<br />
*8kg Käse & Wurst<br />
*8 Marmeladen<br />
*4 Butter<br />
*60l Orangensaft<br />
*20 Packungen Quark<br />
*300gr Speck<br />
----Obst------<br />
*10kg Äpfel<br />
*2kg Birnen<br />
*2kg Pfirsiche,<br />
*2 große Wassermelonen<br />
*4 Honigmelonen (Zergeneier ^^)<br />
*2kg Kiwis<br />
*5kg Tomaten<br />
*2kg Paprika<br />
*4 Gurken<br />
*2kg Zwiebeln<br />
*2-3 Salate (Haltbarkeit :()<br />
*6kg Kartoffeln<br />
----Abgepacktes----<br />
*4 Dosen Mais<br />
*2 Dosen Thunfisch<br />
*1kg TK-Spinat<br />
*8 Pack Schafskäse<br />
*4kg Pizzakäse<br />
*2kg Gouda<br />
*5 Dosen Tomaten<br />
*5 Dosen Bohnen<br />
*3kg Mehl (550)<br />
*3 Pack Frischhefe<br />
*Rinderbrühe<br />
*3 Packungen Sauerkraut<br />
*1 Glas eingelegte Gurken<br />
----Knapperkram---<br />
*30 diverse Chipstüten<br />
*6kg Nussmischungen<br />
----Cocktails-----<br />
*1 Flasche Havana Club<br />
*2 Flaschen Wodka<br />
*4l Ananassaft<br />
*4l Grapefruitsaft<br />
*8l Marakuja Saft<br />
*Zuckersirup<br />
----Sonstiges----<br />
*Toilettenpapier (1 Großpack)<br />
*Küchenpapier<br />
*Müllbeutel >30l<br />
*Waschmittel<br />
*Backpapier<br />
*1 Pack Zucker<br />
*Salz<br />
*Körniges Salz<br />
*Pfeffer<br />
*2l Olivenöl<br />
*1l Essig<br />
*Grillkohle<br />
*Grillanzünder & Feuerzeug<br />
*Alufolie<br />
----Fleisch------<br />
*2kg Fleisch zum Grillen<br />
*2kg Kassler<br />
*1kg geräucherte Mettenden<br />
*2kg Hähnchenbrust<br />
*48 Hotdogwürstchen<br />
*24 Hotdogbrötchen<br />
*Remouladensoße<br />
*Diverse Grillsoßen<br />
*Geröstete Zwiebeln<br />
*Ketchup<br />
*Senf<br />
-----Onigiri----<br />
*Sushireis<br />
*Sushi-Essig<br />
*Nori<br />
----Ends patentierte Pfannkuchen----<br />
1x Pfannkuchen fuer alle =<br />
*10 Eier<br />
*1kg Mehl<br />
*1 Liter Milch<br />
*1 Mixer<br />
*1 bis 2kg Zucker<br />
*eine Prise Salz<br />
<br />
Wahlweise kann Mehl durch Zucker jeder Sorte oder Muesli substituiert werden</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2017/Organisation&diff=26377DGL Treffen/2017/Organisation2017-05-30T18:05:37Z<p>I0n0s: /* Was gibts zu essen? */</p>
<hr />
<div>Wie bereits im Forum angedroht, planen wir momentan ein DGL-Treffen in Schweden im Juli 2017. Hierfür geht es an einen See in Ryd.<br />
<br />
;Thema: "Going Wild" ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&t=11569 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
S25105<br />
Södra Rimshult 2,<br />
Ryd<br />
<br />
[http://www.novasol.de/p/S25105?PE=8&K=0&SD=01-07-2017&DUR=14&ED=15-07-2017&wt.si_n=NormalSearchBookingFlow#overview-tab Novasol Link]<br />
<br />
Latitude:56.41619, Longitude:14.7563549.<br />
<br />
<br />
==Wann?==<br />
*Anreise: Sa. 01.07.2017<br />
*Abreise: Sa. 15.07.2017<br />
<br />
==Was kostet das?==<br />
Ein Preis von 500€-700€ wird angestrebt. Letztendlich hängt der Preis davon ab, wieviel verzerrt und unternommen wird. Anreise erfolgt gemeinsam über Gruppen. Die Anreise bis zu einem gemeinsamen Treffpunkt muss selbstständig organisiert werden.<br />
Die Verpflegung erfolgt üblicherweise über eine Umlage und wir holen uns gemeinsam etwas.<br />
<br />
Die Abrechnung erfolgt einige Wochen nach Ende. Wer einen längeren Zahlungshorizont braucht, sollte dies bitte vorher bei Phobeus melden.<br />
Sollte jemand aus Kostengründen nicht teilnehmen können, kann er sich per Mail an Phobeus wenden.<br />
<br />
==Wer kommt mit?==<br />
Zumindest nicht mehr, wer sich nicht bisher angemeldet hat. Es sind 8 Betten im Haus und diese sind bereits alle belegt. Bitte beim nächsten Mal rechtzeitig melden und alle mit Bedarf können mitkommen ;)<br />
<br />
ARG = Anreisegruppe ;)<br />
<br />
[[Datei:DGL_Treffen_2017_Feldkarte.jpg|200px|thumb|right|Feldkarte für die Anfahrt]]<br />
<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|PKW <br />
|(ARG Nord: 1 Plätze im PKW frei ab Hamburg.)<br />
|-<br />
|i0n0s<br />
|14<br />
|PKW <br />
|(ARG SÜD: 1 Platz im PKW frei ab Gießen.)<br />
|-<br />
|Pixelschubser<br />
|14<br />
| -<br />
|(Anreise über ARG Nord)<br />
|-<br />
|Flash<br />
|14<br />
|PKW<br />
| ARG Ost: 2-3 Plätze im Wagen (?) frei ab Chemnitz<br />
|-<br />
|TAK2004<br />
|14<br />
| -<br />
| Anreise über ARG Ost?<br />
|-<br />
|Frase<br />
|14<br />
| -<br />
| Anreise über ARG Ost<br />
|-<br />
|End<br />
|14<br />
| -<br />
| Anreise über ARG Süd oder ARG Nord<br />
|-<br />
| ''belegt''<br />
| <br />
| -<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Die Anreisedetails stehen noch nicht fest. Mögliche Anreise einen Tag vorher und Übernachtung in Hamburg bei Phobeus ist möglich. Von dort aus geht es Richtung Rostock, wo der nächste Treffpunkt für die Überfahrt mit der Fähre ist. Von da aus geht es dann mit dem Auto bis zum Ziel<br />
<br />
==Was muss man persönlich mitbringen?==<br />
* ggf. Reisekasse für eigene Einkäufe (Schweden hat keinen Euro!)<br />
* Bettwäsche und Handtücher<br />
* Wechsel-Kleidung<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs- und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel <br />
* Badesachen (inkl. Sonnencreme, Mückencreme)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.)<br />
<br />
==Was müssen wir gemeinsammitbringen?==<br />
* Klopapier<br />
* Netzwerkkabel (!!!!)<br />
* Steckdosenleisten (!!!!!)<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Elektronik (1 Router, Laptop, Netzwerkkabel, Fotoapparat)<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Spiel und Spannung<br />
*Eine große weiße Leinwand zum bewundern (?)<br />
*Ausgebildete Barkeeper<br />
*Baden und Grillen<br />
*Mini-LAN<br />
*Virtuelle Realitäten (?)<br />
*Live Projektvorstellung<br />
*Wildnis pur! (To be discussed, ob draußen oder drinnen)<br />
<br />
==Was gibts zu essen?==<br />
<br />
Wir kochen und essen gemeinschaftlich. So kommt jeder an die Reihe und sollte entsprechend etwas parat haben. Jeder Koch verfügt über eine beliebige Anzahl an Hilfssklaven. Urbanen Legenden zufolge sollen schlechte Köche früher häufiger mal über Bord gegangen sein. Zudem verhindern satte Beuche Aufstände bereits im Keim!<br />
<br />
Hauptmahlzeiten<br />
{|{{Prettytable_B1}}<br />
!Koch<br />
!Speise<br />
!Benötigte Zutaten<br />
|-<br />
|Flow<br />
|Köttbullar<br />
|http://www.lecker.de/schwedische-rezepte-49945.html<br />
|-<br />
|Flash<br />
|Franz. Spektorte (LowCarb/Carb)<br />
|http://www.chefkoch.de/rezepte/1635271271083105/Franzoesischer-Schinkenkuchen.html<br />
Zutaten p.P. lowCarb (Füllung only):<br />
* 150g Schinken<br />
* 150g Käse<br />
* 150ml saure Sahne<br />
* 3Eier<br />
* Salz, Pfeffer, Weißwein, Chili etc nach Geschmack<br />
|-<br />
|Alle<br />
|Grillen<br />
|Steak, Würste, Speck, Garnelen, (Lottencreme - rezept wird ermittelt)<br />
|-<br />
|Pixelschubser<br />
|Lasagne<br />
|Folgt<br />
|-<br />
|Thomas<br />
|Spinat(selbstgemacht), Kartoffeln und Ei<br />
|REZEPT/ZUTATEN<br />
|-<br />
|Thomas<br />
|Schupfnudeln , wurst käse überbacken<br />
|Rezept<br />
|-<br />
|i0n0s<br />
|Knödel mit Sauerkraut<br />
|Mehl, Hefe, Sauerkraut, deftiges Fleisch<br />
|-<br />
|i0n0s<br />
|Zucchinipuffer<br />
|Zucchini, Zwiebel, Dill, Eier, Mehl, Apfelmuß<br />
|-<br />
|WER<br />
|WAS<br />
|REZEPT/ZUTATEN<br />
|}<br />
<br />
Zwischenmahlzeiten / Snacks<br />
{|{{Prettytable_B1}}<br />
!Koch<br />
!Speise<br />
!Benötigte Zutaten<br />
|-<br />
|Flow<br />
|Surströmming<br />
|Surströmming<br />
|-<br />
|Flow<br />
|Strammer Max<br />
|}<br />
<br />
==Einkaufsliste==<br />
<br />
Alt aus Dänemark und nur als Orientierung drin:<br />
----Frühstück-----<br />
*100 Eier<br />
*3kg Bacon<br />
*14kg Müsli<br />
*40l H-Milch<br />
*100 Aufback-Brötchen (ohne Kühlung!)<br />
*8 Aufback-Baguettes (ohne Kühlung!)<br />
*8kg Käse & Wurst<br />
*8 Marmeladen<br />
*4 Butter<br />
*60l Orangensaft<br />
*20 Packungen Quark<br />
*300gr Speck<br />
----Obst------<br />
*10kg Äpfel<br />
*2kg Birnen<br />
*2kg Pfirsiche,<br />
*2 große Wassermelonen<br />
*4 Honigmelonen (Zergeneier ^^)<br />
*2kg Kiwis<br />
*5kg Tomaten<br />
*2kg Paprika<br />
*4 Gurken<br />
*2kg Zwiebeln<br />
*2-3 Salate (Haltbarkeit :()<br />
*6kg Kartoffeln<br />
----Abgepacktes----<br />
*4 Dosen Mais<br />
*2 Dosen Thunfisch<br />
*1kg TK-Spinat<br />
*8 Pack Schafskäse<br />
*4kg Pizzakäse<br />
*2kg Gouda<br />
*5 Dosen Tomaten<br />
*5 Dosen Bohnen<br />
*3kg Mehl (550)<br />
*3 Pack Frischhefe<br />
*Rinderbrühe<br />
*3 Packungen Sauerkraut<br />
*1 Glas eingelegte Gurken<br />
----Knapperkram---<br />
*30 diverse Chipstüten<br />
*6kg Nussmischungen<br />
----Cocktails-----<br />
*1 Flasche Havana Club<br />
*2 Flaschen Wodka<br />
*4l Ananassaft<br />
*4l Grapefruitsaft<br />
*8l Marakuja Saft<br />
*Zuckersirup<br />
----Sonstiges----<br />
*Toilettenpapier (1 Großpack)<br />
*Küchenpapier<br />
*Müllbeutel >30l<br />
*Waschmittel<br />
*Backpapier<br />
*1 Pack Zucker<br />
*Salz<br />
*Körniges Salz<br />
*Pfeffer<br />
*2l Olivenöl<br />
*1l Essig<br />
*Grillkohle<br />
*Grillanzünder & Feuerzeug<br />
*Alufolie<br />
----Fleisch------<br />
*2kg Fleisch zum Grillen<br />
*2kg Kassler<br />
*1kg geräucherte Mettenden<br />
*2kg Hähnchenbrust<br />
*48 Hotdogwürstchen<br />
*24 Hotdogbrötchen<br />
*Remouladensoße<br />
*Diverse Grillsoßen<br />
*Geröstete Zwiebeln<br />
*Ketchup<br />
*Senf<br />
-----Onigiri----<br />
*Sushireis<br />
*Sushi-Essig<br />
*Nori<br />
----Ends patentierte Pfannkuchen----<br />
1x Pfannkuchen fuer alle =<br />
*10 Eier<br />
*1kg Mehl<br />
*1 Liter Milch<br />
*1 Mixer<br />
*1 bis 2kg Zucker<br />
*eine Prise Salz<br />
<br />
Wahlweise kann Mehl durch Zucker jeder Sorte oder Muesli substituiert werden</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2016/Organisation&diff=26348DGL Treffen/2016/Organisation2016-08-04T20:17:40Z<p>I0n0s: /* Einkaufsliste */</p>
<hr />
<div>Für den August 2016 planen wir wieder ein DGL Treffen. Diesmal geht es für 2 Wochen an die Küste von Dänemark.<br />
<br />
;Thema: "Nerds On Tour." ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&p=100328#p100328 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
"Haus 2": grævlingvej 12, DK-9480 Norre Rubjerg<br />
<br />
==Wann?==<br />
*Anreise: Sa. 06.08.2016<br />
*Abreise: Sa. 20.08.2016<br />
<br />
==Was kostet das?==<br />
Je besser die Auslastung des Hauses, desto besser. Die Preise werden im gewohnten Rahmen bleiben.<br />
Verpflegung und Anreise sind da aber nicht mit dabei. Die Verpflegung erfolgt üblicherweise über eine Umlage und wir holen uns gemeinsam etwas. Sollte jemand aus Kostengründen nicht teilnehmen können, kann er sich per Mail an Phobeus wenden.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Es sind insgesamt 8 Betten im Haus.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|PKW <br />
|(1,5 Plätze im PKW frei ab Hamburg.)<br />
|-<br />
|i0n0s<br />
|14<br />
|PKW <br />
|(1 Platz im PKW frei ab Gießen.)<br />
|-<br />
|Polarwolf<br />
|14<br />
|PKW<br />
|(1 Platz im PKW frei ab Hamburg.)<br />
|-<br />
|Seraliel<br />
|2.5<br />
|PKW <br />
|(1 Platz frei ab Hamburg. Am Fr.12.8)<br />
|-<br />
|Flash<br />
|14<br />
|PKW<br />
|Nimmt End ab Hannover mit und Tak ab Flensburg<br />
|-<br />
|TAK2004<br />
|14<br />
|<br />
|fährt bei Flash mit <br />
|-<br />
|Mr Frase<br />
|14<br />
|Flugzeug <br />
|Landet in Hamburg am Fr. 5. August um 22:05 und wird dann von Phobeus eingesammelt<br />
|-<br />
|Ms Frase<br />
|14<br />
|Flugzeug<br />
|Landet in Hamburg am Fr. 5. August um 22:05 und wird dann von Phobeus eingesammelt<br />
|-<br />
|End<br />
|14<br />
|<br />
|fährt bei Flash mit<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Die Anreise steht noch nicht fest. Treffpunkt wird vor Hamburg sein, dort besteht die Möglichkeit die PKWs stehen zu lassen und sich besser auf die Wagen zu verteilen. Eine Anreise zum Bahnhof HH lässt sich ebenfalls organisieren. Fahrgemeinschaften bitte so früh wie möglich bilden!<br />
<br />
==Was muss man persönlich mitbringen?==<br />
* ggf. Reisekasse für eigene Einkäufe (Dänemark hat keinen Euro!)<br />
* Bettwäsche und Handtücher<br />
* Wechsel-Kleidung<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs- und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel <br />
* Badesachen (inkl. Sonnencreme)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.)<br />
<br />
==Was müssen wir gemeinsammitbringen?==<br />
* Klopapier<br />
* Netzwerkkabel<br />
* Steckdosenleisten<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Elektronik (1 Router, Laptop, Netzwerkkabel, Fotoapparat)<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Spiel und Spannung<br />
*Eine große weiße Leinwand zum bewundern<br />
*Ausgebildete Barkeeper<br />
*Baden und Grillen<br />
*Mini-LAN<br />
*Virtuelle Realitäten<br />
*Live Projektvorstellung<br />
*DänInnen, vereinzelt SchwedInnen *hust* ;)<br />
<br />
==Was gibts zu essen?==<br />
Flow: Ich sollte fast alles zubereitet bekommen, was aus dem Wasser kommt. Der Kauf ist üblicherweise direkt vom Kutter, die aber unregelmäßig rein kommen. Ein entsprechendes Backup sollte existieren.<br />
<br />
{|{{Prettytable_B1}}<br />
!Koch<br />
!Speise<br />
!Benötigte Zutaten<br />
|-<br />
|Thomas<br />
|Pitataschen<br />
|Tomaten, Paprika, Mais, Schafskäsen, Gurken, Tunfisch, Hänchenbrust, Pitataschen, Salami, Schinken, Gouda, Pfanne+Herd/Ofen/Toaster<br />
|-<br />
|Seraliel<br />
|Grillabend<br />
|Thüringer Würstchen, Lamm, Spieße, Geflügel... nach Wunsch wird auch zur 'Halbzeit' Nachschub aus Deutschland mitgebracht.<br />
|-<br />
|Polarwolf<br />
|Überbackenes Tomaten- und Spinatbrot(isl.)<br />
|Ofen mit Backpapier, Toast und Baguette(ohne Kruste), Olivenöl, Tomaten, Knoblauch, Spinat, geriebener Käse, Meer(mehr)salz und Pfeffer.<br />
|}<br />
<br />
==Einkaufsliste==<br />
----Frühstück-----<br />
*100 Eier<br />
*3kg Bacon<br />
*14kg Müsli<br />
*40l H-Milch<br />
*100 Aufback-Brötchen (ohne Kühlung!)<br />
*8 Aufback-Baguettes (ohne Kühlung!)<br />
*8kg Käse & Wurst<br />
*8 Marmeladen<br />
*4 Butter<br />
*60l Orangensaft<br />
*20 Packungen Quark<br />
*300gr Speck<br />
----Obst------<br />
*10kg Äpfel<br />
*2kg Birnen<br />
*2kg Pfirsiche,<br />
*2 große Wassermelonen<br />
*4 Honigmelonen (Zergeneier ^^)<br />
*2kg Kiwis<br />
*5kg Tomaten<br />
*2kg Paprika<br />
*4 Gurken<br />
*2kg Zwiebeln<br />
*2-3 Salate (Haltbarkeit :()<br />
*6kg Kartoffeln<br />
----Abgepacktes----<br />
*4 Dosen Mais<br />
*2 Dosen Thunfisch<br />
*1kg TK-Spinat<br />
*8 Pack Schafskäse<br />
*4kg Pizzakäse<br />
*2kg Gouda<br />
*5 Dosen Tomaten<br />
*5 Dosen Bohnen<br />
*3kg Mehl (550)<br />
*3 Pack Frischhefe<br />
*Rinderbrühe<br />
*3 Packungen Sauerkraut<br />
*1 Glas eingelegte Gurken<br />
----Knapperkram---<br />
*30 diverse Chipstüten<br />
*6kg Nussmischungen<br />
----Cocktails-----<br />
*1 Flasche Havana Club<br />
*2 Flaschen Wodka<br />
*4l Ananassaft<br />
*4l Grapefruitsaft<br />
*8l Marakuja Saft<br />
*Zuckersirup<br />
----Sonstiges----<br />
*Toilettenpapier (1 Großpack)<br />
*Küchenpapier<br />
*Müllbeutel >30l<br />
*Waschmittel<br />
*Backpapier<br />
*1 Pack Zucker<br />
*Salz<br />
*Körniges Salz<br />
*Pfeffer<br />
*2l Olivenöl<br />
*1l Essig<br />
*Grillkohle<br />
*Grillanzünder & Feuerzeug<br />
*Alufolie<br />
----Fleisch------<br />
*2kg Fleisch zum Grillen (falls nicht vom Polarwolf gebracht)<br />
*2kg Kassler<br />
*1kg geräucherte Mettenden<br />
*2kg Hähnchenbrust<br />
*48 Hotdogwürstchen<br />
*24 Hotdogbrötchen<br />
*Remouladensoße<br />
*Diverse Grillsoßen<br />
*Geröstete Zwiebeln<br />
*Ketchup<br />
*Senf<br />
-----Onigiri----<br />
*Sushireis<br />
*Sushi-Essig<br />
*Nori</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2016/Organisation&diff=26347DGL Treffen/2016/Organisation2016-08-04T20:07:07Z<p>I0n0s: /* Was gibts zu essen? */</p>
<hr />
<div>Für den August 2016 planen wir wieder ein DGL Treffen. Diesmal geht es für 2 Wochen an die Küste von Dänemark.<br />
<br />
;Thema: "Nerds On Tour." ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&p=100328#p100328 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
"Haus 2": grævlingvej 12, DK-9480 Norre Rubjerg<br />
<br />
==Wann?==<br />
*Anreise: Sa. 06.08.2016<br />
*Abreise: Sa. 20.08.2016<br />
<br />
==Was kostet das?==<br />
Je besser die Auslastung des Hauses, desto besser. Die Preise werden im gewohnten Rahmen bleiben.<br />
Verpflegung und Anreise sind da aber nicht mit dabei. Die Verpflegung erfolgt üblicherweise über eine Umlage und wir holen uns gemeinsam etwas. Sollte jemand aus Kostengründen nicht teilnehmen können, kann er sich per Mail an Phobeus wenden.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Es sind insgesamt 8 Betten im Haus.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|PKW <br />
|(1,5 Plätze im PKW frei ab Hamburg.)<br />
|-<br />
|i0n0s<br />
|14<br />
|PKW <br />
|(1 Platz im PKW frei ab Gießen.)<br />
|-<br />
|Polarwolf<br />
|14<br />
|PKW<br />
|(1 Platz im PKW frei ab Hamburg.)<br />
|-<br />
|Seraliel<br />
|2.5<br />
|PKW <br />
|(1 Platz frei ab Hamburg. Am Fr.12.8)<br />
|-<br />
|Flash<br />
|14<br />
|PKW<br />
|Nimmt End ab Hannover mit und Tak ab Flensburg<br />
|-<br />
|TAK2004<br />
|14<br />
|<br />
|fährt bei Flash mit <br />
|-<br />
|Mr Frase<br />
|14<br />
|Flugzeug <br />
|Landet in Hamburg am Fr. 5. August um 22:05 und wird dann von Phobeus eingesammelt<br />
|-<br />
|Ms Frase<br />
|14<br />
|Flugzeug<br />
|Landet in Hamburg am Fr. 5. August um 22:05 und wird dann von Phobeus eingesammelt<br />
|-<br />
|End<br />
|14<br />
|<br />
|fährt bei Flash mit<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Die Anreise steht noch nicht fest. Treffpunkt wird vor Hamburg sein, dort besteht die Möglichkeit die PKWs stehen zu lassen und sich besser auf die Wagen zu verteilen. Eine Anreise zum Bahnhof HH lässt sich ebenfalls organisieren. Fahrgemeinschaften bitte so früh wie möglich bilden!<br />
<br />
==Was muss man persönlich mitbringen?==<br />
* ggf. Reisekasse für eigene Einkäufe (Dänemark hat keinen Euro!)<br />
* Bettwäsche und Handtücher<br />
* Wechsel-Kleidung<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs- und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel <br />
* Badesachen (inkl. Sonnencreme)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.)<br />
<br />
==Was müssen wir gemeinsammitbringen?==<br />
* Klopapier<br />
* Netzwerkkabel<br />
* Steckdosenleisten<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Elektronik (1 Router, Laptop, Netzwerkkabel, Fotoapparat)<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Spiel und Spannung<br />
*Eine große weiße Leinwand zum bewundern<br />
*Ausgebildete Barkeeper<br />
*Baden und Grillen<br />
*Mini-LAN<br />
*Virtuelle Realitäten<br />
*Live Projektvorstellung<br />
*DänInnen, vereinzelt SchwedInnen *hust* ;)<br />
<br />
==Was gibts zu essen?==<br />
Flow: Ich sollte fast alles zubereitet bekommen, was aus dem Wasser kommt. Der Kauf ist üblicherweise direkt vom Kutter, die aber unregelmäßig rein kommen. Ein entsprechendes Backup sollte existieren.<br />
<br />
{|{{Prettytable_B1}}<br />
!Koch<br />
!Speise<br />
!Benötigte Zutaten<br />
|-<br />
|Thomas<br />
|Pitataschen<br />
|Tomaten, Paprika, Mais, Schafskäsen, Gurken, Tunfisch, Hänchenbrust, Pitataschen, Salami, Schinken, Gouda, Pfanne+Herd/Ofen/Toaster<br />
|-<br />
|Seraliel<br />
|Grillabend<br />
|Thüringer Würstchen, Lamm, Spieße, Geflügel... nach Wunsch wird auch zur 'Halbzeit' Nachschub aus Deutschland mitgebracht.<br />
|-<br />
|Polarwolf<br />
|Überbackenes Tomaten- und Spinatbrot(isl.)<br />
|Ofen mit Backpapier, Toast und Baguette(ohne Kruste), Olivenöl, Tomaten, Knoblauch, Spinat, geriebener Käse, Meer(mehr)salz und Pfeffer.<br />
|}<br />
<br />
==Einkaufsliste==<br />
----Frühstück-----<br />
*100 Eier<br />
*3kg Bacon<br />
*14kg Müsli<br />
*40l H-Milch<br />
*100 Aufback-Brötchen (ohne Kühlung!)<br />
*8 Aufback-Baguettes (ohne Kühlung!)<br />
*8kg Käse & Wurst<br />
*8 Marmeladen<br />
*4 Butter<br />
*60l Orangensaft<br />
*20 Packungen Quark<br />
*300gr Speck<br />
----Obst------<br />
*10kg Äpfel<br />
*2kg Birnen<br />
*2kg Pfirsiche,<br />
*2 große Wassermelonen<br />
*4 Honigmelonen (Zergeneier ^^)<br />
*2kg Kiwis<br />
*5kg Tomaten<br />
*2kg Paprika<br />
*4 Gurken<br />
*2kg Zwiebeln<br />
*2-3 Salate (Haltbarkeit :()<br />
*6kg Kartoffeln<br />
----Abgepacktes----<br />
*4 Dosen Mais<br />
*2 Dosen Thunfisch<br />
*1kg TK-Spinat<br />
*8 Pack Schafskäse<br />
*4kg Pizzakäse<br />
*2kg Gouda<br />
*5 Dosen Tomaten<br />
*5 Dosen Bohnen<br />
*3kg Mehl (550)<br />
*3 Pack Frischhefe<br />
*Rinderbrühe<br />
*3 Packungen Sauerkraut<br />
*1 Glas eingelegte Gurken<br />
----Knapperkram---<br />
*30 diverse Chipstüten<br />
*6kg Nussmischungen<br />
----Cocktails-----<br />
*1 Flasche Havana Club<br />
*2 Flaschen Wodka<br />
*4l Ananassaft<br />
*4l Grapefruitsaft<br />
*8l Marakuja Saft<br />
*Zuckersirup<br />
----Sonstiges----<br />
*Toilettenpapier (1 Großpack)<br />
*Küchenpapier<br />
*Müllbeutel >30l<br />
*Backpapier<br />
*1 Pack Zucker<br />
*Salz<br />
*Körniges Salz<br />
*Pfeffer<br />
*2l Olivenöl<br />
*1l Essig<br />
*Grillkohle<br />
*Grillanzünder & Feuerzeug<br />
*Alufolie<br />
----Fleisch------<br />
*2kg Fleisch zum Grillen (falls nicht vom Polarwolf gebracht)<br />
*2kg Kassler<br />
*1kg geräucherte Mettenden<br />
*2kg Hähnchenbrust<br />
*48 Hotdogwürstchen<br />
*24 Hotdogbrötchen<br />
*Remouladensoße<br />
*Diverse Grillsoßen<br />
*Geröstete Zwiebeln<br />
*Ketchup<br />
*Senf<br />
-----Onigiri----<br />
*Sushireis<br />
*Sushi-Essig<br />
*Nori</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2016/Organisation&diff=26322DGL Treffen/2016/Organisation2016-05-10T17:44:48Z<p>I0n0s: /* Wer kommt mit? */</p>
<hr />
<div>Für den August 2016 planen wir wieder ein DGL Treffen. Diesmal geht es für 2 Wochen an die Küste von Dänemark.<br />
<br />
;Thema: "Nerds On Tour." ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&p=100328#p100328 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
Wird noch im Thread diskutiert.<br />
<br />
==Wann?==<br />
*Anreise: Sa. 06.08.2016<br />
*Abreise: Sa. 20.08.2016<br />
<br />
==Was kostet das?==<br />
Je besser die Auslastung des Hauses, desto besser. Die Preise werden im gewohnten Rahmen bleiben.<br />
Verpflegung und Anreise sind da aber nicht mit dabei. Die Verpflegung erfolgt üblicherweise über eine Umlage und wir holen uns gemeinsam etwas. Sollte jemand aus Kostengründen nicht teilnehmen können, kann er sich per Mail an Phobeus wenden.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Es sind insgesamt 8 Betten im Haus.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|14<br />
|PKW <br />
|(1,5 Plätze im PKW frei ab Hamburg.)<br />
|-<br />
|i0n0s<br />
|14<br />
|PKW <br />
|(1 Platz im PKW frei ab Gießen.)<br />
|-<br />
|Du<br />
|14<br />
|--- <br />
|---<br />
|-<br />
|Du<br />
|14<br />
|--- <br />
|---<br />
|-<br />
|Du<br />
|14<br />
|--- <br />
|---<br />
|-<br />
|Du<br />
|14<br />
|--- <br />
|---<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Die Anreise steht noch nicht fest. Treffpunkt wird vor Hamburg sein, dort besteht die Möglichkeit die PKWs stehen zu lassen und sich besser auf die Wagen zu verteilen. Eine Anreise zum Bahnhof HH lässt sich ebenfalls organisieren. Fahrgemeinschaften bitte so früh wie möglich bilden!<br />
<br />
==Was muss man mitbringen?==<br />
* Bargeld (Kaution ''(siehe Forum)'' + Reisekasse)<br />
* Bettwäsche und Handtücher (1 Set kostet vor Ort 13Euro)<br />
* Wechsel-Kleidung<br />
* Nahrungsmittel<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel <br />
* Klopapier<br />
* Badesachen (inkl. Sonnencreme)<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Elektronik (1 Router, Laptop, Netzwerkkabel, Fotoapparat)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.)<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Baden und Grillen<br />
*Eine Minni-LAN<br />
*Live Projektvorstellung<br />
*Däninnen *hust* ;)</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2016/Organisation&diff=26321DGL Treffen/2016/Organisation2016-05-09T20:01:05Z<p>I0n0s: /* Wer kommt mit? */</p>
<hr />
<div>Für den August 2016 planen wir wieder ein DGL Treffen. Diesmal geht es für 2 Wochen an die Küste von Dänemark.<br />
<br />
;Thema: "Nerds On Tour." ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&p=100328#p100328 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
Wird noch im Thread diskutiert.<br />
<br />
==Wann?==<br />
*Anreise: Sa. 06.08.2016<br />
*Abreise: Sa. 20.08.2016<br />
<br />
==Was kostet das?==<br />
Je besser die Auslastung des Hauses, desto besser. Die Preise werden im gewohnten Rahmen bleiben.<br />
Verpflegung und Anreise sind da aber nicht mit dabei. Die Verpflegung erfolgt üblicherweise über eine Umlage und wir holen uns gemeinsam etwas. Sollte jemand aus Kostengründen nicht teilnehmen können, kann er sich per Mail an Phobeus wenden.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Es sind insgesamt 8 Betten im Haus.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Tage<br />
(14=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Phobeus<br />
|X<br />
|14<br />
|PKW <br />
|(1,5 Plätze im PKW frei ab Hamburg.)<br />
|-<br />
|i0n0s<br />
|X<br />
|14<br />
|PKW <br />
|(1 Platz im PKW frei ab Gießen.)<br />
|-<br />
|Du<br />
|X<br />
|14<br />
|--- <br />
|---<br />
|-<br />
|Du<br />
|X<br />
|14<br />
|--- <br />
|---<br />
|-<br />
|Du<br />
|X<br />
|14<br />
|--- <br />
|---<br />
|-<br />
|Du<br />
|X<br />
|14<br />
|--- <br />
|---<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Die Anreise steht noch nicht fest. Treffpunkt wird vor Hamburg sein, dort besteht die Möglichkeit die PKWs stehen zu lassen und sich besser auf die Wagen zu verteilen. Eine Anreise zum Bahnhof HH lässt sich ebenfalls organisieren. Fahrgemeinschaften bitte so früh wie möglich bilden!<br />
<br />
==Was muss man mitbringen?==<br />
* Bargeld (Kaution ''(siehe Forum)'' + Reisekasse)<br />
* Bettwäsche und Handtücher (1 Set kostet vor Ort 13Euro)<br />
* Wechsel-Kleidung<br />
* Nahrungsmittel<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel <br />
* Klopapier<br />
* Badesachen (inkl. Sonnencreme)<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Elektronik (1 Router, Laptop, Netzwerkkabel, Fotoapparat)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.)<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Baden und Grillen<br />
*Eine Minni-LAN<br />
*Live Projektvorstellung<br />
*Däninnen *hust* ;)</div>I0n0shttps://wiki.delphigl.com/index.php?title=dglOpenGL.pas/en&diff=26316dglOpenGL.pas/en2015-07-17T13:49:31Z<p>I0n0s: /* Download */</p>
<hr />
<div>{{Warnung| '''Delphi is already shipping with an OpenGL header, but that header is ''outdated and also buggy''. Therefore we ''urge everyone to NOT use that header, especially as it lacks most of OpenGL's current functionality.'''''}}<br />
<br />
<div align="center">[[Bild:Flag_german.gif]][[dglOpenGL.pas| Gehe zur deutschen Version dieser Seite ]][[Bild:Flag_german.gif]]</div><br />
<br />
=The DelphiGL header=<br />
To compensate for the flaws of the outdated and buggy default header that is shipped with Delphi, the [http://www.delphigl.com (german) Delphi OpenGL Community] is providing it's own header that's permanently updated to provide steady support for new OpenGL features and functionality. This makes updating to a new header version easy (usually backwards compatibility is preserved), and it's even possible to use the header with other pascal compilers like Freepascal.<br />
<br />
It includes all OpenGL functions (currently up-to and including OpenGL 4.4) as well as all GLU ('''OpenGL Utility Libary''') functions and supports all ARB, EXT, NV and ATI extensions. It also includes additional, though lesser common extensions from other vendors like Apple, HP and SGI.<br />
<br />
A special feature of this header are boolean variables for each included extension that are flagged upon initialisation (those boolean vars carry the same as their corresponding extensions), so you can quickly check whether an extension is support or not (instead of checking the strings returned by [[glGetString/en]]).<br />
<br />
<br />
==Licence/Terms of use==<br />
The '''dglOpenGL.pas''' is distributed unter the terms and conditions of the '''Mozilla Public License Version 1.1'''. You can grab a copy of that licence [http://www.mozilla.org/MPL/MPL-1.1.html here].<br />
<br />
<br />
<code>The contents of the dglOpenGL.pas are used with permission, subject to<br><br />
the Mozilla Public License Version 1.1 (the "License"); you may<br><br />
not use this file except in compliance with the License. You may<br><br />
obtain a copy of the License at<br><br />
http://www.mozilla.org/MPL/MPL-1.1.html<br><br />
<br><br />
Software distributed under the License is distributed on an<br><br />
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or<br><br />
implied. See the License for the specific language governing<br><br />
rights and limitations under the License.</code><br />
<br />
<br />
==.NET support==<br />
Due to lack of interest, .NET support has been removed as of header version 2.1!<br />
<br />
{{Hinweis|The .Net header won't be developed any further, but reported errors may be fixed. So new OpenGL functionality can only be found in the normal header.}}<br />
<br />
<br />
==Initializing function pointers (crucial)==<br />
Along with the removal of .NET support, support for loading methods dynamically has also been removed and is no longer possible with the standard header. So it's crucial to call either '''AtivateRenderingContext''' or '''ReadExtensions''' alongside with '''ReadImplementationProperties''' in your application before accessing any of the OpenGL functions. Otherwise you'll likely be prompted with an access violation at address 0x00000000. <br />
<br />
''So if you get such an access violation please check if you called the above functions!''<br />
<br />
<br />
Example for '''initializing''' the OpenGL function pointers (''needs to be called before you access any OpenGL functions'') :<br />
<source lang="pascal">procedure OpenGLInit;<br />
begin<br />
InitOpenGL; // Don't forget, or first gl-Call will result in an access violation!<br />
MyDC := GetDC(...);<br />
MyRC := CreateRenderingContext(...);<br />
ActivateRenderingContext(MyDC, MyRC); // Necessary, will also load function pointers for all extension<br />
...<br />
end;</source><br />
<br />
<br />
Example for '''finishing''' the OpenGL render context (''should be called before quitting your application'') :<br />
<source lang="pascal">procedure OpenGLFinish;<br />
begin<br />
DeactivateRenderingContext; // Deactivates the current context<br />
wglDeleteContext(myRC);<br />
ReleaseDC(Handle, myDC);<br />
end;</source><br />
<br />
<br />
==Download==<br />
<br />
<div align="center"><br />
'''[https://github.com/saschawillems/dglopengl Current dglOpenGL.pas]'''<br />
<br />
(Supports ''OpenGL 4.4'', works with Delphi 4 and up and Freepascal))<br />
<br />
<br />
<br />
<br />
''{{ArchivLink|file=dglOpenGL_net|text=Last dglOpenGL.pas wit .NET support}} (Supports ''OpenGL 2.1'')''<br />
<br />
''(Note : This header is'nt developed any further)''<br />
<br />
<br />
'''For Delphi 3 users :'''<br />
''[[Benutzer:Mars|Mars]] has posted a version of the dglOpenGL.pas that will work with Delphi 3, you can get it here :<br><br />
[http://www.delphigl.com/forum/viewtopic.php?p=26697#25642 dglOpenGL.pas for Delphi 3] <br><br />
''(You need to be registered on the forums to download it)''<br />
<br />
<br />
''There is also an inofficial version of this [http://www.delphigl.com/forum/viewtopic.php?t=4216 headers for C++].''<br />
</div><br />
<br />
== History ==<br />
{{dglOpenGL_History}}</div>I0n0shttps://wiki.delphigl.com/index.php?title=dglOpenGL.pas&diff=26315dglOpenGL.pas2015-07-17T13:20:38Z<p>I0n0s: /* Download */</p>
<hr />
<div>{{Warnung| '''Im Lieferumfang von Delphi ist bereits ein OpenGL Header enthalten. Dieser Header ist allerdings ''veraltet und fehlerhaft''. Unter anderem wurden Befehlsbezeichner nicht korrekt übernommen. ''Es wird daher dringend davon abgeraten diesen Header zu benutzen.'''''}}<br />
<br />
<div align="center">[[Bild:Flag_english.gif]][[dglOpenGL.pas/en|Go to English version of this article ]][[Bild:Flag_english.gif]]</div><br />
<br />
=Der DelphiGL-Header=<br />
Für alle die OpenGL unter Delphi nutzen möchten hat die [http://www.delphigl.com DelphiGL Community] einen Header zur Verfügung gestellt.<br />
<br />
Der Header enthält alle aktuellen OpenGL-Funktionen sowie alle aktuellen GLU-Funktionen.<br />
<br />
Des weiteren sind alle ARB-, EXT-, NV- und ATI- Extensions enthalten sowie einige weitere Extensions von anderen Herstellern (Apple, HP, SGI...)<br />
<br />
Als besonderer Service bei den Extensions enthält der Header eine Booleanvariablen für jede Extension die automatisch bei Initialisieren gesetzt wird. Diese Booleanvariable (die den gleichen Namen wie der Abfragestring hat) gibt dann an, ob die Extension verfügbar ist oder nicht. (Man erspart sich damit die Stringauswertung bei [[glGetString]].)<br />
<br />
Der Header wird von der DGL-Community gepflegt und auf dem neuesten Stand gehalten. Dadurch wird es den Nutzern des Headers sehr leicht gemacht bei neuen OpenGL Versionen einfach den neuen Header in ihre Programme einzubinden (Man muss nur den alten durch den neuen Header ersetzen). Weiterhin ist es auch möglich den Header unter anderen Pascalplattformen wie z.B. Freepascal zu benutzen.<br />
<br />
==Lizenz/Nutzungsbedingungen==<br />
Die dglOpenGL.pas wird unter den Bedingungen der '''Mozilla Public License Version 1.1''' weitergegeben. <br />
Eine Kopie der Lizenz ist zu finden unter '''http://www.mozilla.org/MPL/MPL-1.1.html'''.<br />
<br />
The contents of the dglOpenGL.pas are used with permission, subject to<br />
the Mozilla Public License Version 1.1 (the "License"); you may<br />
not use this file except in compliance with the License. You may<br />
obtain a copy of the License at<br />
http://www.mozilla.org/MPL/MPL-1.1.html<br />
<br />
Software distributed under the License is distributed on an<br />
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or<br />
implied. See the License for the specific language governing<br />
rights and limitations under the License.<br />
<br />
==Hinweis==<br />
Seit der Headerversion 2.1 unterstützt der reguläre Header kein .NET mehr. <br />
<br />
{{Hinweis|Der .Net Header wird vorerst nicht weiterentwickelt. Eventuell vorhandene Fehler werden aber berichtigt. Neue Funktionen (durch neue OpenGL-Versionen) gibt es nur im Standard-Header.}}<br />
<br />
Mit dem Entfernen der .NET Unterstützung wurde auch eine Technik entfernt, die es dem Header möglich gemacht hat benötigte Methoden dynamisch nachzuladen. Dies funktioniert jetzt nicht mehr. Ihr müsstet also nachdem ihr euren Kontext erstellt habt ihn entweder über ''ActivateRenderingContext'' aktivieren oder aber es muss ''ReadExtensions'' und ''ReadImplementationProperties'' von Hand aufgerufen werden, ansonsten könnten Zugriffsverletzungen an Adresse 0x00000000 auftreten wo vorher keine waren. Bitte überprüft das.<br />
<br />
==Download==<br />
<br />
<div align="center"><br />
'''Hier könnt ihr den aktuellen [https://github.com/saschawillems/dglopengl Header downloaden].'''<br />
<br />
'''Hier könnt ihr den letzten {{ArchivLink|file=dglOpenGL_net|text=dglOpenGL.pas Header mit .NET Unterstützung downloaden}}.'''<br />
<br />
<br />
<br />
<br />
''[[Benutzer:Mars|Mars]] hat im DGL-Forum ein '''abgewandelte Form der dglOpenGL.pas''' gepostet, welche auch mit '''Delphi 3''' funktioniert:''<br><br />
[http://www.delphigl.com/forum/viewtopic.php?p=26697#25642 dglOpenGL.pas für Delphi 3] <br><br />
''(Anmeldung für Download notwendig.)''<br />
<br />
<br />
''Weiterhin existiert eine inoffizielle Version des [http://www.delphigl.com/forum/viewtopic.php?t=4216 Headers für C++].''<br />
<br />
</div><br />
<br />
==Changelog==<br />
{{dglOpenGL_History}}</div>I0n0shttps://wiki.delphigl.com/index.php?title=glReadPixels&diff=26311glReadPixels2015-05-20T08:26:39Z<p>I0n0s: /* Beschreibung */</p>
<hr />
<div>= glReadPixels =<br />
<br />
<br />
<br />
== Name ==<br />
'''glReadPixels''' - ließt einen Block von Pixel aus dem [[Framebuffer]].<br />
<br />
<br />
<br />
== Delphi-Spezifikation ==<br />
procedure '''glReadPixels'''(''x'': TGLint; ''y'': TGLint; <br />
''width'': TGLsizei; ''height'': TGLsizei; <br />
''format'': TGLenum; ''_type'': TGLenum; <br />
''pixels'': PGLvoid);<br />
<br />
<br />
<br />
== Parameter ==<br />
<table border=1 rules=all><br />
<tr><br />
<td>''x, y''</td><br />
<td>Beschreibt die Fensterkoordinaten des ersten Pixels, dass aus dem [[Framebuffer]] gelesen wird. Diese Position ist die untere, linke Ecke eines Rechtecks von Pixeln.</td><br />
</tr><br />
<tr><br />
<td>''width, height''</td><br />
<td>Beschreibt die Dimensionen des Pixelrechtecks. Die Angaben werden dabei in Pixel gemacht.</td><br />
</tr><br />
<tr><br />
<td>''format''</td><br />
<td>Bestimmt das Format der Pixeldaten. Folgende symbolische Werte werden akzeptiert: <br><br />
'''GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE,''' und '''GL_LUMINANCE_ALPHA'''</td><br />
</tr><br />
<tr><br />
<td>''type''</td><br />
<td>Beschreibt den Datentyp der Pixeldaten. Muss einer der Folgenden sein:<br><br />
'''GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT,''' oder '''GL_FLOAT'''</td><br />
</tr><br />
<tr><br />
<td>''pixels''</td><br />
<td>Liefert die Pixeldaten zurück.</td><br />
</tr><br />
</table><br />
<br />
<br />
<br />
<br />
== Beschreibung == <br />
'''glReadPixels''' kopiert Pixeldaten aus dem [[Framebuffer]] in den Klientspeicher der für ''pixels'' reserviert wurde. Der Kopiervorgang beginnt dabei mit dem Pixel, dessen linke untere Ecke am Punkt(''x, y'') liegt.<br />
Verschiedene Parameter kontrollieren die Verarbeitung der Pixeldaten bevor diese in den Klientspeicher geschrieben werden. Diese Parameter werden mit drei Befehlen gesetzt:<br><br />
[[glPixelStore]], [[glPixelTransfer]] und [[glPixelMap]].<br><br />
Dieser Artikel beschreibt die Effekte welche die meisten, aber nicht alle Parameter der genannten Artikel auf '''glReadPixels''' haben.<br />
{{Hinweis|Möchte man, dass die Pixeldaten hintereinanderweg im Speicher erscheinen, so sollte man glPixelStoref(GL_PACK_ALIGNMENT,1) setzen, ansonten werden die Daten je nach Format durch Pixelstore weiter formatiert.}}<br />
'''glReadPixels''' liefert die Werte der Pixel die im Rechteck [''x''+i, ''y''+j] liegen. (mit 0<=i<''width'' bzw. 0<=j<height)<br><br />
Dabei bezeichnet [i,j] das i-te Pixel in der j-ten Zeile. Die Pixel werden zeilenweise beginnend mit der niedrigsten Zeile und von links nach rechts (innerhalb der Zeile) zurück geliefert.<br />
<br />
Der Parameter ''format'' bestimmt das Format der zurück gelieferten Pixelwerte. Akzeptiert werden:<br />
<br />
=== Format Parameter ===<br />
'''GL_COLOR_INDEX'''<br />
: Farbindizes werden aus dem von glReadBuffer ausgewählten [[Farbpuffer]] gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von GL_INDEX_SHIFT bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Ist '''GL_MAP_COLOR''' auf '''GL_TRUE''' gesetzt, werden Indizes durch ihre entsprechenden Werte aus der '''GL_PIXEL_MAP_I_TO_I''' Tabelle ersetzt. <br />
<br />
'''GL_STENCIL_INDEX'''<br />
: Stencilwerte werden aus dem Stencilbuffer gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von '''GL_INDEX_SHIFT''' bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Ist '''GL_MAP_STENCIL''' auf '''GL_TRUE''' gesetzt, werden Indizes durch ihre entsprechenden Werte aus der '''GL_PIXEL_MAP_S_TO_S''' Tabelle ersetzt. <br />
'''GL_DEPTH_COMPONENT'''<br />
: Tiefenwertkomponenten werden aus dem Z-Buffer gelesen. Jede Komponente wird in eine Gleitkommazahl umgewandelt, so dass der minimale Wert auf 0.0 abgebildet wird und der maximale auf 1.0. Dann wird der Wert mit '''GL_DEPTH_SCALE''' multipliziert und zu '''GL_DEPTH_BIAS''' addiert und am Schluss auf den Bereich [0,1] begrenzt. <br />
<br />
'''GL_RED''' <br><br />
'''GL_GREEN''' <br><br />
'''GL_BLUE''' <br><br />
'''GL_ALPHA''' <br><br />
'''GL_RGB''' <br><br />
'''GL_RGBA''' <br><br />
'''GL_LUMINANCE''' <br><br />
'''GL_LUMINANCE_ALPHA''' <br />
<br />
: Hierbei verhält sich die Verarbeitung unterschiedlich, abhängig davon, ob Farbindizes oder Farbkomponenten im Colorbuffer gespeichert sind. Wenn Indizes gespeichert sind, werden sie aus dem mit glReadBuffer gesetzen Colorbuffer gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von '''GL_INDEX_SHIFT''' bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Dann werden die Indizes durch ihre entsprechenden Werte aus den Tabellen '''GL_PIXEL_MAP_I_TO_R''', '''GL_PIXEL_MAP_I_TO_G''', '''GL_PIXEL_MAP_I_TO_B''' und '''GL_PIXEL_MAP_I_TO_A''' ersetzt. <br />
: Sind RGBA Farbkomponenten gespeichert, werden sie aus dem mit glReadBuffer gesetzen Colorbuffer gelesen. <br />
:Jede Farbkomponente wird so in eine Gleitkommazahl umgewandelt, dass der minimale Wert auf 0.0 abgebildet wird und der maximale auf 1.0. Dann wird der Wert mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll.<br />
:Ist '''GL_MAP_COLOR''' auf '''GL_TRUE''' gesetzt, wird jeder Farbkomponente durch die entsprechende Ersetzung aus der '''GL_PIXEL_MAP_'''''c'''''_TO_'''''c'' Tabelle (wobei ''c'' wieder R, G, B oder A ist) ersetzt. Davor wird jede Komponente auf die Größe der entsprechenden Tabelle skaliert.<br />
: Abschließend werden die unbenötigen Daten verworfen, z.B.: '''GL_RED''' ignoriert die Grün, Blau und Alpha Komponente, und '''GL_RGB''' ignoriert nur den Alphawert. '''GL_LUMINANCE''' berechnet eine einzige Farbkomponente durch die Summe von Rot, Grün und Blau. '''GL_LUMINANCE_ALPHA''' hat zusätzlich noch einen Alphawert.<br />
<br />
<br />
<br />
Die shift-, scale-, bias-, und lookup-Faktoren die weiter oben beschrieben wurden, werden alle durch [[glPixelTransfer]] spezifiziert. Der Inhalt der lookup-table wiederum wird über [[glPixelMap]] spezifiziert.<br />
<br />
Der letzte Schritt beinhaltet eine Umwandlung der Indizes oder Komponenten in das in ''_type'' angegebene Format. Falls das Format '''GL_COLOR_INDEX''' or '''GL_STENCIL_INDEX''' ist, und der angegebene Typ nicht '''GL_FLOAT''' ist, dann wird jeder Wert mit dem Masken der der folgenden Tabelle maskiert. Falls der Typ '''GL_FLOAT''' ist werden die ganzen Zahlen (Typ Integer) in einen Gleitkommerwert umgerechnet.<br />
<br />
Falls das Format '''GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE''' oder '''GL_LUMINANCE_ALPHA''' ist und der Typ nicht '''GL_FLOAT''' ist, wird jede Komponente mit einen Wert multipliziert, welcher folgender Tabelle entnommen werden kann. Falls der Typ '''GL_FLOAT''' ist werden alle Komponten beibehalten wie sie sind.(Oder in das entsprechend Gleitkommaformat konventiert, falls sich dieses von dem der in GL genutzten unterscheidet)<br />
<br />
{| border="1" rules="all"<br />
! '''Type''' || '''Index Mask''' || '''Komponenten <br>Konvertierung'''<br />
|-<br />
! '''GL_UNSIGNED_BYTE''' || 2^8-1 || (2^8-1)c<br />
|-<br />
! '''GL_BYTE''' || 2^7-1 || ([2^7-1]c-1)/2<br />
|-<br />
! '''GL_BITMAP''' || 1 || 1<br />
|-<br />
! '''GL_UNSIGNED_SHORT''' || 2^16-1 || (2^16-1) c<br />
|-<br />
! '''GL_SHORT''' || 2^15-1 || [(2^15-1) c-1] / 2<br />
|-<br />
! '''GL_UNSIGNED_INT''' || 2^32-1 || (2^32-1) c<br />
|-<br />
! '''GL_INT''' || 2^31-1 || [(2^31-1) c-1] / 2 <br />
|-<br />
! '''GL_FLOAT''' || keine || c<br />
|-<br />
|}<br />
<br />
[[glReadPixels_Beispiel| Ein Rechenbeispiel zum besseren Verständnis.]]<br />
<br />
Die zurückgegeben Werte werden wie folgt im Speicher plaziert: Falls das Format '''GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA,''' oder '''GL_LUMINANCE''' ist, wird ein einzelner Wert zurückgegeben und die Daten für die '''i'''ten [[Pixel]] in der '''j'''ten Reihe werden an der Stelle (j) width + i plaziert.<br />
'''GL_RGB''' gibt drei Werte zurück, '''GL_RGBA''' vier, und '''GL_LUMINANCE_ALPHA''' zwei für jeden Pixel. Alle Werte die zu einem einzelnen Pixel gehören liegen nebeneinander im Feld ''pixels''.<br />
Speicher Parameter werden von [[glPixelStore]] gesetzt, zum Beispiel legen '''GL_PACK_SWAP_BYTES''' und '''GL_PACK_LSB_FIRST''' fest, auf welche Art die Daten in den Speicher geschrieben werden.<br />
<br />
== Hinweise ==<br />
Werte von Pixeln außerhalb des Fensters, das mit dem aktuellen GL-Kontext verbunden ist, sind undefiniert.<br />
<br />
Wenn ein Fehler bei der Durchführung der Funktion auftritt, werden keine Veränderungen am Inhalt von ''pixels'' durchgeführt.<br />
<br />
<br />
<br />
<br />
== Fehlermeldungen ==<br />
'''GL_INVALID_ENUM''' wird generiert wenn ''format'' oder ''type'' ein ungültiger Wert übergeben wird.<br><br />
'''GL_INVALID_VALUE''' wird generiert wenn entweder ''width'' oder ''height'' negativ ist.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_COLOR_INDEX''' ist und der [[Farbpuffer]] RGBA Werte enthält.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_STENCIL_INDEX''' ist und kein Schablonen-(/Stencil-)Puffer existiert.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_DEPTH_COMPONENT''' ist und kein [[Tiefenpuffer]] existiert.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn '''glReadPixels''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird.<br />
<br />
<br />
<br />
== Zugehörige Wertrückgaben ==<br />
[[glGet]] mit Token [[glGet#GL_INDEX_MODE|GL_INDEX_MODE]]<br />
<br />
<br />
<br />
<br />
== Anwendungs Möglichkeiten ==<br />
Dies ist die Funktion mit welcher [[Screenshot]]s erzeugt werden können. Durch das Auslesen des [[Tiefenpuffer]], können [[Heightmap]]s erstellt werden. Auch erhält man so die nötige Z-Koordinate wenn man mit [[gluUnProject]] die ursprüngliche Koordinate errechnen möchte.<br />
<br><br />
<br />
== Siehe auch ==<br />
[[glCopyPixels]], [[glDrawPixels]], [[glPixelMap]], [[glPixelStore]], [[glPixelTransfer]], [[glReadBuffer]] <br />
<br />
[[Kategorie:GL|ReadPixels]]<br />
[[Kategorie:GL1.0]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=glReadPixels&diff=26310glReadPixels2015-05-20T08:26:17Z<p>I0n0s: /* Beschreibung */</p>
<hr />
<div>= glReadPixels =<br />
<br />
<br />
<br />
== Name ==<br />
'''glReadPixels''' - ließt einen Block von Pixel aus dem [[Framebuffer]].<br />
<br />
<br />
<br />
== Delphi-Spezifikation ==<br />
procedure '''glReadPixels'''(''x'': TGLint; ''y'': TGLint; <br />
''width'': TGLsizei; ''height'': TGLsizei; <br />
''format'': TGLenum; ''_type'': TGLenum; <br />
''pixels'': PGLvoid);<br />
<br />
<br />
<br />
== Parameter ==<br />
<table border=1 rules=all><br />
<tr><br />
<td>''x, y''</td><br />
<td>Beschreibt die Fensterkoordinaten des ersten Pixels, dass aus dem [[Framebuffer]] gelesen wird. Diese Position ist die untere, linke Ecke eines Rechtecks von Pixeln.</td><br />
</tr><br />
<tr><br />
<td>''width, height''</td><br />
<td>Beschreibt die Dimensionen des Pixelrechtecks. Die Angaben werden dabei in Pixel gemacht.</td><br />
</tr><br />
<tr><br />
<td>''format''</td><br />
<td>Bestimmt das Format der Pixeldaten. Folgende symbolische Werte werden akzeptiert: <br><br />
'''GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE,''' und '''GL_LUMINANCE_ALPHA'''</td><br />
</tr><br />
<tr><br />
<td>''type''</td><br />
<td>Beschreibt den Datentyp der Pixeldaten. Muss einer der Folgenden sein:<br><br />
'''GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT,''' oder '''GL_FLOAT'''</td><br />
</tr><br />
<tr><br />
<td>''pixels''</td><br />
<td>Liefert die Pixeldaten zurück.</td><br />
</tr><br />
</table><br />
<br />
<br />
<br />
<br />
== Beschreibung == <br />
'''glReadPixels''' kopiert Pixeldaten aus dem [[Framebuffer]] in den Klientspeicher der für ''pixels'' reserviert wurde. Der Kopiervorgang beginnt dabei mit dem Pixel, dessen linke untere Ecke am Punkt(''x, y'') liegt.<br />
Verschiedene Parameter kontrollieren die Verarbeitung der Pixeldaten bevor diese in den Klientspeicher geschrieben werden. Diese Parameter werden mit drei Befehlen gesetzt:<br><br />
[[glPixelStore]], [[glPixelTransfer]] und [[glPixelMap]].<br><br />
Dieser Artikel beschreibt die Effekte welche die meisten, aber nicht alle Parameter der genannten Artikel auf '''glReadPixels''' haben.<br />
{{Hinweis|Möchte man, dass die Pixeldaten hintereinanderweg im Speicher erscheinen, so sollte man glPixelStoref(GL_PACK_ALIGNMENT,1) setzen, ansonten werden die Daten je nach Format durch Pixelstore weiter formatiert.}}<br />
'''glReadPixels''' liefert die Werte der Pixel die im Rechteck [''x''+i, ''y''+j] liegen. (mit 0<=i<''width'' bzw. 0<=j<height)<br><br />
Dabei bezeichnet [i,j] das i-te Pixel in der j-ten Zeile. Die Pixel werden zeilenweise beginnend mit der niedrigsten Zeile und von links nach rechts (innerhalb der Zeile) zurück geliefert.<br />
<br />
Der Parameter ''format'' bestimmt das Format der zurück gelieferten Pixelwerte. Akzeptiert werden:<br />
<br />
=== Format Parameter ===<br />
'''GL_COLOR_INDEX'''<br />
: Farbindizes werden aus dem von glReadBuffer ausgewählten [[Farbpuffer]] gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von GL_INDEX_SHIFT bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Ist '''GL_MAP_COLOR''' auf '''GL_TRUE''' gesetzt, werden Indizes durch ihre entsprechenden Werte aus der '''GL_PIXEL_MAP_I_TO_I''' Tabelle ersetzt. <br />
<br />
'''GL_STENCIL_INDEX'''<br />
: Stencilwerte werden aus dem Stencilbuffer gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von '''GL_INDEX_SHIFT''' bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Ist '''GL_MAP_STENCIL''' auf '''GL_TRUE''' gesetzt, werden Indizes durch ihre entsprechenden Werte aus der '''GL_PIXEL_MAP_S_TO_S''' Tabelle ersetzt. <br />
'''GL_DEPTH_COMPONENT'''<br />
: Tiefenwertkomponenten werden aus dem Z-Buffer gelesen. Jede Komponente wird in eine Gleitkommazahl umgewandelt, so dass der minimale Wert auf 0.0 abgebildet wird und der maximale auf 1.0. Dann wird der Wert mit '''GL_DEPTH_SCALE''' multipliziert und zu '''GL_DEPTH_BIAS''' addiert und am Schluss auf den Bereich [0,1] begrenzt. <br />
<br />
'''GL_RED''' <br><br />
'''GL_GREEN''' <br><br />
'''GL_BLUE''' <br><br />
'''GL_ALPHA''' <br><br />
'''GL_RGB''' <br><br />
'''GL_RGBA''' <br><br />
'''GL_LUMINANCE''' <br><br />
'''GL_LUMINANCE_ALPHA''' <br />
<br />
: Hierbei verhält sich die Verarbeitung unterschiedlich, abhängig davon, ob Farbindizes oder Farbkomponenten im Colorbuffer geschpeichert sind. Wenn Indizes gespeichert sind, werden sie aus dem mit glReadBuffer gesetzen Colorbuffer gelesen. Jeder Index wird in eine Festkommazahl konvertiert, abhängig von Wert und Vorzeichen von '''GL_INDEX_SHIFT''' bitweise nach rechts bzw. links verschoben und zu '''GL_INDEX_OFFSET''' addiert. Dann werden die Indizes durch ihre entsprechenden Werte aus den Tabellen '''GL_PIXEL_MAP_I_TO_R''', '''GL_PIXEL_MAP_I_TO_G''', '''GL_PIXEL_MAP_I_TO_B''' und '''GL_PIXEL_MAP_I_TO_A''' ersetzt. <br />
: Sind RGBA Farbkomponenten gespeichert, werden sie aus dem mit glReadBuffer gesetzen Colorbuffer gelesen. <br />
:Jede Farbkomponente wird so in eine Gleitkommazahl umgewandelt, dass der minimale Wert auf 0.0 abgebildet wird und der maximale auf 1.0. Dann wird der Wert mit '''GL_'''''c'''''_SCALE''' multipliziert und zu '''GL_'''''c'''''_BIAS''' addiert, und am Schluss auf den Bereich [0,1] begrenzt, wobei ''c'' durch R, G, B oder A ersetzt werden soll.<br />
:Ist '''GL_MAP_COLOR''' auf '''GL_TRUE''' gesetzt, wird jeder Farbkomponente durch die entsprechende Ersetzung aus der '''GL_PIXEL_MAP_'''''c'''''_TO_'''''c'' Tabelle (wobei ''c'' wieder R, G, B oder A ist) ersetzt. Davor wird jede Komponente auf die Größe der entsprechenden Tabelle skaliert.<br />
: Abschließend werden die unbenötigen Daten verworfen, z.B.: '''GL_RED''' ignoriert die Grün, Blau und Alpha Komponente, und '''GL_RGB''' ignoriert nur den Alphawert. '''GL_LUMINANCE''' berechnet eine einzige Farbkomponente durch die Summe von Rot, Grün und Blau. '''GL_LUMINANCE_ALPHA''' hat zusätzlich noch einen Alphawert.<br />
<br />
<br />
<br />
Die shift-, scale-, bias-, und lookup-Faktoren die weiter oben beschrieben wurden, werden alle durch [[glPixelTransfer]] spezifiziert. Der Inhalt der lookup-table wiederum wird über [[glPixelMap]] spezifiziert.<br />
<br />
Der letzte Schritt beinhaltet eine Umwandlung der Indizes oder Komponenten in das in ''_type'' angegebene Format. Falls das Format '''GL_COLOR_INDEX''' or '''GL_STENCIL_INDEX''' ist, und der angegebene Typ nicht '''GL_FLOAT''' ist, dann wird jeder Wert mit dem Masken der der folgenden Tabelle maskiert. Falls der Typ '''GL_FLOAT''' ist werden die ganzen Zahlen (Typ Integer) in einen Gleitkommerwert umgerechnet.<br />
<br />
Falls das Format '''GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE''' oder '''GL_LUMINANCE_ALPHA''' ist und der Typ nicht '''GL_FLOAT''' ist, wird jede Komponente mit einen Wert multipliziert, welcher folgender Tabelle entnommen werden kann. Falls der Typ '''GL_FLOAT''' ist werden alle Komponten beibehalten wie sie sind.(Oder in das entsprechend Gleitkommaformat konventiert, falls sich dieses von dem der in GL genutzten unterscheidet)<br />
<br />
{| border="1" rules="all"<br />
! '''Type''' || '''Index Mask''' || '''Komponenten <br>Konvertierung'''<br />
|-<br />
! '''GL_UNSIGNED_BYTE''' || 2^8-1 || (2^8-1)c<br />
|-<br />
! '''GL_BYTE''' || 2^7-1 || ([2^7-1]c-1)/2<br />
|-<br />
! '''GL_BITMAP''' || 1 || 1<br />
|-<br />
! '''GL_UNSIGNED_SHORT''' || 2^16-1 || (2^16-1) c<br />
|-<br />
! '''GL_SHORT''' || 2^15-1 || [(2^15-1) c-1] / 2<br />
|-<br />
! '''GL_UNSIGNED_INT''' || 2^32-1 || (2^32-1) c<br />
|-<br />
! '''GL_INT''' || 2^31-1 || [(2^31-1) c-1] / 2 <br />
|-<br />
! '''GL_FLOAT''' || keine || c<br />
|-<br />
|}<br />
<br />
[[glReadPixels_Beispiel| Ein Rechenbeispiel zum besseren Verständnis.]]<br />
<br />
Die zurückgegeben Werte werden wie folgt im Speicher plaziert: Falls das Format '''GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA,''' oder '''GL_LUMINANCE''' ist, wird ein einzelner Wert zurückgegeben und die Daten für die '''i'''ten [[Pixel]] in der '''j'''ten Reihe werden an der Stelle (j) width + i plaziert.<br />
'''GL_RGB''' gibt drei Werte zurück, '''GL_RGBA''' vier, und '''GL_LUMINANCE_ALPHA''' zwei für jeden Pixel. Alle Werte die zu einem einzelnen Pixel gehören liegen nebeneinander im Feld ''pixels''.<br />
Speicher Parameter werden von [[glPixelStore]] gesetzt, zum Beispiel legen '''GL_PACK_SWAP_BYTES''' und '''GL_PACK_LSB_FIRST''' fest, auf welche Art die Daten in den Speicher geschrieben werden.<br />
<br />
== Hinweise ==<br />
Werte von Pixeln außerhalb des Fensters, das mit dem aktuellen GL-Kontext verbunden ist, sind undefiniert.<br />
<br />
Wenn ein Fehler bei der Durchführung der Funktion auftritt, werden keine Veränderungen am Inhalt von ''pixels'' durchgeführt.<br />
<br />
<br />
<br />
<br />
== Fehlermeldungen ==<br />
'''GL_INVALID_ENUM''' wird generiert wenn ''format'' oder ''type'' ein ungültiger Wert übergeben wird.<br><br />
'''GL_INVALID_VALUE''' wird generiert wenn entweder ''width'' oder ''height'' negativ ist.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_COLOR_INDEX''' ist und der [[Farbpuffer]] RGBA Werte enthält.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_STENCIL_INDEX''' ist und kein Schablonen-(/Stencil-)Puffer existiert.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn ''format'' '''GL_DEPTH_COMPONENT''' ist und kein [[Tiefenpuffer]] existiert.<br><br />
'''GL_INVALID_OPERATION''' wird generiert wenn '''glReadPixels''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird.<br />
<br />
<br />
<br />
== Zugehörige Wertrückgaben ==<br />
[[glGet]] mit Token [[glGet#GL_INDEX_MODE|GL_INDEX_MODE]]<br />
<br />
<br />
<br />
<br />
== Anwendungs Möglichkeiten ==<br />
Dies ist die Funktion mit welcher [[Screenshot]]s erzeugt werden können. Durch das Auslesen des [[Tiefenpuffer]], können [[Heightmap]]s erstellt werden. Auch erhält man so die nötige Z-Koordinate wenn man mit [[gluUnProject]] die ursprüngliche Koordinate errechnen möchte.<br />
<br><br />
<br />
== Siehe auch ==<br />
[[glCopyPixels]], [[glDrawPixels]], [[glPixelMap]], [[glPixelStore]], [[glPixelTransfer]], [[glReadBuffer]] <br />
<br />
[[Kategorie:GL|ReadPixels]]<br />
[[Kategorie:GL1.0]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Tutorial_Frustum_Culling&diff=26309Tutorial Frustum Culling2015-05-13T21:30:24Z<p>I0n0s: Änderung 26308 von I0n0s (Diskussion) rückgängig gemacht.</p>
<hr />
<div>= Frustum Culling =<br />
<br />
== Einleitung ==<br />
<br />
Wenn man dabei ist, eine 3D-Engine auf eigene Faust zu programmieren, wird man irgendwann damit konfrontiert das mit steigender Szenenkomplexität alles langsamer wird und dies obwohl immer nur ein Teil der Umgebung sichtbar ist.<br />
<br />
Moderne Grafikkarten besitzen einen Z-Puffer und andere Techniken um festzustellen, ob ein Pixel gesetzt wird oder nicht, aber bevor sie dies feststellen können, brauchen sie die Geometriedaten der Szene. Dann erst macht die Grafikkarte ihre Sichtbarkeitsoptimierungen und Tiefentests.<br />
Wenn ein Objekt hinter einem anderen liegt, oder außerhalb des Sichtbereiches ist, wird die Grafikkarte so schlau sein und dies merken. Aber selbst wenn das Objekt dann nicht gezeichnet wird, drückt es die Geschwindigkeit, da dessen Geometriedaten erstmal über den Bus zur Grafikkarte gelangen müssen.<br />
<br />
Frustum Culling ist nun eine einfache Methode, um '''vor''' dem Senden der Geometriedaten festzustellen, ob ein Objekt im Sichtfeld liegt oder nicht. Dies spart jede Menge Bandbreite und bedeutet Arbeitsersparnis für den 3D-Beschleuniger.<br />
<br />
<br />
In diesem Tutorial werde ich deshalb zeigen, wie man Frustum Culling implementiert und nutzt. Es ist wirklich wenig Arbeit, aber eine sehr effiziente Art seine Rendergeschwindigkeit drastisch zu erhöhen.<br />
<br />
== Die TFrustum Klasse ==<br />
<br />
Wir werden das Frustum Culling mit Hilfe einer handlichen, TFrustum genannten, Klasse implementieren um die Dinge etwas einfacher zu machen. Hier die Klassendeklaration :<br />
<br />
<source lang="pascal"><br />
TFrustum = object<br />
Frustum : array[0..5,0..3] of Single;<br />
function IsPointWithin(const pX, pY, pZ : Single) : Boolean;<br />
function IsBoxWithin(const pX, pY, pZ, pB, pH, pT : Single) : Boolean;<br />
procedure Calculate;<br />
end;<br />
</source><br />
<br />
== Etwas Vorarbeit ==<br />
<br />
Als Erstes brauchen wir für unsere Klasse einige Konstanten, die uns das Leben deutlich einfacher machen. Im Grunde selbst erklärend:<br />
<br />
<source lang="pascal"><br />
const<br />
Right = 0;<br />
Left = 1;<br />
Bottom = 2;<br />
Top = 3;<br />
Back = 4;<br />
Front = 5;<br />
A = 0;<br />
B = 1;<br />
C = 2;<br />
D = 3;<br />
</source><br />
<br />
Jetzt kommt Mathematik ins Spiel. Wir müssen noch eine Funktion definieren, in der wir die berechneten Ebenen des Frustums normalisieren:<br />
<br />
<source lang="pascal"><br />
procedure NormalizePlane(var pFrustum: TFrustum; pPlane: Integer);<br />
var<br />
Magnitude: Single;<br />
begin<br />
Magnitude := Sqrt(Sqr(pFrustum.Frustum[pPlane][A]) + Sqr(pFrustum.Frustum[pPlane][B]) + Sqr(pFrustum.Frustum[pPlane][C]));<br />
pFrustum.Frustum[pPlane][A] := pFrustum.Frustum[pPlane][A] / Magnitude;<br />
pFrustum.Frustum[pPlane][B] := pFrustum.Frustum[pPlane][B] / Magnitude;<br />
pFrustum.Frustum[pPlane][C] := pFrustum.Frustum[pPlane][C] / Magnitude;<br />
pFrustum.Frustum[pPlane][D] := pFrustum.Frustum[pPlane][D] / Magnitude;<br />
end;<br />
</source><br />
<br />
== Das Frustum berechnen(procedure Calculate) ==<br />
<br />
Zu aller Erst der wichtigste Teil der TFrustum Klasse : Die Berechnung des Selbigen. Bevor wir also feststellen könne, ob ein Objekt im Frustum liegt oder nicht, müssen wir zuerst dessen 6 Flächen berechnen.<br />
<br />
<source lang="pascal"><br />
procedure TFrustum.Calculate;<br />
var<br />
ProjM, ModM, Clip : array[0..15] of Single;<br />
begin<br />
glGetFloatv(GL_PROJECTION_MATRIX, @ProjM);<br />
glGetFloatv(GL_MODELVIEW_MATRIX, @ModM);<br />
Clip[ 0] := ModM[ 0]*ProjM[ 0] + ModM[ 1]*ProjM[ 4] +<br />
ModM[ 2]*ProjM[ 8] + ModM[ 3]*ProjM[12];<br />
Clip[ 1] := ModM[ 0]*ProjM[ 1] + ModM[ 1]*ProjM[ 5] +<br />
ModM[ 2]*ProjM[ 9] + ModM[ 3]*ProjM[13];<br />
Clip[ 2] := ModM[ 0]*ProjM[ 2] + ModM[ 1]*ProjM[ 6] +<br />
ModM[ 2]*ProjM[10] + ModM[ 3]*ProjM[14];<br />
Clip[ 3] := ModM[ 0]*ProjM[ 3] + ModM[ 1]*ProjM[ 7] +<br />
ModM[ 2]*ProjM[11] + ModM[ 3]*ProjM[15];<br />
Clip[ 4] := ModM[ 4]*ProjM[ 0] + ModM[ 5]*ProjM[ 4] +<br />
ModM[ 6]*ProjM[ 8] + ModM[ 7]*ProjM[12];<br />
Clip[ 5] := ModM[ 4]*ProjM[ 1] + ModM[ 5]*ProjM[ 5] +<br />
ModM[ 6]*ProjM[ 9] + ModM[ 7]*ProjM[13];<br />
Clip[ 6] := ModM[ 4]*ProjM[ 2] + ModM[ 5]*ProjM[ 6] +<br />
ModM[ 6]*ProjM[10] + ModM[ 7]*ProjM[14];<br />
Clip[ 7] := ModM[ 4]*ProjM[ 3] + ModM[ 5]*ProjM[ 7] +<br />
ModM[ 6]*ProjM[11] + ModM[ 7]*ProjM[15];<br />
Clip[ 8] := ModM[ 8]*ProjM[ 0] + ModM[ 9]*ProjM[ 4] +<br />
ModM[10]*ProjM[ 8] + ModM[11]*ProjM[12];<br />
Clip[ 9] := ModM[ 8]*ProjM[ 1] + ModM[ 9]*ProjM[ 5] +<br />
ModM[10]*ProjM[ 9] + ModM[11]*ProjM[13];<br />
Clip[10] := ModM[ 8]*ProjM[ 2] + ModM[ 9]*ProjM[ 6] +<br />
ModM[10]*ProjM[10] + ModM[11]*ProjM[14];<br />
Clip[11] := ModM[ 8]*ProjM[ 3] + ModM[ 9]*ProjM[ 7] +<br />
ModM[10]*ProjM[11] + ModM[11]*ProjM[15];<br />
Clip[12] := ModM[12]*ProjM[ 0] + ModM[13]*ProjM[ 4] +<br />
ModM[14]*ProjM[ 8] + ModM[15]*ProjM[12];<br />
Clip[13] := ModM[12]*ProjM[ 1] + ModM[13]*ProjM[ 5] +<br />
ModM[14]*ProjM[ 9] + ModM[15]*ProjM[13];<br />
Clip[14] := ModM[12]*ProjM[ 2] + ModM[13]*ProjM[ 6] +<br />
ModM[14]*ProjM[10] + ModM[15]*ProjM[14];<br />
Clip[15] := ModM[12]*ProjM[ 3] + ModM[13]*ProjM[ 7] +<br />
ModM[14]*ProjM[11] + ModM[15]*ProjM[15];<br />
{...}<br />
</source><br />
<br />
<br />
In Zeile [05] extrahieren wir die momentane Projektionsmatrix und speichern sie in einem 16 Single-Werte enthaltendem Array, selbiges tun wir dann in Zeile [06] mit der aktuellen Modelbetrachtungsmatrix.<br />
Diese beiden Matrizen werden dann in den Zeilen [07] bis [22] multipliziert und werden als unsere Clipping-Matrix gespeichert.<br />
<br />
Die folgenden Zeilen berechnen nun endlich die sechs Flächen unserer Frustumbox. Die Namen der Flächen wurden vorher in der globalen Konstantensektion dieser Unit deklariert.<br />
<br />
<source lang="pascal"><br />
Frustum[Right][A] := clip[ 3] - clip[ 0];<br />
Frustum[Right][B] := clip[ 7] - clip[ 4];<br />
Frustum[Right][C] := clip[11] - clip[ 8];<br />
Frustum[Right][D] := clip[15] - clip[12];<br />
NormalizePlane(self, Right);<br />
<br />
Frustum[Left][A] := clip[ 3] + clip[ 0];<br />
Frustum[Left][B] := clip[ 7] + clip[ 4];<br />
Frustum[Left][C] := clip[11] + clip[ 8];<br />
Frustum[Left][D] := clip[15] + clip[12];<br />
NormalizePlane(self, Left);<br />
<br />
Frustum[Bottom][A] := clip[ 3] + clip[ 1];<br />
Frustum[Bottom][B] := clip[ 7] + clip[ 5];<br />
Frustum[Bottom][C] := clip[11] + clip[ 9];<br />
Frustum[Bottom][D] := clip[15] + clip[13];<br />
NormalizePlane(self, Bottom);<br />
<br />
Frustum[Top][A] := clip[ 3] - clip[ 1];<br />
Frustum[Top][B] := clip[ 7] - clip[ 5];<br />
Frustum[Top][C] := clip[11] - clip[ 9];<br />
Frustum[Top][D] := clip[15] - clip[13];<br />
NormalizePlane(self, Top);<br />
<br />
Frustum[Back][A] := clip[ 3] - clip[ 2];<br />
Frustum[Back][B] := clip[ 7] - clip[ 6];<br />
Frustum[Back][C] := clip[11] - clip[10];<br />
Frustum[Back][D] := clip[15] - clip[14];<br />
NormalizePlane(self, Back);<br />
<br />
Frustum[Front][A] := clip[ 3] + clip[ 2];<br />
Frustum[Front][B] := clip[ 7] + clip[ 6];<br />
Frustum[Front][C] := clip[11] + clip[10];<br />
Frustum[Front][D] := clip[15] + clip[14];<br />
NormalizePlane(self, Front);<br />
end;<br />
</source><br />
<br />
Diese Berechnungen speichern ihr Ergebnis im Frustum-Array unserer TFrustum Klasse. Die Berechnung des Frustums muss nach jeder Blickwinkeländerung erfolgen. Wenn man zu faul ist, dies zu erfassen, kann man das Frustum auch einfach in jedem Frame nach dem Setzen des Blickwinkels berechnen.<br />
<br />
== Punkt im Frustum? ==<br />
<br />
Der einfachste Sichtbarkeitstest ist festzustellen ob ein einzelner Punkt im Frustum liegt. Dies ist der Fall, wenn die Entfernung des Punktes zu allen sechs Flächen des Frustums positiv ist. (D.h. dass der Punkt vor allen Flächen liegt. Ist die Entfernung negativ, so liegt er dahinter.)<br />
<br />
Um dies zu berechnen, nutzen wir folgende einfache Formel:<br />
<br />
<source lang="pascal"> Distance := (A*x) + (B*y) + (C*z) + D </source><br />
<br />
Die Funktion TFrustum.IsPointWithin(const pX, pY, pZ : Single) : Boolean durchläuft nun ganz einfach in einer Schleife alle sechs Flächen und berechnet die Entfernung des Punktes zu dieser Fläche. Wenn die Distanz negativ ist, der Punkt also dahinter liegt, so liefert die Funktion False zurück.<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsPointWithin(const pX, pY, pZ : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
if (Frustum[i][A]*pX + Frustum[i][B]*pY +<br />
Frustum[i][C]*pZ + Frustum[i][D]) <= 0 then<br />
begin<br />
Result := False;<br />
exit;<br />
end;<br />
end;<br />
</source><br />
<br />
== Kugel im Frustum? ==<br />
<br />
Nachdem wir nun feststellen können, ob ein Punkt im Frustum liegt, ist selbiges mit einer Kugel ein Leichtes. Wie man wissen sollte, lässt sich eine Kugel durch zwei Attribute darstellen : Ihren Ursprungspunkt und ihren Radius.<br />
Diese Funktion ersetzt also ganz einfach den Distanztest <=0 mit einem Distanztest gegen den negativen Radius der Kugel. Also ziemlich einfach, oder?<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsSphereWithin(const pX, pY, pZ,<br />
pRadius : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
if (Frustum[i][A]*pX + Frustum[i][B]*pY +<br />
Frustum[i][C]*pZ + Frustum[i][D]) <= -pRadius then<br />
begin<br />
Result := False;<br />
exit;<br />
end;<br />
end;<br />
</source><br />
<br />
<br />
Dies ist der wohl meist genutzte Sichtbarkeitstest. Dies hat drei Gründe :<br />
<br />
1.: Dieser Test ist der schnellste, da nur sechs Berechnungen anfallen.<br />
<br />
2.: Die Begrenzung der meisten Objekte lassen sich als Kugel beschreiben.<br />
<br />
3.: Für eine Kugel wird nur der Speicherplatz von vier Single-Werten benötigt.<br />
<br />
Wenn es also geht, sollte man diesen Test dem Quadertest vorziehen.<br />
<br />
<br />
== Quader im Frustum? ==<br />
<br />
Festzustellen, ob sich ein Quader im Frustum befindet, ist nicht viel schwerer als dies mit einer Kugel ist. Wie bekannt, besteht ein Quader aus acht Ecken. Also durchläuft die Funktion eine Schleife durch alle sechs Frustumflächen und prüft ob eine der Ecken vor einer der Flächen liegt. Ist dies der Fall, wird die Schleife unterbrochen.<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsBoxWithin<br />
(const pX, pY, pZ, pB, pH, pT : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
begin<br />
if (Frustum[i][A]*(pX-pB) + Frustum[i][B]*(pY-pH) +<br />
Frustum[i][C]*(pZ-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
Result := False;<br />
end;<br />
end;<br />
</source><br />
<br />
Wie vorher gesagt, benötigt dieser Test mehr Berechnungen als der Kugeltest(bis zu 48). Wenn man also eine Kugel statt eines Quaders als Begrenzung für ein Objekt nutzen kann, sollte man das tun. Dies spart jede Menge Berechnungen.<br />
<br />
== Das Beispielprogramm ==<br />
<br />
Das Beispielprogramm rendert jede Menge Kugeln und prüft deren Sichtbarkeit via Frustum Culling bevor diese zur Grafikkarte gesendet werden. Mit Hilfe des Buttons kann das Frustum Culling ein- bzw. ausgeschaltet werden, um den Geschwindigkeitsunterschied leichter zu erkennen.<br />
<br />
[[Bild:Tutorial_Frustum_Culling01.jpg]]<br />
<br />
*[http://www.delphigl.de/files/frustumcull.zip Das Frustum-Culling Demo (inklusive Quellcode) herunterladen]<br />
<br />
<br />
<br />
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]<br />
<br />
[[Kategorie:Tutorial|Frustum Culling]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Tutorial_Frustum_Culling&diff=26308Tutorial Frustum Culling2015-05-12T10:42:45Z<p>I0n0s: /* Das Frustum berechnen(procedure Calculate) */</p>
<hr />
<div>= Frustum Culling =<br />
<br />
== Einleitung ==<br />
<br />
Wenn man dabei ist, eine 3D-Engine auf eigene Faust zu programmieren, wird man irgendwann damit konfrontiert das mit steigender Szenenkomplexität alles langsamer wird und dies obwohl immer nur ein Teil der Umgebung sichtbar ist.<br />
<br />
Moderne Grafikkarten besitzen einen Z-Puffer und andere Techniken um festzustellen, ob ein Pixel gesetzt wird oder nicht, aber bevor sie dies feststellen können, brauchen sie die Geometriedaten der Szene. Dann erst macht die Grafikkarte ihre Sichtbarkeitsoptimierungen und Tiefentests.<br />
Wenn ein Objekt hinter einem anderen liegt, oder außerhalb des Sichtbereiches ist, wird die Grafikkarte so schlau sein und dies merken. Aber selbst wenn das Objekt dann nicht gezeichnet wird, drückt es die Geschwindigkeit, da dessen Geometriedaten erstmal über den Bus zur Grafikkarte gelangen müssen.<br />
<br />
Frustum Culling ist nun eine einfache Methode, um '''vor''' dem Senden der Geometriedaten festzustellen, ob ein Objekt im Sichtfeld liegt oder nicht. Dies spart jede Menge Bandbreite und bedeutet Arbeitsersparnis für den 3D-Beschleuniger.<br />
<br />
<br />
In diesem Tutorial werde ich deshalb zeigen, wie man Frustum Culling implementiert und nutzt. Es ist wirklich wenig Arbeit, aber eine sehr effiziente Art seine Rendergeschwindigkeit drastisch zu erhöhen.<br />
<br />
== Die TFrustum Klasse ==<br />
<br />
Wir werden das Frustum Culling mit Hilfe einer handlichen, TFrustum genannten, Klasse implementieren um die Dinge etwas einfacher zu machen. Hier die Klassendeklaration :<br />
<br />
<source lang="pascal"><br />
TFrustum = object<br />
Frustum : array[0..5,0..3] of Single;<br />
function IsPointWithin(const pX, pY, pZ : Single) : Boolean;<br />
function IsBoxWithin(const pX, pY, pZ, pB, pH, pT : Single) : Boolean;<br />
procedure Calculate;<br />
end;<br />
</source><br />
<br />
== Etwas Vorarbeit ==<br />
<br />
Als Erstes brauchen wir für unsere Klasse einige Konstanten, die uns das Leben deutlich einfacher machen. Im Grunde selbst erklärend:<br />
<br />
<source lang="pascal"><br />
const<br />
Right = 0;<br />
Left = 1;<br />
Bottom = 2;<br />
Top = 3;<br />
Back = 4;<br />
Front = 5;<br />
A = 0;<br />
B = 1;<br />
C = 2;<br />
D = 3;<br />
</source><br />
<br />
Jetzt kommt Mathematik ins Spiel. Wir müssen noch eine Funktion definieren, in der wir die berechneten Ebenen des Frustums normalisieren:<br />
<br />
<source lang="pascal"><br />
procedure NormalizePlane(var pFrustum: TFrustum; pPlane: Integer);<br />
var<br />
Magnitude: Single;<br />
begin<br />
Magnitude := Sqrt(Sqr(pFrustum.Frustum[pPlane][A]) + Sqr(pFrustum.Frustum[pPlane][B]) + Sqr(pFrustum.Frustum[pPlane][C]));<br />
pFrustum.Frustum[pPlane][A] := pFrustum.Frustum[pPlane][A] / Magnitude;<br />
pFrustum.Frustum[pPlane][B] := pFrustum.Frustum[pPlane][B] / Magnitude;<br />
pFrustum.Frustum[pPlane][C] := pFrustum.Frustum[pPlane][C] / Magnitude;<br />
pFrustum.Frustum[pPlane][D] := pFrustum.Frustum[pPlane][D] / Magnitude;<br />
end;<br />
</source><br />
<br />
== Das Frustum berechnen(procedure Calculate) ==<br />
<br />
Zu aller Erst der wichtigste Teil der TFrustum Klasse : Die Berechnung des Selbigen. Bevor wir also feststellen könne, ob ein Objekt im Frustum liegt oder nicht, müssen wir zuerst dessen 6 Flächen berechnen.<br />
<br />
<source lang="pascal"><br />
procedure TFrustum.Calculate;<br />
var<br />
ProjM, ModM, Clip : array[0..15] of Single;<br />
begin<br />
glGetFloatv(GL_PROJECTION_MATRIX, @ProjM);<br />
glGetFloatv(GL_MODELVIEW_MATRIX, @ModM);<br />
Clip[ 0] := ModM[ 0]*ProjM[ 0] + ModM[ 1]*ProjM[ 4] +<br />
ModM[ 2]*ProjM[ 8] + ModM[ 3]*ProjM[12];<br />
Clip[ 1] := ModM[ 0]*ProjM[ 1] + ModM[ 1]*ProjM[ 5] +<br />
ModM[ 2]*ProjM[ 9] + ModM[ 3]*ProjM[13];<br />
Clip[ 2] := ModM[ 0]*ProjM[ 2] + ModM[ 1]*ProjM[ 6] +<br />
ModM[ 2]*ProjM[10] + ModM[ 3]*ProjM[14];<br />
Clip[ 3] := ModM[ 0]*ProjM[ 3] + ModM[ 1]*ProjM[ 7] +<br />
ModM[ 2]*ProjM[11] + ModM[ 3]*ProjM[15];<br />
Clip[ 4] := ModM[ 4]*ProjM[ 0] + ModM[ 5]*ProjM[ 4] +<br />
ModM[ 6]*ProjM[ 8] + ModM[ 7]*ProjM[12];<br />
Clip[ 5] := ModM[ 4]*ProjM[ 1] + ModM[ 5]*ProjM[ 5] +<br />
ModM[ 6]*ProjM[ 9] + ModM[ 7]*ProjM[13];<br />
Clip[ 6] := ModM[ 4]*ProjM[ 2] + ModM[ 5]*ProjM[ 6] +<br />
ModM[ 6]*ProjM[10] + ModM[ 7]*ProjM[14];<br />
Clip[ 7] := ModM[ 4]*ProjM[ 3] + ModM[ 5]*ProjM[ 7] +<br />
ModM[ 6]*ProjM[11] + ModM[ 7]*ProjM[15];<br />
Clip[ 8] := ModM[ 8]*ProjM[ 0] + ModM[ 9]*ProjM[ 4] +<br />
ModM[10]*ProjM[ 8] + ModM[11]*ProjM[12];<br />
Clip[ 9] := ModM[ 8]*ProjM[ 1] + ModM[ 9]*ProjM[ 5] +<br />
ModM[10]*ProjM[ 9] + ModM[11]*ProjM[13];<br />
Clip[10] := ModM[ 8]*ProjM[ 2] + ModM[ 9]*ProjM[ 6] +<br />
ModM[10]*ProjM[10] + ModM[11]*ProjM[14];<br />
Clip[11] := ModM[ 8]*ProjM[ 3] + ModM[ 9]*ProjM[ 7] +<br />
ModM[10]*ProjM[11] + ModM[11]*ProjM[15];<br />
Clip[12] := ModM[12]*ProjM[ 0] + ModM[13]*ProjM[ 4] +<br />
ModM[14]*ProjM[ 8] + ModM[15]*ProjM[12];<br />
Clip[13] := ModM[12]*ProjM[ 1] + ModM[13]*ProjM[ 5] +<br />
ModM[14]*ProjM[ 9] + ModM[15]*ProjM[13];<br />
Clip[14] := ModM[12]*ProjM[ 2] + ModM[13]*ProjM[ 6] +<br />
ModM[14]*ProjM[10] + ModM[15]*ProjM[14];<br />
Clip[15] := ModM[12]*ProjM[ 3] + ModM[13]*ProjM[ 7] +<br />
ModM[14]*ProjM[11] + ModM[15]*ProjM[15];<br />
{...}<br />
</source><br />
<br />
<br />
In Zeile [05] extrahieren wir die momentane Projektionsmatrix und speichern sie in einem 16 Single-Werte enthaltendem Array, selbiges tun wir dann in Zeile [06] mit der aktuellen Modelbetrachtungsmatrix.<br />
Diese beiden Matrizen werden dann in den Zeilen [07] bis [22] multipliziert und werden als unsere Clipping-Matrix gespeichert.<br />
<br />
Die folgenden Zeilen berechnen nun endlich die sechs Flächen unserer Frustumbox. Die Namen der Flächen wurden vorher in der globalen Konstantensektion dieser Unit deklariert.<br />
<br />
<source lang="pascal"><br />
Frustum[Right][A] := clip[ 3] - clip[ 0];<br />
Frustum[Right][B] := clip[ 7] - clip[ 4];<br />
Frustum[Right][C] := clip[11] - clip[ 8];<br />
Frustum[Right][D] := clip[15] - clip[12];<br />
NormalizePlane(self, Right);<br />
<br />
Frustum[Left][A] := clip[ 3] + clip[ 0];<br />
Frustum[Left][B] := clip[ 7] + clip[ 4];<br />
Frustum[Left][C] := clip[11] + clip[ 8];<br />
Frustum[Left][D] := clip[15] + clip[12];<br />
NormalizePlane(self, Left);<br />
<br />
Frustum[Bottom][A] := clip[ 3] + clip[ 1];<br />
Frustum[Bottom][B] := clip[ 7] + clip[ 5];<br />
Frustum[Bottom][C] := clip[11] + clip[ 9];<br />
Frustum[Bottom][D] := clip[15] + clip[13];<br />
NormalizePlane(self, Bottom);<br />
<br />
Frustum[Top][A] := clip[ 3] - clip[ 1];<br />
Frustum[Top][B] := clip[ 7] - clip[ 5];<br />
Frustum[Top][C] := clip[11] - clip[ 9];<br />
Frustum[Top][D] := clip[15] - clip[13];<br />
NormalizePlane(self, Top);<br />
<br />
Frustum[Back][A] := clip[ 3] - clip[ 2];<br />
Frustum[Back][B] := clip[ 7] - clip[ 6];<br />
Frustum[Back][C] := clip[11] - clip[10];<br />
Frustum[Back][D] := clip[15] - clip[14];<br />
NormalizePlane(self, Back);<br />
<br />
Frustum[Front][A] := clip[ 3] + clip[ 2];<br />
Frustum[Front][B] := clip[ 7] + clip[ 6];<br />
Frustum[Front][C] := clip[11] + clip[10];<br />
Frustum[Front][D] := clip[15] + clip[14];<br />
NormalizePlane(self, Front);<br />
end;<br />
</source><br />
<br />
Diese Berechnungen speichern ihr Ergebnis im Frustum-Array unserer TFrustum Klasse. Die Berechnung des Frustums muss nach jeder Blickwinkeländerung erfolgen. Wenn man zu faul ist, dies zu erfassen, kann man das Frustum auch einfach in jedem Frame nach dem Setzen des Blickwinkels berechnen.<br />
<br />
Mathematisch gesehen haben wir die Normalen der Ebenen des Frustums berechnet.<br />
<br />
== Punkt im Frustum? ==<br />
<br />
Der einfachste Sichtbarkeitstest ist festzustellen ob ein einzelner Punkt im Frustum liegt. Dies ist der Fall, wenn die Entfernung des Punktes zu allen sechs Flächen des Frustums positiv ist. (D.h. dass der Punkt vor allen Flächen liegt. Ist die Entfernung negativ, so liegt er dahinter.)<br />
<br />
Um dies zu berechnen, nutzen wir folgende einfache Formel:<br />
<br />
<source lang="pascal"> Distance := (A*x) + (B*y) + (C*z) + D </source><br />
<br />
Die Funktion TFrustum.IsPointWithin(const pX, pY, pZ : Single) : Boolean durchläuft nun ganz einfach in einer Schleife alle sechs Flächen und berechnet die Entfernung des Punktes zu dieser Fläche. Wenn die Distanz negativ ist, der Punkt also dahinter liegt, so liefert die Funktion False zurück.<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsPointWithin(const pX, pY, pZ : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
if (Frustum[i][A]*pX + Frustum[i][B]*pY +<br />
Frustum[i][C]*pZ + Frustum[i][D]) <= 0 then<br />
begin<br />
Result := False;<br />
exit;<br />
end;<br />
end;<br />
</source><br />
<br />
== Kugel im Frustum? ==<br />
<br />
Nachdem wir nun feststellen können, ob ein Punkt im Frustum liegt, ist selbiges mit einer Kugel ein Leichtes. Wie man wissen sollte, lässt sich eine Kugel durch zwei Attribute darstellen : Ihren Ursprungspunkt und ihren Radius.<br />
Diese Funktion ersetzt also ganz einfach den Distanztest <=0 mit einem Distanztest gegen den negativen Radius der Kugel. Also ziemlich einfach, oder?<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsSphereWithin(const pX, pY, pZ,<br />
pRadius : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
if (Frustum[i][A]*pX + Frustum[i][B]*pY +<br />
Frustum[i][C]*pZ + Frustum[i][D]) <= -pRadius then<br />
begin<br />
Result := False;<br />
exit;<br />
end;<br />
end;<br />
</source><br />
<br />
<br />
Dies ist der wohl meist genutzte Sichtbarkeitstest. Dies hat drei Gründe :<br />
<br />
1.: Dieser Test ist der schnellste, da nur sechs Berechnungen anfallen.<br />
<br />
2.: Die Begrenzung der meisten Objekte lassen sich als Kugel beschreiben.<br />
<br />
3.: Für eine Kugel wird nur der Speicherplatz von vier Single-Werten benötigt.<br />
<br />
Wenn es also geht, sollte man diesen Test dem Quadertest vorziehen.<br />
<br />
<br />
== Quader im Frustum? ==<br />
<br />
Festzustellen, ob sich ein Quader im Frustum befindet, ist nicht viel schwerer als dies mit einer Kugel ist. Wie bekannt, besteht ein Quader aus acht Ecken. Also durchläuft die Funktion eine Schleife durch alle sechs Frustumflächen und prüft ob eine der Ecken vor einer der Flächen liegt. Ist dies der Fall, wird die Schleife unterbrochen.<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsBoxWithin<br />
(const pX, pY, pZ, pB, pH, pT : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
begin<br />
if (Frustum[i][A]*(pX-pB) + Frustum[i][B]*(pY-pH) +<br />
Frustum[i][C]*(pZ-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
Result := False;<br />
end;<br />
end;<br />
</source><br />
<br />
Wie vorher gesagt, benötigt dieser Test mehr Berechnungen als der Kugeltest(bis zu 48). Wenn man also eine Kugel statt eines Quaders als Begrenzung für ein Objekt nutzen kann, sollte man das tun. Dies spart jede Menge Berechnungen.<br />
<br />
== Das Beispielprogramm ==<br />
<br />
Das Beispielprogramm rendert jede Menge Kugeln und prüft deren Sichtbarkeit via Frustum Culling bevor diese zur Grafikkarte gesendet werden. Mit Hilfe des Buttons kann das Frustum Culling ein- bzw. ausgeschaltet werden, um den Geschwindigkeitsunterschied leichter zu erkennen.<br />
<br />
[[Bild:Tutorial_Frustum_Culling01.jpg]]<br />
<br />
*[http://www.delphigl.de/files/frustumcull.zip Das Frustum-Culling Demo (inklusive Quellcode) herunterladen]<br />
<br />
<br />
<br />
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]<br />
<br />
[[Kategorie:Tutorial|Frustum Culling]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Tutorial_Frustum_Culling&diff=26307Tutorial Frustum Culling2015-05-12T10:24:12Z<p>I0n0s: Rechtschreibung</p>
<hr />
<div>= Frustum Culling =<br />
<br />
== Einleitung ==<br />
<br />
Wenn man dabei ist, eine 3D-Engine auf eigene Faust zu programmieren, wird man irgendwann damit konfrontiert das mit steigender Szenenkomplexität alles langsamer wird und dies obwohl immer nur ein Teil der Umgebung sichtbar ist.<br />
<br />
Moderne Grafikkarten besitzen einen Z-Puffer und andere Techniken um festzustellen, ob ein Pixel gesetzt wird oder nicht, aber bevor sie dies feststellen können, brauchen sie die Geometriedaten der Szene. Dann erst macht die Grafikkarte ihre Sichtbarkeitsoptimierungen und Tiefentests.<br />
Wenn ein Objekt hinter einem anderen liegt, oder außerhalb des Sichtbereiches ist, wird die Grafikkarte so schlau sein und dies merken. Aber selbst wenn das Objekt dann nicht gezeichnet wird, drückt es die Geschwindigkeit, da dessen Geometriedaten erstmal über den Bus zur Grafikkarte gelangen müssen.<br />
<br />
Frustum Culling ist nun eine einfache Methode, um '''vor''' dem Senden der Geometriedaten festzustellen, ob ein Objekt im Sichtfeld liegt oder nicht. Dies spart jede Menge Bandbreite und bedeutet Arbeitsersparnis für den 3D-Beschleuniger.<br />
<br />
<br />
In diesem Tutorial werde ich deshalb zeigen, wie man Frustum Culling implementiert und nutzt. Es ist wirklich wenig Arbeit, aber eine sehr effiziente Art seine Rendergeschwindigkeit drastisch zu erhöhen.<br />
<br />
== Die TFrustum Klasse ==<br />
<br />
Wir werden das Frustum Culling mit Hilfe einer handlichen, TFrustum genannten, Klasse implementieren um die Dinge etwas einfacher zu machen. Hier die Klassendeklaration :<br />
<br />
<source lang="pascal"><br />
TFrustum = object<br />
Frustum : array[0..5,0..3] of Single;<br />
function IsPointWithin(const pX, pY, pZ : Single) : Boolean;<br />
function IsBoxWithin(const pX, pY, pZ, pB, pH, pT : Single) : Boolean;<br />
procedure Calculate;<br />
end;<br />
</source><br />
<br />
== Etwas Vorarbeit ==<br />
<br />
Als Erstes brauchen wir für unsere Klasse einige Konstanten, die uns das Leben deutlich einfacher machen. Im Grunde selbst erklärend:<br />
<br />
<source lang="pascal"><br />
const<br />
Right = 0;<br />
Left = 1;<br />
Bottom = 2;<br />
Top = 3;<br />
Back = 4;<br />
Front = 5;<br />
A = 0;<br />
B = 1;<br />
C = 2;<br />
D = 3;<br />
</source><br />
<br />
Jetzt kommt Mathematik ins Spiel. Wir müssen noch eine Funktion definieren, in der wir die berechneten Ebenen des Frustums normalisieren:<br />
<br />
<source lang="pascal"><br />
procedure NormalizePlane(var pFrustum: TFrustum; pPlane: Integer);<br />
var<br />
Magnitude: Single;<br />
begin<br />
Magnitude := Sqrt(Sqr(pFrustum.Frustum[pPlane][A]) + Sqr(pFrustum.Frustum[pPlane][B]) + Sqr(pFrustum.Frustum[pPlane][C]));<br />
pFrustum.Frustum[pPlane][A] := pFrustum.Frustum[pPlane][A] / Magnitude;<br />
pFrustum.Frustum[pPlane][B] := pFrustum.Frustum[pPlane][B] / Magnitude;<br />
pFrustum.Frustum[pPlane][C] := pFrustum.Frustum[pPlane][C] / Magnitude;<br />
pFrustum.Frustum[pPlane][D] := pFrustum.Frustum[pPlane][D] / Magnitude;<br />
end;<br />
</source><br />
<br />
== Das Frustum berechnen(procedure Calculate) ==<br />
<br />
Zu aller Erst der wichtigste Teil der TFrustum Klasse : Die Berechnung des Selbigen. Bevor wir also feststellen könne, ob ein Objekt im Frustum liegt oder nicht, müssen wir zuerst dessen 6 Flächen berechnen.<br />
<br />
<source lang="pascal"><br />
procedure TFrustum.Calculate;<br />
var<br />
ProjM, ModM, Clip : array[0..15] of Single;<br />
begin<br />
glGetFloatv(GL_PROJECTION_MATRIX, @ProjM);<br />
glGetFloatv(GL_MODELVIEW_MATRIX, @ModM);<br />
Clip[ 0] := ModM[ 0]*ProjM[ 0] + ModM[ 1]*ProjM[ 4] +<br />
ModM[ 2]*ProjM[ 8] + ModM[ 3]*ProjM[12];<br />
Clip[ 1] := ModM[ 0]*ProjM[ 1] + ModM[ 1]*ProjM[ 5] +<br />
ModM[ 2]*ProjM[ 9] + ModM[ 3]*ProjM[13];<br />
Clip[ 2] := ModM[ 0]*ProjM[ 2] + ModM[ 1]*ProjM[ 6] +<br />
ModM[ 2]*ProjM[10] + ModM[ 3]*ProjM[14];<br />
Clip[ 3] := ModM[ 0]*ProjM[ 3] + ModM[ 1]*ProjM[ 7] +<br />
ModM[ 2]*ProjM[11] + ModM[ 3]*ProjM[15];<br />
Clip[ 4] := ModM[ 4]*ProjM[ 0] + ModM[ 5]*ProjM[ 4] +<br />
ModM[ 6]*ProjM[ 8] + ModM[ 7]*ProjM[12];<br />
Clip[ 5] := ModM[ 4]*ProjM[ 1] + ModM[ 5]*ProjM[ 5] +<br />
ModM[ 6]*ProjM[ 9] + ModM[ 7]*ProjM[13];<br />
Clip[ 6] := ModM[ 4]*ProjM[ 2] + ModM[ 5]*ProjM[ 6] +<br />
ModM[ 6]*ProjM[10] + ModM[ 7]*ProjM[14];<br />
Clip[ 7] := ModM[ 4]*ProjM[ 3] + ModM[ 5]*ProjM[ 7] +<br />
ModM[ 6]*ProjM[11] + ModM[ 7]*ProjM[15];<br />
Clip[ 8] := ModM[ 8]*ProjM[ 0] + ModM[ 9]*ProjM[ 4] +<br />
ModM[10]*ProjM[ 8] + ModM[11]*ProjM[12];<br />
Clip[ 9] := ModM[ 8]*ProjM[ 1] + ModM[ 9]*ProjM[ 5] +<br />
ModM[10]*ProjM[ 9] + ModM[11]*ProjM[13];<br />
Clip[10] := ModM[ 8]*ProjM[ 2] + ModM[ 9]*ProjM[ 6] +<br />
ModM[10]*ProjM[10] + ModM[11]*ProjM[14];<br />
Clip[11] := ModM[ 8]*ProjM[ 3] + ModM[ 9]*ProjM[ 7] +<br />
ModM[10]*ProjM[11] + ModM[11]*ProjM[15];<br />
Clip[12] := ModM[12]*ProjM[ 0] + ModM[13]*ProjM[ 4] +<br />
ModM[14]*ProjM[ 8] + ModM[15]*ProjM[12];<br />
Clip[13] := ModM[12]*ProjM[ 1] + ModM[13]*ProjM[ 5] +<br />
ModM[14]*ProjM[ 9] + ModM[15]*ProjM[13];<br />
Clip[14] := ModM[12]*ProjM[ 2] + ModM[13]*ProjM[ 6] +<br />
ModM[14]*ProjM[10] + ModM[15]*ProjM[14];<br />
Clip[15] := ModM[12]*ProjM[ 3] + ModM[13]*ProjM[ 7] +<br />
ModM[14]*ProjM[11] + ModM[15]*ProjM[15];<br />
{...}<br />
</source><br />
<br />
<br />
In Zeile [05] extrahieren wir die momentane Projektionsmatrix und speichern sie in einem 16 Single-Werte enthaltendem Array, selbiges tun wir dann in Zeile [06] mit der aktuellen Modelbetrachtungsmatrix.<br />
Diese beiden Matrizen werden dann in den Zeilen [07] bis [22] multipliziert und werden als unsere Clipping-Matrix gespeichert.<br />
<br />
Die folgenden Zeilen berechnen nun endlich die sechs Flächen unserer Frustumbox. Die Namen der Flächen wurden vorher in der globalen Konstantensektion dieser Unit deklariert.<br />
<br />
<source lang="pascal"><br />
Frustum[Right][A] := clip[ 3] - clip[ 0];<br />
Frustum[Right][B] := clip[ 7] - clip[ 4];<br />
Frustum[Right][C] := clip[11] - clip[ 8];<br />
Frustum[Right][D] := clip[15] - clip[12];<br />
NormalizePlane(self, Right);<br />
<br />
Frustum[Left][A] := clip[ 3] + clip[ 0];<br />
Frustum[Left][B] := clip[ 7] + clip[ 4];<br />
Frustum[Left][C] := clip[11] + clip[ 8];<br />
Frustum[Left][D] := clip[15] + clip[12];<br />
NormalizePlane(self, Left);<br />
<br />
Frustum[Bottom][A] := clip[ 3] + clip[ 1];<br />
Frustum[Bottom][B] := clip[ 7] + clip[ 5];<br />
Frustum[Bottom][C] := clip[11] + clip[ 9];<br />
Frustum[Bottom][D] := clip[15] + clip[13];<br />
NormalizePlane(self, Bottom);<br />
<br />
Frustum[Top][A] := clip[ 3] - clip[ 1];<br />
Frustum[Top][B] := clip[ 7] - clip[ 5];<br />
Frustum[Top][C] := clip[11] - clip[ 9];<br />
Frustum[Top][D] := clip[15] - clip[13];<br />
NormalizePlane(self, Top);<br />
<br />
Frustum[Back][A] := clip[ 3] - clip[ 2];<br />
Frustum[Back][B] := clip[ 7] - clip[ 6];<br />
Frustum[Back][C] := clip[11] - clip[10];<br />
Frustum[Back][D] := clip[15] - clip[14];<br />
NormalizePlane(self, Back);<br />
<br />
Frustum[Front][A] := clip[ 3] + clip[ 2];<br />
Frustum[Front][B] := clip[ 7] + clip[ 6];<br />
Frustum[Front][C] := clip[11] + clip[10];<br />
Frustum[Front][D] := clip[15] + clip[14];<br />
NormalizePlane(self, Front);<br />
end;<br />
</source><br />
<br />
Diese Berechnungen speichern ihr Ergebnis im Frustum-Array unserer TFrustum Klasse. Die Berechnung des Frustums muss nach jeder Blickwinkeländerung erfolgen. Wenn man zu faul ist, dies zu erfassen, kann man das Frustum auch einfach in jedem Frame nach dem Setzen des Blickwinkels berechnen.<br />
<br />
== Punkt im Frustum? ==<br />
<br />
Der einfachste Sichtbarkeitstest ist festzustellen ob ein einzelner Punkt im Frustum liegt. Dies ist der Fall, wenn die Entfernung des Punktes zu allen sechs Flächen des Frustums positiv ist. (D.h. dass der Punkt vor allen Flächen liegt. Ist die Entfernung negativ, so liegt er dahinter.)<br />
<br />
Um dies zu berechnen, nutzen wir folgende einfache Formel:<br />
<br />
<source lang="pascal"> Distance := (A*x) + (B*y) + (C*z) + D </source><br />
<br />
Die Funktion TFrustum.IsPointWithin(const pX, pY, pZ : Single) : Boolean durchläuft nun ganz einfach in einer Schleife alle sechs Flächen und berechnet die Entfernung des Punktes zu dieser Fläche. Wenn die Distanz negativ ist, der Punkt also dahinter liegt, so liefert die Funktion False zurück.<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsPointWithin(const pX, pY, pZ : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
if (Frustum[i][A]*pX + Frustum[i][B]*pY +<br />
Frustum[i][C]*pZ + Frustum[i][D]) <= 0 then<br />
begin<br />
Result := False;<br />
exit;<br />
end;<br />
end;<br />
</source><br />
<br />
== Kugel im Frustum? ==<br />
<br />
Nachdem wir nun feststellen können, ob ein Punkt im Frustum liegt, ist selbiges mit einer Kugel ein Leichtes. Wie man wissen sollte, lässt sich eine Kugel durch zwei Attribute darstellen : Ihren Ursprungspunkt und ihren Radius.<br />
Diese Funktion ersetzt also ganz einfach den Distanztest <=0 mit einem Distanztest gegen den negativen Radius der Kugel. Also ziemlich einfach, oder?<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsSphereWithin(const pX, pY, pZ,<br />
pRadius : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
if (Frustum[i][A]*pX + Frustum[i][B]*pY +<br />
Frustum[i][C]*pZ + Frustum[i][D]) <= -pRadius then<br />
begin<br />
Result := False;<br />
exit;<br />
end;<br />
end;<br />
</source><br />
<br />
<br />
Dies ist der wohl meist genutzte Sichtbarkeitstest. Dies hat drei Gründe :<br />
<br />
1.: Dieser Test ist der schnellste, da nur sechs Berechnungen anfallen.<br />
<br />
2.: Die Begrenzung der meisten Objekte lassen sich als Kugel beschreiben.<br />
<br />
3.: Für eine Kugel wird nur der Speicherplatz von vier Single-Werten benötigt.<br />
<br />
Wenn es also geht, sollte man diesen Test dem Quadertest vorziehen.<br />
<br />
<br />
== Quader im Frustum? ==<br />
<br />
Festzustellen, ob sich ein Quader im Frustum befindet, ist nicht viel schwerer als dies mit einer Kugel ist. Wie bekannt, besteht ein Quader aus acht Ecken. Also durchläuft die Funktion eine Schleife durch alle sechs Frustumflächen und prüft ob eine der Ecken vor einer der Flächen liegt. Ist dies der Fall, wird die Schleife unterbrochen.<br />
<br />
<source lang="pascal"><br />
function TFrustum.IsBoxWithin<br />
(const pX, pY, pZ, pB, pH, pT : Single) : Boolean;<br />
var<br />
i : Integer;<br />
begin<br />
Result := true;<br />
for i := 0 to 5 do<br />
begin<br />
if (Frustum[i][A]*(pX-pB) + Frustum[i][B]*(pY-pH) +<br />
Frustum[i][C]*(pZ-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz-pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py-pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px-pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
if (Frustum[i][A]*(px+pB) + Frustum[i][B]*(py+pH) +<br />
Frustum[i][C]*(pz+pT) + Frustum[i][D]>0) then<br />
continue;<br />
Result := False;<br />
end;<br />
end;<br />
</source><br />
<br />
Wie vorher gesagt, benötigt dieser Test mehr Berechnungen als der Kugeltest(bis zu 48). Wenn man also eine Kugel statt eines Quaders als Begrenzung für ein Objekt nutzen kann, sollte man das tun. Dies spart jede Menge Berechnungen.<br />
<br />
== Das Beispielprogramm ==<br />
<br />
Das Beispielprogramm rendert jede Menge Kugeln und prüft deren Sichtbarkeit via Frustum Culling bevor diese zur Grafikkarte gesendet werden. Mit Hilfe des Buttons kann das Frustum Culling ein- bzw. ausgeschaltet werden, um den Geschwindigkeitsunterschied leichter zu erkennen.<br />
<br />
[[Bild:Tutorial_Frustum_Culling01.jpg]]<br />
<br />
*[http://www.delphigl.de/files/frustumcull.zip Das Frustum-Culling Demo (inklusive Quellcode) herunterladen]<br />
<br />
<br />
<br />
Autor: [[Benutzer:Sascha_Willems|Sascha Willems]]<br />
<br />
[[Kategorie:Tutorial|Frustum Culling]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2014/Organisation&diff=26200DGL Treffen/2014/Organisation2014-04-20T20:26:15Z<p>I0n0s: </p>
<hr />
<div>Flash wurde wieder genötigt seine Urlaubsplanung zu machen und fragte deshalb in der Community an wann wir uns treffen wöllten.<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://delphigl.com/forum/viewtopic.php?f=4&t=11101 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
'''Mecklenburgische Seenplatte'''<br><br />
Aufgrund eines kleines Buchungsfails haben wir 2 Lokations:<br />
<br />
;29.05. - 31.06.:''Wird noch geklärt.'' <br />
;31.05. - 06.06.: Jagdschloss Waldsee, Feldberger Seenlandschaft<br />
;06.06. - 09.06.: ''Wird noch geklärt. Angebote liegen vor'' (Eventuell verlängerung bis 10.06. möglich)<br />
<br />
==Wann?==<br />
*Anreise: Do 29.05.2014 (Himmelfahrt)<br />
*Abreise: Mo 09.06.2014 (Pfingsten) eventuell 10.06.<br />
<br />
==Was kostet das?==<br />
Für die Übernachter ca 25Eur pro Nacht (gerechnet wenn ca. 5 DGLer da sind) plus Nahrung.<br />
Für Ausflüge, Eintritte etc a. 10Eur - wenn überhaupt<br />
Die Anreise ist, wie üblich, von den Teilnehmern zu tragen. Allerdings versuchen wir natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
Das Ziel war bisher immer die Treffen "Studententauglich" zu machen. Falls ihr irgendwo Probleme seht das zu stemmen, trotzdem aber gern kommen wollt, dann schreibt Flash, Phobeus oder i0n0s an. Wir finden Lösungen.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen. Die Tabelle ist geteilt in 3 Abschnitte da wir 2x umziehen werden.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(11/12=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|colspan=6|'''Unterkunft 1 - 29.01. - 30.01.<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|2<br />
|PKW ab Chemnitz. Entweder via. Dresden+Berlin oder Leipzig+Berlin <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|Phobeus<br />
|X<br />
|<br />
|2<br />
|PKW ab Tespe. Über A24, kurzer Schlenker über HH wäre okay.<br />
|(4 Plätze im PKW frei, je nach Material eher weniger)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|2<br />
|PKW ab Gießen<br />
|(1 Platz frei)<br />
|-<br />
|Lord Horazont<br />
|X<br />
|<br />
|2<br />
|<br />
|Vom 29.05. bis 01.06.<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|colspan=6|'''Unterkunft 2 - Jagdschloss Waldsee - 31.05. - 06.06.'''<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|6<br />
|PKW ab Chemnitz. Entweder via. Dresden+Berlin oder Leipzig+Berlin <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|Phobeus<br />
|X<br />
|<br />
|6<br />
|PKW ab Tespe. Über A24, kurzer Schlenker über HH wäre okay.<br />
|(4 Plätze im PKW frei, je nach Material eher weniger)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|6<br />
|<br />
|<br />
|-<br />
|Lord Horazont<br />
|X<br />
|<br />
|1<br />
|<br />
|Vom 29.05. bis 01.06.<br />
|-<br />
|Frase<br />
|X<br />
|<br />
|1<br />
|<br />
|Ab 05.06. bis max. 10.06.<br />
|-<br />
|Sarah(Frase)<br />
|X<br />
|<br />
|1<br />
|<br />
|Ab 05.06. bis max. 10.06.<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|colspan=6|'''Unterkunft 3 - ??? - 06.06. - 09.06/10.06'''<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|3/4<br />
|PKW ab Chemnitz. Entweder via. Dresden+Berlin oder Leipzig+Berlin <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|Phobeus<br />
|X<br />
|<br />
|3/4<br />
|PKW ab Tespe. Über A24, kurzer Schlenker über HH wäre okay.<br />
|(4 Plätze im PKW frei, je nach Material eher weniger)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|3/4<br />
|<br />
|<br />
|-<br />
|Frase<br />
|X<br />
|<br />
|3/4<br />
|<br />
|Ab 05.06. bis max. 10.06.<br />
|-<br />
|Sarah(Frase)<br />
|X<br />
|<br />
|3/4<br />
|<br />
|Ab 05.06. bis max. 10.06.<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Auto/Mitfahrgelegenheit.<br />
<br />
Mit der Bahn: Fahrt soweit wie möglich Richtung DGL Treffen. Wir haben Autos da und machen dann Shuttle.<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)<br />
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss<br />
* Cocktail Zeug!<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche!<br />
* Handtücher!<br />
* Wechsel-Kleidung (Waschmaschine ist vorhanden)<br />
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen!<br />
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!, Kopfhörer @ Flash...)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Grillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*Umgebung erkunden<br />
*Kleine Badeseen<br />
<br />
==Nahrungsmittel==</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2013/Organisation&diff=25844DGL Treffen/2013/Organisation2013-09-15T10:16:21Z<p>I0n0s: /* Wann? */</p>
<hr />
<div>Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist diesmal bei Kassel.<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://delphigl.com/forum/viewtopic.php?f=4&t=10746 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
'''Kassel'''<br><br />
[http://www.fewo-direkt.de/ferienwohnung-ferienhaus/p549290 Ferienwohnungen], <br><br />
Im Teich 5 <br/><br />
34314 Espenau<br />
<br />
==Wann?==<br />
*Anreise: Sa 28.09.2013<br />
*Abreise: Mo 07.10.2013<br />
<br />
==Was kostet das?==<br />
Für die Übernachter ca 20Eur pro Nacht plus Nahrung.<br />
Für Ausflüge, Museen etc in Kassel ca. 20-30Eur<br />
Die Anreise ist, wie üblich, von den Teilnehmern zu tragen. Allerdings versuchen wir natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(10=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|10 (späte Anreise)<br />
|PKW ab München <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|10<br />
|PKW ab Gießen<br />
|(1 Platz im PKW frei.)<br />
|-<br />
|Phobeus<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|Knittel<br />
|X<br />
|<br />
|3 (28. - 1.)<br />
|PKW ab Frankfurt<br />
|3 Plätze frei<br />
|-<br />
!colspan="6"|Gäste (ohne Übernachtung)<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Auto oder Bahn.<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)<br />
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss<br />
* Cocktail Zeug!<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche!<br />
* Handtücher!<br />
* Wechsel-Kleidung (Waschmaschine ist vorhanden)<br />
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen!<br />
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Grillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*Umgebung erkunden<br />
<br />
==Nahrungsmittel==<br />
Was muss für Sonntag usw besorgt werden (macht Flash):<br />
- Cocktailzeug & Crushed Ice (Flash & i0n0s)<br />
- Knabberzeug (Knittel)<br />
- ''Abendessen???''</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2013/Organisation&diff=25843DGL Treffen/2013/Organisation2013-09-15T10:16:08Z<p>I0n0s: </p>
<hr />
<div>Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist diesmal bei Kassel.<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://delphigl.com/forum/viewtopic.php?f=4&t=10746 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
'''Kassel'''<br><br />
[http://www.fewo-direkt.de/ferienwohnung-ferienhaus/p549290 Ferienwohnungen], <br><br />
Im Teich 5 <br/><br />
34314 Espenau<br />
<br />
==Wann?==<br />
*Anreise: So 28.09.2013<br />
*Abreise: Mo 07.10.2013<br />
<br />
<br />
<br />
==Was kostet das?==<br />
Für die Übernachter ca 20Eur pro Nacht plus Nahrung.<br />
Für Ausflüge, Museen etc in Kassel ca. 20-30Eur<br />
Die Anreise ist, wie üblich, von den Teilnehmern zu tragen. Allerdings versuchen wir natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(10=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|10 (späte Anreise)<br />
|PKW ab München <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|10<br />
|PKW ab Gießen<br />
|(1 Platz im PKW frei.)<br />
|-<br />
|Phobeus<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|Knittel<br />
|X<br />
|<br />
|3 (28. - 1.)<br />
|PKW ab Frankfurt<br />
|3 Plätze frei<br />
|-<br />
!colspan="6"|Gäste (ohne Übernachtung)<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Auto oder Bahn.<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)<br />
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss<br />
* Cocktail Zeug!<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche!<br />
* Handtücher!<br />
* Wechsel-Kleidung (Waschmaschine ist vorhanden)<br />
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen!<br />
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Grillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*Umgebung erkunden<br />
<br />
==Nahrungsmittel==<br />
Was muss für Sonntag usw besorgt werden (macht Flash):<br />
- Cocktailzeug & Crushed Ice (Flash & i0n0s)<br />
- Knabberzeug (Knittel)<br />
- ''Abendessen???''</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2013/Organisation&diff=25830DGL Treffen/2013/Organisation2013-09-05T17:17:24Z<p>I0n0s: /* Wer kommt mit? */</p>
<hr />
<div>Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist diesmal Dresden.<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://delphigl.com/forum/viewtopic.php?f=4&t=10746 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
'''Kassel'''<br><br />
[http://www.fewo-direkt.de/ferienwohnung-ferienhaus/p549290 Ferienwohnungen], <br><br />
???? Straße <br><br />
Kassel<br><br />
<br />
==Wann?==<br />
*Anreise: So 28.09.2013<br />
*Abreise: Mo 07.10.2013<br />
<br />
<br />
<br />
==Was kostet das?==<br />
Für die Übernachter ca 20Eur pro Nacht plus Nahrung.<br />
Für Ausflüge, Museen etc in Kassel ca. 20-30Eur<br />
Die Anreise ist, wie üblich, von den Teilnehmern zu tragen. Allerdings versuchen wir natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(10=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|10 (späte Anreise)<br />
|PKW ab München <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|10<br />
|PKW ab Gießen<br />
|(1 Platz im PKW frei.)<br />
|-<br />
|Phobeus<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|Knittel<br />
|X<br />
|<br />
|3 (28. - 1.)<br />
|PKW ab Frankfurt<br />
|3 Plätze frei<br />
|-<br />
!colspan="6"|Gäste (ohne Übernachtung)<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Auto oder Bahn.<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)<br />
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss<br />
* Cocktail Zeug!<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche!<br />
* Handtücher!<br />
* Wechsel-Kleidung (Waschmaschine ist vorhanden)<br />
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen!<br />
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Grillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*Umgebung erkunden<br />
<br />
==Nahrungsmittel==<br />
Was muss für Sonntag usw besorgt werden (macht Flash):<br />
- Cocktailzeug & Crushed Ice (Flash & i0n0s)<br />
- Knabberzeug (Knittel)<br />
- ''Abendessen???''</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2011&diff=25401DGL Treffen/20112011-09-13T16:53:44Z<p>I0n0s: </p>
<hr />
<div>=4. DGL Treffen in Dresden=<br />
{|{{Prettytable_B1}}<br />
!Ort<br />
|[http://www.cofman.de/detail.php?houseid=29152 Ferienhaus] in Dresden, Sachsen, Deutschland<br />
|-<br />
!Zeit<br />
|04.09.11 - 12.09.11<br />
|-<br />
!Kosten p.P.<br />
|<br />
150 EUR Unterkunft<br />
50 EUR Verpflegung<br />
50 EUR Ausflüge<br />
40-100 EUR Anreise<br />
--------------------<br />
290-350EUR pro Person<br />
|-<br />
!Teilnehmer mit Übernachtung<br />
|Flash, (Frase), i0n0s, Evil-Devil, Phobeus<br />
|-<br />
!Gäste<br />
|Lord Horazont, Ziz<br />
|}<br />
<br />
==Organisation==<br />
Die Organisation würde über diese [[DGL_Treffen/2011/Organisation|Wiki-Seite]] und diesem [http://www.delphigl.com/forum/viewtopic.php?f=4&t=9743&start=0 Thread im DGL Forum] organisiert.<br />
Da Dänemark schon 2 mal dran war, wollte man etwas wirklich exotisches ausprobieren. So bot sich eine Reise in die Hauptstadt des wilden Sachsens an, wo sich Flash als einheimischer Guide anbot und einige Mitglieder mittlerweile sogar wohnhaft sind.<br />
<br />
==Tagebuch==<br />
{|{{Prettytable_B1}}<br />
!Tag<br />
!Bericht<br />
|-<br />
!So 04.09.2011<br />
|Der Tag startete mit der üblichen unvorbereiteten Koffer-Pack-Aktion. Anschließend brachen Evil und Phobeus mit dem PKW aus den Nordlanden auf nach Sachsen. i0n0s verließ sich diesmal auf die Dienste der DB. Flash, der die kürzeste Anreise hatte kam, mit Nahrungsmitteln bepackt, 40Min zu spät (und war leicht gestresst).<br />
<br />
Nachdem die Zimmer bezogen waren und der Proviant verstaut, wurde allen Erfahrungen zum Trotz, eine "schnelle" Runde Brettspiel Starcraft gespielt. Wenige Stunden später bereiteten wir dann das Abendessen vor. Es sollte gegrillt werden. Bis es jedoch so weit war, war der Grillplatz im Garten bereits so dunkel dass nur noch mit Taschenlampe bzw. Handy gegrillt werden konnte. Grillkohle und Anzünder hatten wir vorher "kostengünstig" (umgerechnet eine halbe Herde Rinder) in einer Tankstelle gekauft (es ist Sonntag!).<br />
<br />
Anschließend, es war vor 23Uhr, holten wir zu einer weiteren Partie analogen Starcrafts aus. Dieses mal waren wir alle etwas besser eingespielt, mit der Folge, dass wir gegen '''3Uhr''' Phobeus zum Sieger ausrufen konnten/mussten. Er setzte dabei auf die Strategie: Wenn sich zwei streiten, freut sich Phobeus.<br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!Mo 05.09.2009<br />
|Nach dem ausgedehnten Frühstück wurde Kriegsrat gehalten. Es wurde entsetzt festgestellt, dass wir auch in den nächsten Tagen noch Nahrung konsumieren würden. Aus diesem Grunde teilte sich die Gruppe in "Einkäufer" und "Heimfahrer" (Flash) auf, der noch Spezialitäten für einen indischen Abend holen musste. Doch nicht bevor wir eine Runde "Age of Empires II Conquerers" gespielt hatten.<br />
<br />
Nachdem Gruppe vom Einkauf und Flash, nach kurzem Stau-Aufenthalt, aus Chemnitz wieder zurück war wurde erneut gezockt. Aus unerfindlichen Gründen war Flashs VM nicht davon zu überzeugen erneut AoE2 zu spielen. Deshalb wurde auf das bereits von letzten Treffen bekannte Starcraft umgeschwenkt. <br />
<br />
Das Abendessen bereitete diesmal - eine Premiere - Evil-Devil: Es gab Zanderfilet mit Brechbohnen (die heißen nur so) und Koketten.<br />
<br />
Anschließend verbrachten wir den Abend mit Chips, Caipi und dem Film "Moon".<br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!Di 06.09.2009<br />
|<br />
Nach dem Frühstück, oder je nach Definition auch Brunch, wurden die öffentlichen Verkehrsmittel von Dresden aufgeklärt um danach den heutigen Ausflug ins historische Dresden einzuleiten. Kurz: Kulturalarm!<br />
Wir kauften Tickets für die große Stadtrundfahrt (22 Haltestellen) und ließen uns durch die Stadt fahren. Beeindruckend war schon beim Gang über die Albertbrücke der "Canaletto Blick" genannte Blick auf die Altstadt, welche sich bis ans Elbufer erstreckt. Phobeus fasste die Rundfahrt so zusammen: "Die Dresdner bauen so ziemlich alles aus Sand (Anm: Sandstein und auf Sand gebaut) und bauen halbfertige Brücken über die sie sich dann streiten (Anm: Waldschlösschen Brücke)"<br />
<br />
Nach der knapp 2h fahrt schlenderten wir zur Frauenkirche, wo wir Kaffee und Kuchen im Schatten der Frauenkirche zu uns nahmen. Anschließend gingen wir zum Dresdner Zwinger um dort an der Führung teil zu nehmen. Nein - "Zwinger" hat nichts mit Bären oder Hunden, und auch nichts mit einem Gefängnis zu tun. Der Zwinger wurde benannt nach seinem Bauort und ist der Barocke Schloss und Lustgarten August des Starken.<br />
Danach wanderte die Führung weiter zum Fürstenzug und anschließend zur Frauenkirche, wo wir noch ein Weilchen mit der Fremdenführerin plauschten.<br />
<br />
Als wir wieder in der Wohnung waren, weinten Flash und Phobeus bitterlich in der Küche bei der Zubereitung des indischen Abendessens (viele Zwiebeln mussten geschnippelt werden), während i0n0s und Evil dem dekadenten Mediengenuss (Evil nannte es Arbeiten) nachgingen... <br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!Mi 07.09.2009<br />
|Heute ging es nach dem Frühstück mit dem Auto in die gestern per Bus erkundeten "Hochlagen" von Dresden. Zuerst hielten wir in der mit prächtigen Fließen ausgestatteten und daher wohl prächtigsten Molkerei Deutschlands, wenn nicht Europas oder der Welt, an. Wir sprechen hier von der Molkerei der Gebrüder ''Pfunds''.<br />
<br />
Anschließend fuhren wir nach Pillnitz und wandelten dort durch die Parkanlagen. Phobeus und Flash erlebten dann eine kleine Besonderheit. Als sie am englischen Pavillon standen und durch die Fenster blinzelten kam eine Person die kleine Treppe im Inneren herunter und wollte schnell heraus huschen. Flash sprach ihn an und fragte ob man ein Foto vom Innenbereich des Pavillons machen könnte. Nicht nur das wurde erlaubt sondern auch ein kleiner Blick in die oberen Bereiche des Pavillons der gerade restauriert wurde. Der Restaurator mit dem wir sprachen erklärte uns, dass August III in diesem Räumen seinen Naturstudien nachging.<br />
<br />
Nachdem die Truppen wieder gesammelt waren ging es zurück in die Wohnung. i0n0s und Phobeus gingen einkaufen. Am Abend dann traf Ziz in der Wohnung ein, und somit ein neues Gesicht. Kurz darauf kam auch Lord Horazont, stilgerecht im [[DGL Shirt|DGL-Look]], an. FullHouse! <br />
<br />
Ziz kochte dann ein Chilli sin Carne und Mate-Tee wofür er ebenfalls ein DGL-Shirt verliehen bekam. Flash versuchte anschließend Cocktails für alle herzustellen.<br />
<br />
Nach dem Essen wurde analoges Starcraft gespielt. Mehrere Stunden gingen ins Land und am Ende konnte i0n0s einen knappen Sieg einfahren.<br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!Do 08.09.2009<br />
|Heute war Ausdauer gefragt! Nach dem Frühstück setzen wir uns langsam in Richtung Residenzschloss in Bewegung. Karten für die nächtliche Semperoperführung am Sonntag konnten wir leider nicht vor Ort kaufen.<br />
Doch nun standen erst einmal die Museen auf dem Plan: Das verspiegelte historische grüne Gewölbe (die Schatz- bzw. Prunkkammer der sächsischen Regenten mit Brillanten und feinsten Kunstwerken) sowie das neue grüne Gewölbe (mit weiteren Schätzen, den beschnitzten Kirschkernen, Elfenbein und Kristallbooten usw.), der türckischen Cammer (einem Teil der Waffenkammer) und dem Hausturm (222 Stufen).<br />
Wir verließen die Ausstellungen zum Toresschluss.<br />
<br />
Anschließend waren wir seeeeehr hungrig und brachen wieder nach Hause auf. Hier bereitete i0n0s zwei Pizzableche für die Meute vor.<br />
Nach dem Essen setzen wir uns zum digitalen Starcraft spielen zusammen.<br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!Fr 09.09.2009<br />
|Nach so viel Kultur bedarf es einer Abwechselung. So begannen wir einen ruhigen Tag mit gemütlichem Frühstück und waren ganz entspannt bis ein Wirbelsturm aufkam. Nein, es gab kein Unwetter in Dresden, ''nur'' Frase war aufgetaucht und belebte die Runde. Nachdem er sein Raumwunder von Auto ausgeladen hatte bekam er von Phobeus und Flash noch eine kurze Privatführung in Dresden.<br />
Im Anschluss wurde nochmal der lokale Supermarkt geplündert um für das Wochenende gerüstet zu sein.<br />
Aufgrund der fortgeschrittenen Zeit wurde dann zu Abend einfache Nudeln mit Pesto gekocht und zum Abschluss des Tages "Deliver Us From Evil" geschaut.<br />
<br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!Sa 10.09.2009<br />
|Der Tag begann zur Ausnahme mal früh, weil ein Gast sich angekündigt hat. Das dieser für *früh* ein deutlich anderes Zeitgefühl hat, war zu dem Zeitpunkt noch nicht bekannt. So frühstückten wir und begannen uns auf einen spielerischen Tag vorzubereiten. Im Laufe der Zeit trafen dann auch Ziz und gegen Nachmittag dann auch Horazont ein und wir konnten Patrizier II in großer Runde weiterspielen. Hier zeigten sich die Leute sehr kreativ bei der Benennung ihrer Schiffe und man konnte vom Namen des Schiffes auf ihre Besitzer schließen.<br />
Am Abend konnten die Freunde der ungesunden Lebensweise ausnahmsweise einen Sieg gewinnen: Zum Abendessen wurden Hamburger zubereitet. Keine Sorge, Evil-Devil und phobeus wurde keinen Schaden zugeführt.<br />
Nach der Mahlzeit testeten wir einen 64-Bit-Build von OpenParty. Das Spiel hatte kein Problem mit 5 Controllern und hat ein überzeugendes Verhalten bei defekten Minispielen.<br />
Später bedurfte es wieder Kultur und so besuchten wir die Semperoper zu einer Mitternachtsführung. <br />
''Diese wird Flash hoffentlich beschreiben''<br />
<br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!So 11.09.2009<br />
|Nachdem man sich aus dem Bett erhoben hatten und ausgiebig, nennen wir es "gebruncht", hatte, wurde überlegt was man diesmal machen will. Ziz traf ebenfalls wieder ein und das Wetter machte einen sehr sonnigen Eindruck. Also ging es ins Elbsandsteingebirge in die sächsische Schweiz. genauer: Auf die Bastei.<br />
<br />
Uninformierte glaubten anfänglich noch an einen langweiligen Hügelausflug, doch schon auf der Hinfahrt konnte das Auge die ein oder anderen "herausragenden" Erhebungen erkennen. Die letzten Zweifel ob man die Kamera umsonst mit schleppte verflogen als man von der Bastei aus auf die Sandsteinformationen blickte. Entsprechend kamen die Fotografen - Frase und Flash - auch nur langsam aber stetig klickend voran. Phobeus nutzte das gemächliche Tempo ebenfalls. Ziz und i0n0s starteten zusammen mit Evil in höherer Geschwindigkeit um die Umgebung zu erkunden. Evil ließ sich dann zurück fallen und schloss sich den Knipsern an.<br />
Gegen 17Uhr traf man sich wieder für die Rückreise.<br />
<br />
Evil und Jonas machten diesmal gefüllten Seeige... Puten-Cordonbleu mit Mischgemüse und Pommes. Die Portionen waren einmal mehr sehr reichhaltig. Flash versorgte die Meute mit Cocktails. Währenddessen demonstrierte man reihum seine Fähigkeiten beim PS3 Mortal Combat. <br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
!Mo 12.09.2009<br />
|Heute war Abreisetag. Der verlief harmonischer als sonst, da wir nicht saubermachen mussten. Trotzdem gab es noch genug "Räumungsarbeiten" die sich an das Frühstück anschlossen. <br />
<br />
Zum Abschluss fuhren wir noch einmal auf den Theaterplatz und machten dort unser Abschluss-Foto. Flash brachte dann i0n0s zum Bahnhof während sich alle Anderen wieder auf die Autobahn machten.<br />
|-<br />
|colspan="2"|<br />
{|style="background-color: inherit"<br />
|''Bilder''<br />
|}<br />
|-<br />
<br />
<br />
<br />
|}</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2011/Organisation&diff=25219DGL Treffen/2011/Organisation2011-06-21T22:20:48Z<p>I0n0s: /* Wer kommt mit? */</p>
<hr />
<div>Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist noch zu klären.<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://www.delphigl.com/forum/viewtopic.php?f=4&t=9743&start=0 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
Noch zu klären. Das Haus vom letzten Mal in Dänemark war aber schon ne Marke...<br />
<br />
==Wann?==<br />
*Anreise: entweder Sa 03.09.2011 oder 10.09.2011<br />
*Abreise: jeweils am folgenden Samstag.<br />
<br />
<br />
<br />
==Was kostet das?==<br />
Noch nicht geklärt.<br />
<br />
Die Anreise ist, wie üblich, von den Teilnehmern zu tragen. Allerdings versuchen wir natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(7=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|7<br />
|PKW? <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|i0n0s<br />
|<br />
|<br />
|7<br />
|<br />
|<br />
|-<br />
|iiiich! (Frase)<br />
|x<br />
|<br />
|voll (wieso ist 7 max? mag länger)<br />
|Ja, ich reise an ^.~ Wie, steht noch nicht fest<br />
|Kein Kommentar<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
Ich finde ja die Länge der Tabelle sehr optimistisch *sg* --[[Benutzer:Frase|Frase]] 00:20, 22. Jun. 2011 (CEST)<br />
<br />
==Wie kommt man hin?==<br />
''Erst Ort bestimmen''<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)<br />
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss<br />
* Cocktail Zeug!<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche!<br />
* Handtücher!<br />
* Wechsel-Kleidung (Waschmaschine ist vorhanden)<br />
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen!<br />
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Grillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*Umgebung erkunden</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2011/Organisation&diff=25094DGL Treffen/2011/Organisation2011-06-03T15:50:45Z<p>I0n0s: /* Wer kommt mit? */</p>
<hr />
<div>Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist noch zu klären.<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://www.delphigl.com/forum/viewtopic.php?f=4&t=9743&start=0 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
Noch zu klären. Das Haus vom letzten Mal in Dänemark war aber schon ne Marke...<br />
<br />
==Wann?==<br />
*Anreise: entweder Sa 03.09.2011 oder 10.09.2011<br />
*Abreise: jeweils am folgenden Samstag.<br />
<br />
<br />
<br />
==Was kostet das?==<br />
Noch nicht geklärt.<br />
<br />
Die Anreise ist, wie üblich, von den Teilnehmern zu tragen. Allerdings versuchen wir natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(7=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|7<br />
|PKW? <br />
|(3 Plätze im PKW frei.)<br />
|-<br />
|i0n0s<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
''Erst Ort bestimmen''<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)<br />
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss<br />
* Cocktail Zeug!<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche!<br />
* Handtücher!<br />
* Wechsel-Kleidung (Waschmaschine ist vorhanden)<br />
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen!<br />
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Grillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*Umgebung erkunden</div>I0n0shttps://wiki.delphigl.com/index.php?title=Team&diff=24768Team2010-03-14T23:39:59Z<p>I0n0s: /* Moderatoren */</p>
<hr />
<div>= Vorwort =<br />
<br />
Auf dieser Seite befindet sich eine Auflistung der Personen, die momentan aktiv daran arbeiten, dass DGL Euch wie gewohnt im Netz mit Informationen versorgt. Bitte beachtet, dass die meisten der Personen nur einen begrenzten Vorrat an Zeit haben. Überlegt daher bitte sorgsam, an wen Ihr Euch wendet.<br />
<br />
Im unteren Teil dieser Seite sind die verschiedenen Bereiche von DGL und deren Betreuer aufgelistet. Bitte wendet auch an den passenden Ansprechpartner.<br />
<br />
Diese Seite ersetzt nicht das '''[http://www.delphigl.com/launcher.php?em=impressum IMPRESSUM]'''.<br />
<br />
= Das Team im Ganzen =<br />
In diesen Abschnitt ist aufgelistet '''wer''' bei [[DelphiGL]] Verantwortung für einen Teil übernommen hat, und '''was''' genau er macht.<br />
== Moderatoren ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Phobeus|Phobeus]] <br />
|{{eMail|Phobeus|delphigl.com}}<br />
|<br />
*Technische Pflege des Wikis (Wartung/Updates)<br />
*Betreuung der Hardware<br />
*Freischalten von Usern für das Forum<br />
*Freischalten von Usern für das Wiki<br />
*''News eintragen''<br />
*''allgemeine inhaltliche Kontrolle''<br />
*"der Boss"<br />
|-<br />
|[[Benutzer:Flash|Flash]] <br />
|{{eMail|Flash|delphigl.com}}<br />
|<br />
*Inhaltliche Pflege/Koordination des Wikis<br />
*Community-Aktionen<br />
*Tutorial Lektor<br />
*DGL-Poll pflegen<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle im Forum<br />
|-<br />
|[[Benutzer:Frase|Frase]] <br />
|{{eMail|Frase|delphigl.com}}<br />
|<br />
*Technische Unterstützung für Phobeus<br />
*Tutorial Lektor<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle im Forum<br />
|-<br />
|[[Benutzer:Delphic|Delphic]] <br />
|{{eMail|delphic|delphigl.com}}<br />
|<br />
*Freischalten von Usern für das Forum<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:Flo|Flo]]<br />
|{{eMail|Flo|DelphiGL.com}}<br />
|<br />
*DGL-Wiki-Bot Manager<br />
*Freischalten von Usern für das Wiki<br />
*Tutorial Lektor<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:I0n0s|i0n0s]] <br />
|{{eMail|i0n0s|DelphiGL.com}}<br />
|<br />
* DGLSDK<br />
* Freischalten von Usern für das Forum<br />
* Freischalten von Usern für das Wiki <br />
* Tutorial Lektor<br />
* News eintragen<br />
* allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:Sascha Willems|Sascha Willems]] <br />
|{{eMail|webmaster|delphigl.de}}<br />
|<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:Lord_Horazont|Lord Horazont]] <br />
|{{eMail|lord_horazont|DelphiGL.com}}<br />
|<br />
*SVN/WebSVN Betreuung<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
*Freischalten von Usern für das Forum<br />
*Freischalten von Usern für das Wiki<br />
|-<br />
|}<br />
</div><br />
<br />
= Gruppen =<br />
In diesem Teil findet ihr detailierte Informationen, wer für welchen Bereich zuständig ist.<br />
== DGLSDK ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:I0n0s|i0n0s]] <br />
|{{eMail|i0n0s|DelphiGL.com}}<br />
|<br />
|-<br />
|}<br />
</div><br />
<br />
== DGLOpenGL.pas ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Lossy eX|Lossy eX]] <br />
|{{eMail|Lossy|delphigl.com}}<br />
|<br />
*Weiterentwicklung, Debugging<br />
|-<br />
|}<br />
</div><br />
<br />
== Webseite ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Phobeus|Phobeus]] <br />
|{{eMail|Phobeus|delphigl.com}}<br />
|<br />
*Technische Pflege des Seite (Wartung/Updates)<br />
*Coding (Integrieren von Neuerungen)<br />
|-<br />
|[[Benutzer:Lord_Horazont|Lord Horazont]]<br />
|{{eMail|lord_horazont|DelphiGL.com}}<br />
|<br />
*PHP<br />
|-<br />
|[[Benutzer:Flash|Flash]] <br />
|{{eMail|Flash|delphigl.com}}<br />
|<br />
*DGL-Poll pflegen<br />
|-<br />
|Alle Anderen <br />
|(siehe oben)<br />
|<br />
*News<br />
*Sorgen für angemessene Umgangsformen<br />
|-<br />
|}<br />
</div><br />
<br />
== Wiki ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Flash|Flash]] <br />
|{{eMail|Flash|delphigl.com}}<br />
|<br />
*Inhaltliche Pflege des Wikis<br />
*Koordinierung<br />
|-<br />
|[[Benutzer:Phobeus|Phobeus]] <br />
|{{eMail|Phobeus|delphigl.com}}<br />
|<br />
*Technische Pflege des Wikis (Wartung/Updates)<br />
*Betreuung der Hardware<br />
|-<br />
|[[Benutzer:I0n0s|i0n0s]] <br />
|{{eMail|i0n0s|DelphiGL.com}}<br />
|<br />
*Filesektion<br />
|-<br />
|[[Benutzer:Lord_Horazont|Lord Horazont]]<br />
|{{eMail|lord_horazont|DelphiGL.com}}<br />
|<br />
*Filesektion (SVN Betreuung)<br />
|-<br />
|}</div>I0n0shttps://wiki.delphigl.com/index.php?title=Team&diff=24767Team2010-03-14T23:39:34Z<p>I0n0s: /* Moderatoren */</p>
<hr />
<div>= Vorwort =<br />
<br />
Auf dieser Seite befindet sich eine Auflistung der Personen, die momentan aktiv daran arbeiten, dass DGL Euch wie gewohnt im Netz mit Informationen versorgt. Bitte beachtet, dass die meisten der Personen nur einen begrenzten Vorrat an Zeit haben. Überlegt daher bitte sorgsam, an wen Ihr Euch wendet.<br />
<br />
Im unteren Teil dieser Seite sind die verschiedenen Bereiche von DGL und deren Betreuer aufgelistet. Bitte wendet auch an den passenden Ansprechpartner.<br />
<br />
Diese Seite ersetzt nicht das '''[http://www.delphigl.com/launcher.php?em=impressum IMPRESSUM]'''.<br />
<br />
= Das Team im Ganzen =<br />
In diesen Abschnitt ist aufgelistet '''wer''' bei [[DelphiGL]] Verantwortung für einen Teil übernommen hat, und '''was''' genau er macht.<br />
== Moderatoren ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Phobeus|Phobeus]] <br />
|{{eMail|Phobeus|delphigl.com}}<br />
|<br />
*Technische Pflege des Wikis (Wartung/Updates)<br />
*Betreuung der Hardware<br />
*Freischalten von Usern für das Forum<br />
*Freischalten von Usern für das Wiki<br />
*''News eintragen''<br />
*''allgemeine inhaltliche Kontrolle''<br />
*"der Boss"<br />
|-<br />
|[[Benutzer:Flash|Flash]] <br />
|{{eMail|Flash|delphigl.com}}<br />
|<br />
*Inhaltliche Pflege/Koordination des Wikis<br />
*Community-Aktionen<br />
*Tutorial Lektor<br />
*DGL-Poll pflegen<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle im Forum<br />
|-<br />
|[[Benutzer:Frase|Frase]] <br />
|{{eMail|Frase|delphigl.com}}<br />
|<br />
*Technische Unterstützung für Phobeus<br />
*Tutorial Lektor<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle im Forum<br />
|-<br />
|[[Benutzer:Delphic|Delphic]] <br />
|{{eMail|delphic|delphigl.com}}<br />
|<br />
*Freischalten von Usern für das Forum<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:Flo|Flo]]<br />
|{{eMail|Flo|DelphiGL.com}}<br />
|<br />
*DGL-Wiki-Bot Manager<br />
*Freischalten von Usern für das Wiki<br />
*Tutorial Lektor<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:I0n0s|i0n0s]] <br />
|{{eMail|i0n0s|DelphiGL.com}}<br />
|<br />
# DGLSDK<br />
# Freischalten von Usern für das Forum<br />
# Freischalten von Usern für das Wiki <br />
# Tutorial Lektor<br />
# News eintragen<br />
# allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:Sascha Willems|Sascha Willems]] <br />
|{{eMail|webmaster|delphigl.de}}<br />
|<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
|-<br />
|[[Benutzer:Lord_Horazont|Lord Horazont]] <br />
|{{eMail|lord_horazont|DelphiGL.com}}<br />
|<br />
*SVN/WebSVN Betreuung<br />
*News eintragen<br />
*allgemeine inhaltliche Kontrolle<br />
*Freischalten von Usern für das Forum<br />
*Freischalten von Usern für das Wiki<br />
|-<br />
|}<br />
</div><br />
<br />
= Gruppen =<br />
In diesem Teil findet ihr detailierte Informationen, wer für welchen Bereich zuständig ist.<br />
== DGLSDK ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:I0n0s|i0n0s]] <br />
|{{eMail|i0n0s|DelphiGL.com}}<br />
|<br />
|-<br />
|}<br />
</div><br />
<br />
== DGLOpenGL.pas ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Lossy eX|Lossy eX]] <br />
|{{eMail|Lossy|delphigl.com}}<br />
|<br />
*Weiterentwicklung, Debugging<br />
|-<br />
|}<br />
</div><br />
<br />
== Webseite ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Phobeus|Phobeus]] <br />
|{{eMail|Phobeus|delphigl.com}}<br />
|<br />
*Technische Pflege des Seite (Wartung/Updates)<br />
*Coding (Integrieren von Neuerungen)<br />
|-<br />
|[[Benutzer:Lord_Horazont|Lord Horazont]]<br />
|{{eMail|lord_horazont|DelphiGL.com}}<br />
|<br />
*PHP<br />
|-<br />
|[[Benutzer:Flash|Flash]] <br />
|{{eMail|Flash|delphigl.com}}<br />
|<br />
*DGL-Poll pflegen<br />
|-<br />
|Alle Anderen <br />
|(siehe oben)<br />
|<br />
*News<br />
*Sorgen für angemessene Umgangsformen<br />
|-<br />
|}<br />
</div><br />
<br />
== Wiki ==<br />
<div align="center"><br />
{|{{Prettytable_B1}} width="80%"<br />
!width="20%"|Forumsname<br />
!width="30%"|Email<br />
!width="50%"|Aufgabenbereich<br />
|-<br />
|[[Benutzer:Flash|Flash]] <br />
|{{eMail|Flash|delphigl.com}}<br />
|<br />
*Inhaltliche Pflege des Wikis<br />
*Koordinierung<br />
|-<br />
|[[Benutzer:Phobeus|Phobeus]] <br />
|{{eMail|Phobeus|delphigl.com}}<br />
|<br />
*Technische Pflege des Wikis (Wartung/Updates)<br />
*Betreuung der Hardware<br />
|-<br />
|[[Benutzer:I0n0s|i0n0s]] <br />
|{{eMail|i0n0s|DelphiGL.com}}<br />
|<br />
*Filesektion<br />
|-<br />
|[[Benutzer:Lord_Horazont|Lord Horazont]]<br />
|{{eMail|lord_horazont|DelphiGL.com}}<br />
|<br />
*Filesektion (SVN Betreuung)<br />
|-<br />
|}</div>I0n0shttps://wiki.delphigl.com/index.php?title=TextureBufferObjects&diff=24516TextureBufferObjects2010-01-08T00:24:32Z<p>I0n0s: </p>
<hr />
<div>== Texture Buffer Objects ==<br />
<br />
<br />
Einleitung:<br />
<br />
Das Shader Model 4.0 bietet einen neuen Texturtyp, die Texture Buffer Objects (GL_ARB_texture_buffer_object). Diese sind eindimensionale Texturen, welche ihren Speicherbereich nicht selbst enthalten, sondern auf den Speicher eines verknüpften Buffer Objects zugreifen. Es steht somit die Flexibilität von Bufferobjekten auch für Texturen zur Verfügung (fast) ohne zusätzliche Schnittstellen. So kann zum Beispiel mit Transform Feedback in einen Vertexbuffer geschrieben werden, welcher im nächsten Renderpass wiederum ohne zusätzliche Kopiervorgänge als Textur benutzt werden kann. Dies wird unter anderem beim [[GLSL_Partikel_2|Shader Model 4.0 Partikelsystem]] exzessiv benutzt.<br />
<br />
<br />
<br />
=== Erstellung und Löschung ===<br />
<br />
<br />
Um unser Texture Buffer Object zu Erstellen benutzen wir die Funktion ''glGenTextures(sizei count, uint* texturehandles)'':<br />
<br />
<source lang="cpp"><br />
GLuint myTBO;<br />
glGenTextures(1, &myTBO);<br />
</source><br />
<br />
Das Löschen geschieht mit ''glDeleteTextures(sizei count, uint* texturehandles)'':<br />
<br />
<source lang="cpp"><br />
glDeleteTextures(1, &myTBO);<br />
</source><br />
<br />
<br />
=== Benutzung seitens der CPU ===<br />
<br />
<br />
Zuerst binden wir das Texture Buffer Object wie eine normale Textur mit ''glBindTexture(enum target, uint texture)''. Wir übergeben die Konstante ''GL_TEXTURE_BUFFER_ARB'' als ersten Parameter:<br />
<br />
<source lang="cpp"><br />
glBindTexture(GL_TEXTURE_BUFFER_ARB, myTBO);<br />
</source><br />
<br />
Anschließend geben wir mit ''glTexBufferARB(enum target, enum internalformat, uint buffer)''<br />
an, welches Buffer Object mit dem Texture Buffer Object verknüpft werden soll:<br />
<br />
<source lang="cpp"><br />
glTexBufferARB(GL_TEXTURE_BUFFER_ARB GL_RGBA32F_ARB, myVBO);<br />
</source><br />
<br />
Der zweite Parameter gibt hierbei den Datentyp unserer Textur an. Als Beispiel ist hier ''GL_RGBA32F_ARB'' gewählt. Damit wird unsere Textur als vierelementiger 32-bit-float-Vektor benutzt (4*4 = 16 Byte pro Texel). Folgende Tabelle aus der OpenGL-Spezifikation gibt eine Übersicht über die möglichen Konstanten, welche als zweiter Parameter angegeben werden können:<br />
<br />
Component<br />
Sized Internal Format Base Type Components Norm 0 1 2 3<br />
------------------------ --------- ---------- ---- -------<br />
ALPHA8 ubyte 1 Y A . . .<br />
ALPHA16 ushort 1 Y A . . .<br />
ALPHA16F_ARB half 1 N A . . .<br />
ALPHA32F_ARB float 1 N A . . .<br />
ALPHA8I_EXT byte 1 N A . . .<br />
ALPHA16I_EXT short 1 N A . . .<br />
ALPHA32I_EXT int 1 N A . . .<br />
ALPHA8UI_EXT ubyte 1 N A . . .<br />
ALPHA16UI_EXT ushort 1 N A . . .<br />
ALPHA32UI_EXT uint 1 N A . . .<br />
<br />
LUMINANCE8 ubyte 1 Y L . . .<br />
LUMINANCE16 ushort 1 Y L . . .<br />
LUMINANCE16F_ARB half 1 N L . . .<br />
LUMINANCE32F_ARB float 1 N L . . .<br />
LUMINANCE8I_EXT byte 1 N L . . .<br />
LUMINANCE16I_EXT short 1 N L . . .<br />
LUMINANCE32I_EXT int 1 N L . . .<br />
LUMINANCE8UI_EXT ubyte 1 N L . . .<br />
LUMINANCE16UI_EXT ushort 1 N L . . .<br />
LUMINANCE32UI_EXT uint 1 N L . . .<br />
<br />
LUMINANCE8_ALPHA8 ubyte 2 Y L A . .<br />
LUMINANCE16_ALPHA16 ushort 2 Y L A . .<br />
LUMINANCE_ALPHA16F_ARB half 2 N L A . .<br />
LUMINANCE_ALPHA32F_ARB float 2 N L A . .<br />
LUMINANCE_ALPHA8I_EXT byte 2 N L A . .<br />
LUMINANCE_ALPHA16I_EXT short 2 N L A . .<br />
LUMINANCE_ALPHA32I_EXT int 2 N L A . .<br />
LUMINANCE_ALPHA8UI_EXT ubyte 2 N L A . .<br />
LUMINANCE_ALPHA16UI_EXT ushort 2 N L A . .<br />
LUMINANCE_ALPHA32UI_EXT uint 2 N L A . .<br />
<br />
INTENSITY8 ubyte 1 Y I . . .<br />
INTENSITY16 ushort 1 Y I . . .<br />
INTENSITY16F_ARB half 1 N I . . .<br />
INTENSITY32F_ARB float 1 N I . . .<br />
INTENSITY8I_EXT byte 1 N I . . .<br />
INTENSITY16I_EXT short 1 N A . . .<br />
INTENSITY32I_EXT int 1 N A . . .<br />
INTENSITY8UI_EXT ubyte 1 N A . . .<br />
INTENSITY16UI_EXT ushort 1 N A . . .<br />
INTENSITY32UI_EXT uint 1 N A . . .<br />
<br />
RGBA8 ubyte 4 Y R G B A<br />
RGBA16 ushort 4 Y R G B A<br />
RGBA16F_ARB half 4 N R G B A<br />
RGBA32F_ARB float 4 N R G B A<br />
RGBA8I_EXT byte 4 N R G B A<br />
RGBA16I_EXT short 4 N R G B A<br />
RGBA32I_EXT int 4 N R G B A<br />
RGBA8UI_EXT ubyte 4 N R G B A<br />
RGBA16UI_EXT ushort 4 N R G B A<br />
RGBA32UI_EXT uint 4 N R G B A<br />
<br />
Wie man sieht, gibt es nur ein-, zwei- und vier-elementige Typen. Will man also drei-elementige Daten benutzen, so muss man eine vierte Komponente ergänzen (zusätzlicher Speicherverbrauch) oder die Komponenten-Indizes im Shader zurückrechnen (zusätzlicher Rechenaufwand).<br />
<br />
=== Benutzung seitens der GPU ===<br />
<br />
<br />
Unser Texture Buffer Object ist nun erstellt und gebunden. Nun ist es an der Zeit, es im Shader auszulesen. Dafür brauchen wir neue Textursampler-Typen: ''samplerBuffer'', ''usamplerBuffer'' oder ''isamplerBuffer'', je nachdem, was unser Texture Buffer Object für einen Datentyp repräsentiert: ''float'', ''unsigned int'' oder ''int''. Über diesen Sampler greifen wir mit der Funktion ''texelFetchBuffer(samplerBuffer sampler, uint index)'' auf unser Texture Buffer Object zu:<br />
<br />
<source lang="glsl"> <br />
// ...<br />
<br />
uniform samplerBuffer tbo; // Unser Sampler, wir benutzen floats => samplerBuffer<br />
<br />
void main() <br />
{ <br />
// Wir brauchen einen Array-Index um einen Texel zum Auslesen zu bestimmen.<br />
unsigned int index;<br />
<br />
// Wir berechnen unseren Index.<br />
// ...<br />
<br />
// Wir holen einen Texel aus unserem Texture Buffer Object.<br />
vec4 tmp = texelFetchBuffer(tbo, index); <br />
<br />
// Wir machen etwas mit tmp<br />
// ...<br />
}<br />
</source><br />
<br />
=== Größe ===<br />
<br />
<br />
Für Texture Buffer Objects muss keine Größe angegeben werden; Die Größe der Textur berechnet sich aus der Gesamtgröße des zugehörigen Buffer Objektes geteilt durch die Größe eines Texels. Die maximale Größe eines Texture Buffer Objects beträgt dabei 2^27 = 134217728 im Gegensatz zu normalen eindimensionalen Texturen, welche eine maximale Größe von 2^13 = 8192 haben.<br />
<br />
<br />
=== Literatur ===<br />
<br />
<br />
http://www.opengl.org/registry/specs/ARB/texture_buffer_object.txt</div>I0n0shttps://wiki.delphigl.com/index.php?title=Kamera&diff=24428Kamera2009-12-26T00:42:06Z<p>I0n0s: </p>
<hr />
<div>Andyh beschreibt in den Artikeln:<br />
*[[Kamera (1)]]<br />
*[[Kamera (2)]]<br />
*[[Kamera (3)]]<br />
wie man eine Kamara realisiert.<br />
<br />
{{ZitatVon|Andyh| <br />
Nachdem ich viel Zeit damit verbracht habe eine funktionierende Kamera<br />
zu bauen und es nun endlich geschafft habe, wollte ich diese Funktionalität<br />
auch anderen zur Verfügung stellen.<br />
Da mir schon viel geholfen wurde, kann ich so einen Teil meiner "Schuld"<br />
zurück zahlen.<br />
}}<br />
Die folgend beschriebene Kamera kann sich um alle drei Achsen drehen und sich<br />
in allen Ebenen bewegen. Der Drehpunkt um den sich die Kamera dreht wird mit<br />
dem Aufruf der Prozedur PositionCamera festgelegt. Sollte man diesen Drehpunkt<br />
benötigen (z.B. zum anzeigen eines Koordinatenkreuzes, ...) so kann man auf<br />
die Property PointOfRotation zugreifen (read only).<br />
<br />
Die Kamera kann bis zu zehn Positionen speichern und auch wieder herstellen.<br />
(SavePosition, RestorePosition)<br />
<br />
Die Kamera kann sich selber zu jeder Zeit unter Beibehaltung der aktuellen<br />
Position senkrecht zur Welt ausrichten.<br />
(Adjust)<br />
<br />
Um sicher zu sein, dass auch alle nötigen Definitionen und Funktionen zur <br />
Verfügung stehen habe ich einfach mal einen Großteil meiner Funktionssammlung<br />
beigefügt (Util.pas). Diese Funktionen/Prozeduren werden so oder in leicht<br />
abgeänderter Form wohl bei jedem OpenGL Programmierer existieren.<br />
<br />
...<br />
<br />
Bisher glaubte ich, dass man mit der von mir erstellten Kurzanleitung auskommt, habe jetzt aber doch noch ein Beispielprogramm erstellt. Nach mehrmaligem Studium meiner Kurzanleitung bin ich nämlich zu dem Schluss gekommen, dass man mit diesem Programmierbeispiel nicht zu dem von mir beabsichtigten Ergebnis kommen kann. Das Beispielprogramm, welches die Funktionen der Kamera veranschaulicht, wurde mit Delphi 2005 entwickelt. Wenn Ihr über eine ältere Delphiversion verfügt nehmt einfach die DPR Datei oder erstellt ein neues Projekt mit Euerem Compiler und bindet die benötigten Dateien ein. <br />
<br />
Ich habe noch einiges mehr an Code reingepackt als unbedingt nötig, um der Sache optisch ein Mindestmaß an Anspruch zu verleihen. Deswegen können aus diesem Beispielprogramm noch die eine oder andere Komponente entnommen werden (wenn nicht schon vorhanden). Dies sind z.B. Komponenten für Licht, Material, zur Textdarstellung, eine Skybox und zur Handhabung von Grafikdateien (die ist allerdings nicht auf meinem Mist gewachsen). Zusätzlich habe ich noch den Memory Manager FastMM4 beigepackt und eingebunden. Mit diesem kann man sehr schön (besser als mit den von Delphi bereitgestellten Möglichkeiten) nicht freigegebene Resourcen aufspüren. Ich war überrascht was ich alles nicht freigegeben hatte, als ich den zum ersten mal eingesetzt habe.<br />
<br />
{{ArchivLink|file=kamera_heyroth|text=Das Beispielprogramm findet Ihr hier}}. Dieses Programm habe ich am 26.12.2007 aktualisiert um die Steuerung per Tastatur und Maus zu vereinfachen. Die bisher in den das Modul benutzenden Methoden KeyDown, KeyUp, ModeDown, MouseUp usw. nötigen Tätigkeiten habe ich in Kameramethoden ausgelagert. Dadurch kann mit einem einzigen Aufruf dieser Methode(n) die nötige Arbeit abgerufen werden.<br />
<br />
Aussehen sollte es nach dem Aufruf so:<br />
<br />
[[Bild:CameraExample.jpg]] <br />
<br />
...<br />
<br />
Ein weiteres Projekt habe ich auf meiner Homepage veröffentlicht. Es ist ein simples Spiel, welches mit verschiedenen Kameraeinstellungen arbeitet. Dadurch kann man einiges über die Kamera erfahren. Die letzten Entwicklungen sind nur hier eingeflossen. Das Projekt auf dieser Seite werde ich nicht mehr aktualisieren. Wollt Ihr also den neuesten Source Code, dann schaut Euch auf meiner Homepage entweder das neueste [http://www.heyroth.biz/main.html?src=%2F#2,2 Kamerabeispiel] oder [http://www.heyroth.biz/main.html?src=%2F#2,3 Spiel] an. <br />
<br />
Sollte es noch irgendwelche Fragen zu diesen Modulen geben, so stehe ich gerne<br />
zur Verfügung (Andree Heyroth, Alias: AndyH).<br />
<br />
[[Kategorie:Technik_oder_Algorithmus]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Archiv:kamera_heyroth&diff=24427Archiv:kamera heyroth2009-12-26T00:40:43Z<p>I0n0s: </p>
<hr />
<div>{{Archiv|autor=Andyh|beschreibung=Andyhs Beispielcode zur [[Kamera]].}}</div>I0n0shttps://wiki.delphigl.com/index.php?title=Archiv:kamera_heyroth&diff=24426Archiv:kamera heyroth2009-12-26T00:40:09Z<p>I0n0s: Die Seite wurde neu angelegt: „{{Archiv|beschreibung=Andyhs Beispielcode zur Kamera.}}“</p>
<hr />
<div>{{Archiv|beschreibung=Andyhs Beispielcode zur [[Kamera]].}}</div>I0n0shttps://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&diff=24425Kategorie Diskussion:Exzellent2009-12-25T21:10:26Z<p>I0n0s: /* Kandidatenliste */</p>
<hr />
<div>=Voraussetzungen für Exzellente Artikel=<br />
Hier könnt ihr Artikel vorschlagen welche ihr als "exzellenten Artikel" einstufen würdet.<br />
<br />
Folgende Punkte '''müssen''' erfüllt sein:<br />
* Kein Sackgassenartikel - Artikel muss auf andere Artikel direkt (nicht über Code) verlinken<br />
* Kein Plain Text - Artikel muss eine einheitliche Formatierung aufweisen<br />
* Bilder - Artikel muss mindestens ein Bild/Grafik besitzen<br />
* Umfassend - Der Artikel muss das Thema umfassend behandeln.<br />
* Kein Tutorial - Der Artikel darf nicht der [[:Kategorie:Tutorial|Kategorie Tutorial]] angehören.<br />
<br />
<br />
Damit ein Artikel als '''exzellent''' eingestuft wird müssen:<br />
* 3 Wiki-User der Wahl zustimmen darunter mindestens ein Moderator,<br />
* keine Gegenstimmen bestehen,<br />
* die Voraussetzungen von oben gelten.<br />
<br />
<br><br />
<br />
=Kandidatenliste=<br />
Um einen Artikel zur Kandidatenliste hinzuzufügen bitte den Nachfolgenden Code vor dem Ende ("<nowiki>|}</nowiki>") der Tabelle einfügen:<br />
<br />
|<nowiki>[[Artikelname]]</nowiki><br />
|<br />
|<br />
|<br />
|-<br />
<br />
Um eine Stimme abzugeben, kopiert ihr bitte den Wiki-Code "<nowiki>--~~~~</nowiki>" in die entsprechende Spalte. Das Wiki generiert daraus eure Unterschrift (Signatur).<br />
<br />
Falls ihr eine Gegenstimme abgebt, muss eine Begründung dazu gegeben werden.<br />
<br />
----<br />
<br><br />
<div align="center"><br />
{|{{Prettytable_B1}}<br />
!width="15%"|Vorgeschlagener Artikel<br />
!width="20%"|Beführworter<br />
!width="20%"|Gegner<br />
!width="45%"|Begründung für Gegenstimme / Diskussion<br />
|-<br />
| [[glTexParameter]]<br />
| <br />
| --[[Benutzer:Flash|Flash]] 09:56, 11. Jan 2007 (CET)<br />
|Wenn jemand noch die restlichen Wrapmodes einbaut sicher ein guter kandidat (GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER,GL_MIRRORED_REPEAT laut glitmap.pas) (Winner)<br />
<br />
Stimme Winner zu. Ohne die ergänzungen kommt der Artikel nicht in Frage.<br />
|-<br />
|[[gluCylinder]]<br />
| --[[Benutzer:Flash|Flash]] 09:09, 10. Apr. 2008 (UTC)<br />
--[[Benutzer:Igel457|Igel457]] 22:14, 2. Nov. 2009 (CET)<br />
--[[Benutzer:I0n0s|I0n0s]] 22:10, 25. Dez. 2009 (CET)<br />
| <br />
| <br />
Guter und anschaulicher Artikel, wenn auch GLU-Funktionen im Allgemeinen vermieden werden sollten --[[Benutzer:Igel457|Igel457]] 22:14, 2. Nov. 2009 (CET)<br />
|-<br />
|[[Raytracing]]<br />
| <br />
| --[[Benutzer:I0n0s|I0n0s]] 13:25, 10. Dez. 2008 (UTC)<br />
--[[Benutzer:Delphic|Delphic]] 17:14, 10. Dez. 2008 (UTC)<br />
|<br />
# Es existieren 2 Tutorials zu dem Thema.<br />
# Ist nur als Oberflächliche Information konzipiert und enthält keine Information, wie die Techniken tatsächlich zu verwenden sind.<br />
<br />
Ok. Bis der Artikel das Thema etwas besser "ausleuchtet" ;) bleibt das Veto stehen. Die Tutorials sprechen nicht dagegen. --[[Benutzer:Flash|Flash]] 17:58, 10. Dez. 2008 (UTC)<br />
|-<br />
|[[shader blur2]]<br />
| --[[Benutzer:Flash|Flash]] 21:18, 25. Dez. 2009 (CET)<br />
--[[Benutzer:I0n0s|I0n0s]] 22:09, 25. Dez. 2009 (CET)<br />
| <br />
| Vorbildlicher Shaderartikel.--[[Benutzer:Flash|Flash]] 21:18, 25. Dez. 2009 (CET)<br />
|}<br />
</div><br />
<br />
<br />
<br><br />
<br><br />
<br><br />
<br><br />
<br />
== Auswahlkriterien ==<br />
<br />
Ich finde die Asuwahlkriterien etwas strange. Schließlich sind Tutorials auch Artikel und in den meisten Fällen noch dazu ziemlich gute. Warum sollten diese also ausgeschlossen werden? Vermitteln ja schließlich meist recht anschaulich viel Information. Also exakt das, was nen guten Artikel ausmacht.<br />
--[[Benutzer:Frase|Frase]] 18:48, 18. Mär 2006 (CET)<br />
<br />
<br />
Tutorials sind einzelarbeiten die von einer Person gemacht wurden und die eigentlich auch nur von dieser zu Verantworten/Verbessern sind. Die Auszeichnung soll gerade dafür sorgen die "graue Maus" Artikel aufzuwerten. Das unsere Tutorials alle Exzellent sind steht außer Frage. Die Auszeichnung heißt aber nicht um sonst "Exzellente Artikel" und nicht "Exzellente Tutorials". Außerdem soll die Auzeichnung erreichen, dass die Nutzer einfach mal ins Wiki reinlesen. Tutorials sind in sich geschlossen und verlinken kaum auf andere Artikel. Sie behandeln ein Thema, und das ist gut so.<br />
--[[Benutzer:Flash|Flash]] 01:11, 19. Mär 2006 (CET)<br />
<br />
<br />
Und es kann die Leute animieren die Artikel den Kritierie anzupassen bzw. eigene Artikel einzustellen.<br />
So hat es zumindest bei mir funktioniert. Ich habe jetzt sogar Bilder! :lol:<br />
<br />
--[[Benutzer:I0n0s|I0n0s]] 04:35, 19. Mär 2006 (CET)</div>I0n0shttps://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&diff=24424Kategorie Diskussion:Exzellent2009-12-25T21:09:16Z<p>I0n0s: /* Kandidatenliste */</p>
<hr />
<div>=Voraussetzungen für Exzellente Artikel=<br />
Hier könnt ihr Artikel vorschlagen welche ihr als "exzellenten Artikel" einstufen würdet.<br />
<br />
Folgende Punkte '''müssen''' erfüllt sein:<br />
* Kein Sackgassenartikel - Artikel muss auf andere Artikel direkt (nicht über Code) verlinken<br />
* Kein Plain Text - Artikel muss eine einheitliche Formatierung aufweisen<br />
* Bilder - Artikel muss mindestens ein Bild/Grafik besitzen<br />
* Umfassend - Der Artikel muss das Thema umfassend behandeln.<br />
* Kein Tutorial - Der Artikel darf nicht der [[:Kategorie:Tutorial|Kategorie Tutorial]] angehören.<br />
<br />
<br />
Damit ein Artikel als '''exzellent''' eingestuft wird müssen:<br />
* 3 Wiki-User der Wahl zustimmen darunter mindestens ein Moderator,<br />
* keine Gegenstimmen bestehen,<br />
* die Voraussetzungen von oben gelten.<br />
<br />
<br><br />
<br />
=Kandidatenliste=<br />
Um einen Artikel zur Kandidatenliste hinzuzufügen bitte den Nachfolgenden Code vor dem Ende ("<nowiki>|}</nowiki>") der Tabelle einfügen:<br />
<br />
|<nowiki>[[Artikelname]]</nowiki><br />
|<br />
|<br />
|<br />
|-<br />
<br />
Um eine Stimme abzugeben, kopiert ihr bitte den Wiki-Code "<nowiki>--~~~~</nowiki>" in die entsprechende Spalte. Das Wiki generiert daraus eure Unterschrift (Signatur).<br />
<br />
Falls ihr eine Gegenstimme abgebt, muss eine Begründung dazu gegeben werden.<br />
<br />
----<br />
<br><br />
<div align="center"><br />
{|{{Prettytable_B1}}<br />
!width="15%"|Vorgeschlagener Artikel<br />
!width="20%"|Beführworter<br />
!width="20%"|Gegner<br />
!width="45%"|Begründung für Gegenstimme / Diskussion<br />
|-<br />
| [[glTexParameter]]<br />
| <br />
| --[[Benutzer:Flash|Flash]] 09:56, 11. Jan 2007 (CET)<br />
|Wenn jemand noch die restlichen Wrapmodes einbaut sicher ein guter kandidat (GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER,GL_MIRRORED_REPEAT laut glitmap.pas) (Winner)<br />
<br />
Stimme Winner zu. Ohne die ergänzungen kommt der Artikel nicht in Frage.<br />
|-<br />
|[[gluCylinder]]<br />
| --[[Benutzer:Flash|Flash]] 09:09, 10. Apr. 2008 (UTC)<br />
--[[Benutzer:Igel457|Igel457]] 22:14, 2. Nov. 2009 (CET)<br />
| <br />
| <br />
Guter und anschaulicher Artikel, wenn auch GLU-Funktionen im Allgemeinen vermieden werden sollten --[[Benutzer:Igel457|Igel457]] 22:14, 2. Nov. 2009 (CET)<br />
|-<br />
|[[Raytracing]]<br />
| <br />
| --[[Benutzer:I0n0s|I0n0s]] 13:25, 10. Dez. 2008 (UTC)<br />
--[[Benutzer:Delphic|Delphic]] 17:14, 10. Dez. 2008 (UTC)<br />
|<br />
# Es existieren 2 Tutorials zu dem Thema.<br />
# Ist nur als Oberflächliche Information konzipiert und enthält keine Information, wie die Techniken tatsächlich zu verwenden sind.<br />
<br />
Ok. Bis der Artikel das Thema etwas besser "ausleuchtet" ;) bleibt das Veto stehen. Die Tutorials sprechen nicht dagegen. --[[Benutzer:Flash|Flash]] 17:58, 10. Dez. 2008 (UTC)<br />
|-<br />
|[[shader blur2]]<br />
| --[[Benutzer:Flash|Flash]] 21:18, 25. Dez. 2009 (CET)<br />
--[[Benutzer:I0n0s|I0n0s]] 22:09, 25. Dez. 2009 (CET)<br />
| <br />
| Vorbildlicher Shaderartikel.--[[Benutzer:Flash|Flash]] 21:18, 25. Dez. 2009 (CET)<br />
|}<br />
</div><br />
<br />
<br />
<br><br />
<br><br />
<br><br />
<br><br />
<br />
== Auswahlkriterien ==<br />
<br />
Ich finde die Asuwahlkriterien etwas strange. Schließlich sind Tutorials auch Artikel und in den meisten Fällen noch dazu ziemlich gute. Warum sollten diese also ausgeschlossen werden? Vermitteln ja schließlich meist recht anschaulich viel Information. Also exakt das, was nen guten Artikel ausmacht.<br />
--[[Benutzer:Frase|Frase]] 18:48, 18. Mär 2006 (CET)<br />
<br />
<br />
Tutorials sind einzelarbeiten die von einer Person gemacht wurden und die eigentlich auch nur von dieser zu Verantworten/Verbessern sind. Die Auszeichnung soll gerade dafür sorgen die "graue Maus" Artikel aufzuwerten. Das unsere Tutorials alle Exzellent sind steht außer Frage. Die Auszeichnung heißt aber nicht um sonst "Exzellente Artikel" und nicht "Exzellente Tutorials". Außerdem soll die Auzeichnung erreichen, dass die Nutzer einfach mal ins Wiki reinlesen. Tutorials sind in sich geschlossen und verlinken kaum auf andere Artikel. Sie behandeln ein Thema, und das ist gut so.<br />
--[[Benutzer:Flash|Flash]] 01:11, 19. Mär 2006 (CET)<br />
<br />
<br />
Und es kann die Leute animieren die Artikel den Kritierie anzupassen bzw. eigene Artikel einzustellen.<br />
So hat es zumindest bei mir funktioniert. Ich habe jetzt sogar Bilder! :lol:<br />
<br />
--[[Benutzer:I0n0s|I0n0s]] 04:35, 19. Mär 2006 (CET)</div>I0n0shttps://wiki.delphigl.com/index.php?title=shader_blur2&diff=24423shader blur22009-12-25T21:07:53Z<p>I0n0s: </p>
<hr />
<div>=Blur=<br />
Zurück zur [[Shadersammlung]]<br />
{|{{Prettytable_B1}} width=100%<br />
!width=60%|Beschreibung<br />
!width=20%|Autor<br />
!width=20%|Version<br />
|-<br />
|Post-Processing-Shader zum Verwischen der Szene.<br />
|Skeptiker/Coolcat<br />
|1.1<br />
|}<br />
<br />
==Bilder==<br />
{|<br />
|[[Bild:Shader_blur_seerose.png|framed|Vorher]]<br />
|-<br />
|[[Bild:Shader_blur_seerose_blured.png|framed|Nachher]]<br />
|}<br />
<br />
==Beschreibung==<br />
[[Bild:Gaussian-function-plot.gif|framed|Gauss-Funktion mit [[Bild:sigma.gif]] = 3.2]]<br />
Dieser Shader verwischt die Szene mit Hilfe einer eindimensionalen Gauss-Funktion:<br />
<br />
[[Bild:Gaussian-function.gif]]<br />
<br />
Dabei ist x die Entfernung vom Mittelpunkt und [[Bild:sigma.gif]] die gewünschte [http://de.wikipedia.org/wiki/Varianz Varianz]. Da die Gauss-Funktion relativ aufwendig ist, wurde sie bereits im Bereich x = -5...5 für [[Bild:sigma.gif]] = 3.2 ausgewertet. Die Funktionswerte wurden normalisiert um die Summe auf 1 zu bringen und dann als konstantes Array fest in den Shader eingebaut.<br />
<br />
Um einen zweidimensionalen Blur-Effekt zu erreichen muss der Shader zweimal angewendet werden. Beispielsweise einmal horizontal und einmal vertikal. Dies ist zwar komplizierter aber im allgemeinen schneller, als eine zweidimensionale Gauss-Funktion zu verwenden.<br />
<br />
Über die uniform-Variable <tt>uShift</tt> kann gesteuert werden wie der Effekt angewendet wird:<br />
* <tt>uShift = vec2(1.0/textureWidth, 0.0)</tt> bewirkt einen horizontalen Filter<br />
* <tt>uShift = vec2(0.0, 1.0/textureHeight)</tt> bewirkt einen vertikalen Filter<br />
* <tt>uShift = vec2(1.0/textureWidth, 1.0/textureHeight)</tt> bewirkt einen diagonalen Filter<br />
<br />
Um den Effekt zu verstärken gibt es verschiedene Möglichkeiten. Beispielsweise kann man etwas wie <tt>uShift = vec2(1.4/textureWidth, 0.0)</tt> versuchen. Dies vergrößert die Schrittweite und damit den Einzugsbereich des Shaders. Bei einem zu großen Faktor werden dabei jedoch nicht mehr ausreichend viele Texel der Textur betrachtet. In diesem Fall sollte man eine andere Gauss-Funktion mit größerem [[Bild:sigma.gif]] und einem weiteren Bereich verwenden. Dadurch steigt natürlich die Anzahl der Texturzugriffe pro Pixel, was eine Grafikkarte schnell ans Limit bringen kann. Aus diesem Grund kann es sinnvoll sein den Shader mehrfach anzuwenden, immer abwechselnd horizontal und vertikal. Dies hat den gleichen Effekt wie ein größeres [[Bild:sigma.gif]] und benötigt insgesamt weniger Texturzugriffe. Man muss einen Mittelweg aus Texturzugriffen und Renderpasses finden. <br />
<br />
Da der Shader für jedes Texel der Textur die unmittelbaren Nachbartexel abtastet, muss das Verhalten an den Rändern der Textur definiert werden, hier empfiehlt sich die Einstellung GL_CLAMP_TO_EDGE oder GL_CLAMP_TO_BORDER.<br />
<br />
==Besondere Vorraussetzungen==<br />
Es handelt sich um einen Post-Processing-Shader, die Szene muss daher vorher in eine Textur gerendert werden. Anschließend muss diese Textur gebunden werden und als Fullscreen-Quad mit diesem Shader gerendert werden. Hier bietet sich ein FrameBufferObject an, insbesondere da der Shader ja zweimal (oder noch öfter) ausgeführt werden muss.<br />
<br />
==Code==<br />
Vertex Shader<br />
<source lang="glsl"><br />
#version 120<br />
<br />
void main() {<br />
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;<br />
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;<br />
}<br />
</source><br />
<br />
Fragment Shader<br />
<source lang="glsl"><br />
#version 120<br />
<br />
uniform sampler2D uTexture;<br />
uniform vec2 uShift;<br />
<br />
const int gaussRadius = 11;<br />
const float gaussFilter[gaussRadius] = float[gaussRadius](<br />
0.0402,0.0623,0.0877,0.1120,0.1297,0.1362,0.1297,0.1120,0.0877,0.0623,0.0402<br />
);<br />
<br />
void main() {<br />
vec2 texCoord = gl_TexCoord[0].xy - float(int(gaussRadius/2)) * uShift;<br />
vec3 color = vec3(0.0, 0.0, 0.0); <br />
for (int i=0; i<gaussRadius; ++i) { <br />
color += gaussFilter[i] * texture2D(uTexture, texCoord).xyz;<br />
texCoord += uShift;<br />
}<br />
gl_FragColor = vec4(color,1.0);<br />
}<br />
</source></div>I0n0shttps://wiki.delphigl.com/index.php?title=Tiefenunsch%C3%A4rfe&diff=24395Tiefenunschärfe2009-12-24T23:36:31Z<p>I0n0s: hat „tiefenunschärfe“ nach „Tiefenunschärfe“ verschoben:&#32;Korrekte Großschreibung</p>
<hr />
<div>{{Offline}}<br />
<br />
= Realität und Virtualität =<br />
<br />
Bevor wir zum Programmieren übergehen erstmal ein paar Kleinigkeiten vorweg. Wen diese nicht interessieren, kann den gesamten Punkt 1 eigentlich überspringen und direkt bei 2.1 anfangen. Ansonsten geht es los mit folgender Frage:<br />
<br />
== Was ist Tiefenunschärfe? ==<br />
Die sogenannte Tiefenunschärfe ist ein Effekt, den zu mindest aus der Realität jeder kennt, (und ich meine damit ausnahmslos jeder, der nicht gerade blind ist,) dem aber kaum jemand große Beachtung schenkt. Das liegt hauptsächlich daran, dass es sich um einen Effekt handelt, der für das menschliche Auge (bzw. für die beiden menschlichen Augen) vollkommen alltäglich ist.<br />
<br />
[[Bild:Schach.jpg|thumb|right|Beispiel aus der Realität anhand von Schachfiguren]]<br />
=== Eine theoretische Praxisübung: Daumenakrobatik. ===<br />
Zur Demonstration nehme man seinen rechten Daumen (oder irgendeinen anderen Finger) und halte ihn vor einen größeren, entfernten Gegenstand wie zum Beispiel eine Wand. Dann fokussiere man mal den Daumen im Blickfeld. Was uns interessiert ist jetzt nicht, wie schön unser Daumen denn aussieht, sondern viel mehr was mit dem Hintergrund passiert. Er verschwimmt und solange wir unseren Daumen klar erkennen können, können wir den Hintergrund nur unscharf sehen. Anders herum können wir unseren Daumen nicht klar erkennen, während wir den Hintergrund fokussieren. Dieser Effekt verstärkt sich übrigens, je größer der Abstand von Daumen und Hintergrund ist. Das funktioniert übrigens auch seitlich. Man halte seine zwei Daumen auf eine Entfernung von etwa fünf Zentimetern nebeneinander, und versuche mal Beide gleichzeitig zu fokussieren.<br />
<br />
=== Erkenntnis ===<br />
Nach spätestens einer Minute anstrengender Verrenkungen sollte man gemerkt haben, was der hauptsächliche Aspekt ist, um den es hier geht; Der Mensch ist nicht in der Lage, mehrere Bildpunkte gleichzeitig scharf darzustellen. (Kameras haben übrigens das selbe Problem)<br />
<br />
== Virtuelle Tiefenunschärfe ==<br />
Jetzt erst einmal weg vom "RL". Tiefenunschärfe ist wie wir nun herausgefunden haben sollten kein Effekt, der unglaublich viel Spannung erzeugt wie zum Beispiel eine Explosion. Trotzdem bin ich der Meinung, dass sie in vielen Spielen fehlt und optisch gesehen einiges hermachen kann. Die fehlende Tiefenunschärfe ist oftmals der Grund, warum Computerspiele oder -Animationen sehr künstlich wirken. Warum? Ganz einfach: Ein jeder Mensch mit gesundem Geist, hält das was er gewohnt ist für realistisch, beziehungsweise reell. Er ist darauf spezialisiert, Muster zu erkennen und wieder zu erkennen. Auf unser Beispiel bezogen heißt das: wir sind es gewohnt, immer nur einen bestimmten Punkt in unserem Blickfeld scharf erkennen zu können. Da in Computerspielen häufig einfach alles gleichermaßen scharf gestellt wird, bemerkt unser Unterbewusstsein den Unterschied und stempelt das gesehene als künstlich ab. In der folgenden Anleitung versuche ich eine Technik zu erläutern, wie man Tiefenunschärfe ganz simpel in OpenGL umsetzen kann.<br />
<br />
= Programmierung =<br />
Die Technik, die ich hier erläutern möchte, ist wirklich sehr simpel und erfordert nicht all zu viel an Vorkenntnissen, ist aber auch nicht unbedingt für Anfänger geeignet, da man doch das eine oder andere falsch machen und somit die Performance in den Keller reißen kann. Eine Voraussetzung wäre eventuell [[glAccum]], es ist aber nicht all zu schlimm, wenn man damit noch nicht gearbeitet hat.<br />
== Praktische Theorie ==<br />
So. Jetzt geht's an's Programmieren. Womit fangen wir an? Richtig.<br />
=== Die Grundidee ===<br />
Wir wollen also jetzt einen Blureffekt, der abhängig vom Abstand zu einem bestimmten Punkt verschieden stark ist. Je weiter entfernt, umso stärker. Mit anderen Worten: '''Blurstärke ~ Radius'''. Nun wäre es reichlich sinnlos, für jeden Bildpunkt, der gezeichnet wird einen Radius zu berechnen und jeden Punkt einzeln zu blurren. Das wäre programmiertechnisch viel zu umständlich und würde der Performance wohl so stark in die Suppe spucken, dass diese eine zweite Schüssel bräuchte. Wir lösen das Problem, indem wir umdenken:<br />
=== Rotation! ===<br />
Die Idee ist so einfach wie gut. Nehmen wir zum Beispiel zwei Punkte auf einer Geraden. Dann rotieren wir die Gerade um den Ersten Punkt und den zweiten Punkt natürlich mit. der Abstand zwischen dem alten und dem neuen zweiten Punkt ist abhängig von Rotation und Abstand zum Ersten Punkt. Das klingt komplizierter als es eigentlich ist. {{Bildwunsch|Entfernung der beiden zweiten Punkte in Abhängigkeit zum Radius}} Wie wir das ganze ins dreidimensionale umsetzen können, erkläre ich jetzt.<br />
=== Umsetzung ===<br />
<br />
<br />
== Endergebnis ==<br />
Letztendlich sollten wir etwa so etwas heraus bekommen: (FoD_det = Genauigkeit, FoD_str = Blurstärke gesamt)<br />
<source lang="cpp"><br />
glPushMatrix();<br />
<br />
//hier kann die Szenerie noch an die richtige Stelle verschoben werden,<br />
//falls gewünscht.<br />
<br />
glClear(GL_ACCUM_BUFFER_BIT); //Accum Buffer leeren<br />
for i := 0 to FoD_det do<br />
begin<br />
if (i > 0) and (FoD_str = 0) then break; //falls die verwacklungsstärke = 0 ist, wird die szene nur einmal gerendert<br />
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);<br />
<br />
glPushMatrix();<br />
<br />
//verwackeln<br />
if i <> 0 then<br />
begin<br />
glTranslatef(Cam.focus.x,Cam.focus.y,Cam.focus.z);<br />
glRotatef(-Cam.rot.y,0,1,0);<br />
if i = 1 then glRotatef(FoD_str,-1,0,0);<br />
if i = 2 then glRotatef(FoD_str,0.5,-0.5,0);<br />
if i = 3 then glRotatef(FoD_str,0.5,+0.5,0);<br />
glRotatef(Cam.rot.y,0,1,0);<br />
glTranslatef(-Cam.focus.x,-Cam.focus.y,-Cam.focus.z);<br />
end;<br />
<br />
Scene.Render; //Szenerie darstellen<br />
<br />
glPopMatrix();<br />
<br />
//zum Accum Buffer hinzufügen<br />
if FoD_str = 0 then<br />
glAccum (GL_ACCUM, 1) <br />
else <br />
glAccum (GL_ACCUM, 1/(FoD_det+1));<br />
end;<br />
//In den Accum Buffer gerendertes zurückgeben<br />
glAccum (GL_RETURN, 1.0);<br />
glFlush();<br />
<br />
glPopMatrix();<br />
</source></div>I0n0shttps://wiki.delphigl.com/index.php?title=tiefenunsch%C3%A4rfe&diff=24396tiefenunschärfe2009-12-24T23:36:31Z<p>I0n0s: hat „tiefenunschärfe“ nach „Tiefenunschärfe“ verschoben:&#32;Korrekte Großschreibung</p>
<hr />
<div>#WEITERLEITUNG [[Tiefenunschärfe]]</div>I0n0shttps://wiki.delphigl.com/index.php?title=Link&diff=24354Link2009-12-13T01:52:06Z<p>I0n0s: /* Glow */ Link korrigiert</p>
<hr />
<div><!--<br />
!!!!!!!! NUTZT DIESE TABELLE ALS VORLAGE FÜR WEITERE LINKTABELLEN !!!!!!!<br />
<br />
<div align="center"><br />
{|{{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[Link]<br />
|{{Deutsch}}<br />
|Beschreibung<br />
|-<br />
|[Link]<br />
|{{Englisch}}<br />
|Beschreibung<br />
|-<br />
|}<br />
</div><br />
<br />
--><br />
<br />
= Links die mit Grafik/OpenGL zu tun haben =<br />
Hier finden Sie eine Übersicht von Links. <br />
<br />
*Weitere Navigations Links findet Sie unter [[DGL Wiki:Portal]]<br />
*Links zu Tools oder Programmen finden Sie unter [[Tool]]s<br />
<br />
== Hardwareinfos ==<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://delphi3d.net/hardware/listreports.php OpenGL Hardware Registry - Hardwareübersicht]<br />
|{{Englisch}}<br />
|Eine Datenbank aller Grafikkarten die in der Harware Registry vorhanden sind. Die einzelnen Artikel enthalten Infos darüber, welche Extensions von der Grafikkarte unterstützt werden.<br />
|-<br />
|[http://delphi3d.net/hardware/allexts.php OpenGL Hardware Registry - Extensionübersicht]<br />
|{{Englisch}}<br />
|Eine Datenbank aller Extensions die in der Harware Registry vorhanden sind. Die einzelnen Artikel enthalten Infos darüber, welche Grafikkarten die entsprechende Extension unterstützen.<br />
|-<br />
|}<br />
</div><br />
<br><br><br />
<br />
== Tutorials ==<br />
<br />
=== OpenGL ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
||[[Tutorial|DGL Wiki - Tutorial]]<br />
|{{Deutsch}}<br />
|DelphiGL.com ist Betreiber dieses Wikis und stellt eine Vielzahl Tutorials mit Schwehrpunkt OpenGL zur Verfügung. <br />
Neben Tutorials für Einsteiger und OpenGL Anfänger gibt es auch fortgeschrittene Themen wie Shader oder Partikelsysteme.Sprache der Wahl ist hier Delphi.<br />
|-<br />
|[http://www.joachimrohde.com/cms/xoops/modules/articles/index.php?cat_id=1 joachimrohde.com]<br />
|{{Deutsch}}<br />
|Auf dieser Seite findet ihr deutsche Übersetzungen der bekannten NeHe Tutorials. Sprache der Wahl ist hier C++.<br />
|-<br />
|[http://www.cg.tuwien.ac.at/studentwork/VRSem96/OpenGL/ Technische Universität Wien]<br />
|{{Deutsch}}<br />
|<br />
|-<br />
|[http://nehe.gamedev.net/ Nehe] <br />
|{{Englisch}}<br />
|Die berühmt berüchtigten NeHe Tutorials sind eine umfangreiche Sammlung an Tutorials zum Thema OpenGL. Von Anfängertutorials bis hin zu komplexen Effekten wird alles behandelt. Sprache der Wahl ist hier C++. (Eine Übersetzung der NeHe Tutorials findet ihr bei Joachim Rhode (siehe oben). )<br />
|-<br />
|[http://www.sulaco.co.za/tut.htm sulaco.co.za] <br />
|{{Englisch}}<br />
| OpenGL Beispiele in Delphi<br />
|}<br />
</div><br />
<br><br />
<br />
=== Textur Erstellung ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://3d.diehlsworld.de/textures/index.htm 3d.diehlsworld.de]<br />
|{{Deutsch}}<br />
|Auf dieser Seite findet ihr kurze aber inhaltlich reiche Tutorials zu der Frage "Wie erstelle ich XXXXX-Texturen". Dabei reicht die Palette von Untergrundtexturen wie Gras, Sand , Fels und Wasser (und Kombinationen dieser) bis hin zu Blitzen und Partikeln. Als Programm wird hier Photoshop verwendet.<br />
|-<br />
|[http://www.gimps.de/gimp/textur-muster/ gimps.de]<br />
|{{Deutsch}}<br />
|Schritt für Schritt Anleitungen wie man mit Gimp verschiedene Texturen erstellt.<br />
|-<br />
|[http://cbt.k090999.de/gimp.php#texturen k090999.de]<br />
|{{Deutsch}}<br />
|Gimptutorials zum Erstellen verschiedene Texturen.<br />
|}<br />
</div><br />
<br><br />
<br />
=== Blender ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://blendpolis.de/f/viewtopic.php?t=5786 Blendpolis]<br />
|{{Deutsch}}<br />
| Ein Thread im Forum von [http://blendpolis.de Blendpolis] in dem '''sehr''' viele Tutorials aufgelistet sind<br />
|-<br />
|[http://blendpolis.de/f/article_cat.php?fldAuto=7 Blendpolis]<br />
|{{Deutsch}}<br />
| Eigentliche Tutorial Seite von [http://blendpolis.de Blendpolis] die Auswahl ist hier aber nicht so groß<br />
|-<br />
|[http://wikivid.com/index.php/Blender Blender at wikivid.com]<br />
|{{Englisch}}<br />
| Linksammlung von Blender Video Tutorials<br />
|-<br />
|[http://www.blender.org/education-help/tutorials/getting-started/ blender3d.org]<br />
|{{Englisch}}<br />
| Auch die Heimatseite von Blender bietet viele Tutorials unter anderm auch Video Tuorials<br />
|-<br />
|[http://www.Blenderunderground.com Blenderunderground]<br />
|{{Englisch}}<br />
| '''sehr gute''' Video-Tutorials<br />
|}<br />
</div><br />
<br><br><br />
<br />
== OpenGL Funktionen ==<br />
<br />
=== GL ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[[:Kategorie:GL|DGL Wiki - Kategorie GL]]<br />
|{{Deutsch}}<br />
| Wiki-Kategorie die alle übersetzten OpenGL Befehle enthält.<br />
|-<br />
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz OpenGL.org - Orginal Spezifkationen]<br />
|{{Englisch}}<br />
|Die Orginalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle. (Diese HTML-Dokumente sind nicht Copy&Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)<br />
|-<br />
|[http://developer.3dlabs.com/documents/glmanpage_index.htm 3dLabs]<br />
|{{Englisch}}<br />
|Die Orginalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle.<br />
|-<br />
|[http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]<br />
|{{Englisch}}<br />
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.<br />
|-<br />
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_4f03.asp MSDN von Microsoft]<br />
|{{Englisch}}<br />
|OpenGL Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Orginalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.<br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
=== GLU ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[[:Kategorie:GLU|DGL Wiki - Kategorie GLU]]<br />
|{{Deutsch}}<br />
| Wiki-Kategorie die alle übersetzten GLU Befehle enthält.<br />
|-<br />
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/ OpenGL.org - Orginal Spezifkationen]<br />
|{{Englisch}}<br />
|Orginalspezifikationen für die GLU Befehle. (Diese HTML-Dokumente sind nicht Copy&Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)<br />
|-<br />
|[http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]<br />
|{{Englisch}}<br />
|Sammlung von englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.<br />
|-<br />
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_0e43.asp MSDN von Microsoft]<br />
|{{Englisch}}<br />
|GLU Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Orginalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.<br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
=== GLX ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[[:Kategorie:GLX|DGL Wiki - Kategorie GLX]]<br />
|{{Deutsch}}<br />
| Wiki-Kategorie die alle übersetzten GLX Befehle enthält.<br />
|-<br />
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glx/ OpenGL.org - Orginal Spezifkationen]<br />
|{{Englisch}}<br />
|Orgninalspezifikationen der GLX Befehle bei OpenGL.org.<br />
|-<br />
|[http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]<br />
|{{Englisch}}<br />
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.<br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
=== WGL ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[[:Kategorie:WGL|DGL Wiki - Kategorie WGL]]<br />
|{{Deutsch}}<br />
|Wiki-Kategorie die alle übersetzten WGL Befehle enthält.<br />
|-<br />
|[http://developer.3dlabs.com/documents/wglmanpage_index.htm 3dLabs]<br />
|{{Englisch}}<br />
|Sammlung einiger WGL Befehlsspezifikationen.<br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
=== GLUT ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://freeglut.sourceforge.net/docs/api.php The freeglut Projekt]<br />
|{{Englisch}}<br />
|Englischsprachige Dokumentation zum OpenGL Utility Toolkit kurz GLUT.<br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
=== SDL ===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[[:Kategorie:SDL|DGL Wiki - Kategorie SDL]]<br />
|{{Deutsch}}<br />
|Übersicht aller auf die SDL bezogenen Artikel hier im Wiki. Darunter befinden sich eine Vielzahl von Übersetzungen der SDL Befehlspezifikationen. Diese können auch in der [[SDL-Funktionsübersicht]] gefunden werden.<br />
|-<br />
|[http://www.libsdl.org/cgi/docwiki.cgi/SDL_20API libsdl.org]<br />
|{{Englisch}}<br />
|Das Dokumentationswiki von libSDL.org enthält die komplette Dokumenation zur SDL in englischer Sprache.<br />
|-<br />
|-<br />
|[http://www.fp.sdl.de.vu/ fp.sdl.de.vu]<br />
|{{Englisch}}<br />
| Eine Webseite die speziell Informationen über die Programmierung von SDL unter Freepascal zur Verfügung stellt.<br />
|-<br />
|}<br />
</div><br />
<br><br><br />
<br />
== FAQs ==<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[[FAQ| DGL Wiki - FAQ]]<br />
|{{Deutsch}}<br />
|Ein FAQ (Frequently Asked Questions = Häufig gestellte Fragen) zu DelphiGL.com und dem DGL Wiki.<br />
|-<br />
|[http://www.3dsource.de/faq/index.htm 3dsource.de]<br />
|{{Deutsch}}<br />
|Ein FAQ zu Fragen rund um OpenGL.<br />
|-<br />
|}<br />
</div><br />
<br><br><br />
<br />
== Effekte und Techniken mit OpenGL ==<br />
<br />
===Glow===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www.gamasutra.com/view/feature/2107/realtime_glow.php Gamasutra]<br />
|{{Englisch}}<br />
|Beschreibt, wie man mit Hilfe von Shader(hier DirectX Shader) den Gloweffekt in Realtime umsetzt. Dabei wird erst die Technik dahinter erklährt, und dann wie man sie Schritt für Schritt umsetzt. <br />
|-<br />
|[http://collective.valve-erc.com/index.php?go=tron1 valve-erc.com]<br />
|{{Englisch}}<br />
|Schritt für Schritt Anleitung, wie man mit Hilfe von Cg in OpenGL den Glow Effekt realisieren kann <br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
===HDR===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www.gamedev.net/columns/hardcore/hdrrendering/ gamedev.net]<br />
|{{Englisch}}<br />
|Hier wird sehr kurz eingeleitet, was HDR Rendering überhaupt ist, dann wird der Aufbau des *.hdr Formats erläutert, und dann geht es schon von 0 auf 100 zum Programmieren. Erklährungen gibt es kaum, dafür werden fertige Shader(für DirectX) geboten. <br />
|-<br />
|[http://www.gamedev.net/reference/articles/article2208.asp gamedev.net]<br />
|{{Englisch}}<br />
|Beschreibt auch nur etwas kurz das HDR Verfahren, jedoch mit mehr mathematischen Hintergrund in Sachen Tonemapping. Beispielcode für Tonemapping in C++ liegt bei. <br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
===BSP Bäume===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www.3dtechdev.com/tutorials/leafbsp/3dbsptrees.html 3dtechdev.com]<br />
|{{Englisch}}<br />
|Das beste Dokument überhaupt, für allem die selber BSP Bäume compilieren möchte. Ist belegt mit sehr viel Grafik. Erst beginnt er das Prinzip allgemein zum umschreiben, dann wird alles genau erläutert, und mit verständlichen Pseudocode untermalt. <br />
|-<br />
|[http://www.3dtechdev.com/tutorials/illegalgeometry/illegalgeometrytut.html 3dtechdev.com]<br />
|{{Englisch}}<br />
|Nicht ganz so gut geworden, wie sein erstes Tutorial, aber erklährt auch sehr gut, wie man illegale Geometrie aufspürt und beseitigt. Wieder mit Grafiken und Pseudocodes verständlich belegt. Hiermit kann man seinem Map-Compiler den letzten Schliff verleien. <br />
|-<br />
|[http://www.gamedev.net/reference/articles/article981.asp Gamedev]<br />
|{{Englisch}}<br />
|Von Michael Abrash, dürfte der ''Erfinder'' von Quake sein. Naja, meine Englischkenntnisse reichen hier nicht ganz aus, um den Text zu verstehen. Ist etwas umständlich geschrieben. Dafür mit Grafiken unterlegt. <br />
|-<br />
|[http://www.zfx-online.de/Tutorials.php?ID=11 Part 1 - Allgemein]<br />
|{{Deutsch}}<br />
|Einzigste deutsche Referenz zu BSP Bäumen, dafür Daumen hoch. Ist aber nicht das Wahre: schlechter C Code, und ich hatte auch nicht den Einduck, das er die Theorie zu diesem Thema bis in die Tiefe verstanden hat(oder er wollte es nicht zu akademisch Erklähren oO). Aber ein guter Einstieg in dieses Thema. <br />
|-<br />
|[http://www.zfx-online.de/Tutorials.php?ID=13 Part 2 - Kollision und PVS]<br />
|{{Deutsch}}<br />
|-<br />
|[http://www.cs.uwec.edu/~stevende/cs455/programs/GameTutorials%20-%20Quake%203%20BSP%20Format.htm Quake3 *.bsp Format]<br />
|{{Englisch}}<br />
|Die beste Dokumentation für das BSP Format, die ich gefunden habe, besser als den Quake3 Sourcecode zu durchforsten. Leider etwas magere Eklährung zu wichtigen Themen wie Patches(Curved Surfaces). Ich pers. hatte jetzt 1 1/2 Wochen gebraucht, um das *.bsp Format vollständig zu verstehen. Ist aber anscheinend die beste Format Dokumentation im Netz. <br />
|-<br />
|[http://www.flipcode.com/articles/article_q2bsp.shtml Quake2 *.bsp Format]<br />
|{{Englisch}}<br />
|Kann auch nur soviel sagen, wie beim Link zuvor. Es fehlen hier auch zum Teil Informationen. Man muss halt viel ausprobieren, und sich den Quake 2 Source zu Herzen nehmen, damit man es versteht. <br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
===Himmel & Wolken===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=86024 Gamedev]<br />
|{{Englisch}}<br />
|Guter Thread mit vielen Anregungen und Links. <br />
|-<br />
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=135654 Gamedev]<br />
|{{Englisch}}<br />
|Hier wird die Diskussion zum obigen Link weitergeführt. <br />
|-<br />
|[http://freespace.virgin.net/hugo.elias/models/m_clouds.htm Plasma]<br />
|{{Englisch}}<br />
|Eine nette Idee um Plasma in Echtzeit zu generieren, und zu verändern. Leider nichts zum Shading. <br />
|-<br />
|[http://nis-lab.is.s.u-tokyo.ac.jp/~nis/cdrom/sig00_cloud.pdf 3D Wolken]<br />
|{{Englisch}}<br />
|Paper über generieren und rendern von 3 dimensionalen Wolken inklusive Schatten und Lichtstrahlen. Ich hab nur den Lichtstahlen-Algorithmus ausprobiert. Saulangsam aber sehr einfach zu implementieren. Einen Blick ist es auf jeden Fall wert. <br />
|-<br />
|[http://www.geocities.com/ngdash/whitepapers/skydomecolor.html Skydome]<br />
|{{Englisch}}<br />
|Wenn man mal schnell gute Farben für seinen Skydome braucht... <br />
|}<br />
</div><br />
<br><br />
<br />
===Terrain===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www.delphi3d.net/articles/viewarticle.php?article=terraintex.htm Delphi3D]<br />
|{{Englisch}}<br />
|Terraintexturierung. Hier hab ich es gelernt. Man sollte nur die Coverage-Faktoren in eine Textur stecken, dann verträgt es sich mit LODing besser. <br />
|-<br />
|[http://www.flipcode.com/articles/article_geomipmaps.shtml FlipCode]<br />
|{{Englisch}}<br />
|Artikel zu Geomipmaping. Zummindest hab ich es hier zum ersten mal gesehen. Und es funzt ganz gut. <br />
|-<br />
|[http://www.vterrain.org Virtual Terrain Project]<br />
|{{Englisch}}<br />
|Eine Seite mit Links und Artikeln zu allem, was etwas mit Terrainrendering zu tun hat.<br />
|-<br />
|}<br />
</div><br />
<br><br />
<br />
===Sonstiges===<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[[Materialsammlung]]<br />
|{{Deutsch}}<br />
|Sammlung von gängigen Parametern für [[glMaterial]] hier im Wiki.<br />
|-<br />
|[http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm Radiosity]<br />
|{{Englisch}}<br />
|Erklährt sehr schön die Funktionsweise von Radiosity, liefert Beispielcodes und ist recht gut illustriert.<br />
|-<br />
|[http://legion.gibbering.net/projectx/paper/shadow%20mapping/ Shadowmapping]<br />
|{{Englisch}}<br />
|Beschreibt das Trapezoidal Shadow Mapping - Verfahren für gerichte Lichter.<br />
|-<br />
|[http://www.flipcode.com/articles/article_generatingnames.shtml Namensgenerator]<br />
|{{Englisch}}<br />
|Per Zufallsgenrator Namen erzeugen, und nie wieder kreativ werden müssen.<br />
|-<br />
|[http://www.paulsprojects.net/tutorials/simplebump/simplebump.html Bumpmapping]<br />
|{{Englisch}}<br />
|Bumpmapping auf Lowend-Grakas. Damals war Bumpmapping noch was ganz tolles... <br />
|-<br />
|[http://www.paulsprojects.net/opengl/dpreflect/dpreflect.html Dot Product Reflect]<br />
|{{Englisch}}<br />
|zwar nur ne Demo, aber wenn man schon immer mal mit EMBM das Wasser aus Morrowind nachproggen wollte... <br />
|-<br />
|}<br />
</div><br />
<br><br><br />
<br />
== Beispiele/Demos mit Quelltext ==<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www.delphigl.de DelphiGL.de]<br />
|{{Deutsch}}<br />
| Hier finden sich besonders eindrucksvolle Newton Physik Demos. Meißtens sogar mit Quelltext.<br />
|-<br />
|[http://www.shadow3d.de.vu/ Shadow 3D]<br />
|{{Deutsch}}<br />
| Hier finden sich zwei Demos wie man Quake 3 Modelle lädt und eine glSlang Demo<br />
|-<br />
|[[Shadersammlung]] im DGL Wiki<br />
|{{Deutsch}}<br />
| Hier findet man freie Shadersourcen.<br />
|-<br />
|[http://www.humus.ca Humus]<br />
|{{Englisch}}<br />
| Diverse eindrucksvolle Demos zu verschiedenen Techniken, häufig mit Quelltext in C <br />
|}<br />
</div><br />
<br><br><br />
<br />
== weitere Links ==<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf CompGeo.pdf]<br />
|{{Deutsch}}<br />
| Script "Einführung in die Computergeometrie" von Dr. Pester (TU-Chemnitz). Ideales Nachschlagewerk für die Mathematik die einem bei der Grafikprogrammierung so begegnet.<br />
|-<br />
|[http://www.robsite.de/ robsite.de]<br />
|{{Deutsch}}<br />
| Auf dieser riesigen Seite finden sich auch viele weitere Links über verschiedene Themen der 3D Programmierung.<br />
|-<br />
|[http://www.3dlinks.com/links.cfm?categoryid=3&subcategoryid=21 3dlinks.com]<br />
|{{Englisch}}<br />
| Diese Seite hat es sich zur Hauptaufgabe gemacht Links auf Seiten mit dem Thema 3D zu sammeln.<br />
|-<br />
|[http://www.two-kings.de/links.html two-kings.de]<br />
|{{Englisch}}<br />
| Sammlung diverser interessanter Links, vorallem auf Themen im gamedev-Forum verweisend.<br />
|-<br />
|[http://www.delgine.com Delgine.com]<br />
|{{Englisch}}<br />
| Heimat des freien 3D Modellers "DeleD", welcher in Delphi programmiert ist. Ihr findet dort auch Modellpackete, Texturpackete, Plugins und Hilfe bei der Programmierung von Delphi und OpenGL.<br />
|}<br />
</div><br />
<br />
=Links zum Thema Spieleprogrammierung=<br />
==Kopierschutz==<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://inner-smile.com/nocrack.phtml Inner-Smile.com]<br />
|{{Englisch}}<br />
| Seite mit Gedanken zum Thema "Wie schütze ich meine Programme vor Crackern". Falls die Seite nicht erreichbar ist hat Google noch ne [http://www.google.com/search?q=cache:hpqPT5G4WB0J:www.inner-smile.com/nocrack.phtml+http://inner-smile.com/nocrack.phtml&hl=de&gl=de&ct=clnk&cd=1 Version im Archiv].<br />
|-<br />
|}<br />
</div><br />
<br />
==KI==<br />
<div align="center"><br />
{| width = "100%" {{Prettytable_B1}}<br />
!width="25%"|Link<br />
!width="5%"|Sprache<br />
!width="70%"|Beschreibung<br />
|-<br />
|[http://www.kbs.uni-hannover.de/Lehre/KI2/Presentationen/presentation9798/esprit/spieltheorie/spieltheorie.html Uni-Hannover - Spieltheorie]<br />
|{{Deutsch}}<br />
|Artikel über die Grundlagen von KI in Spielen.<br />
|-<br />
|[http://www.robsite.de/tutorials.php?tut=ki Robsite KI-Tutorials]<br />
|{{Deutsch}}<br />
| Sammlung von Texten zum Thema KI in Spielen. Beispiele sind meist in C++.<br />
|-<br />
|[http://ai-depot.com/ AI-Depot.com]<br />
|{{Englisch}}<br />
| Seite die sich ausschließlich mit KI in Spielen beschäftigt.<br />
|-<br />
|[http://www.ai-junkie.com/links.html AI-Junkie.com]<br />
|{{Englisch}}<br />
|Linkseite mit vielen KI relevanten Links. Die Seite AI-Junie selbst behandelt auch viele Themen rund um KI.<br />
|-<br />
|[http://www.aiwisdom.com/ AIWisdom.com]<br />
|{{Englisch}}<br />
|Seite die sich mit KIs in Spielen beschäftigt und sich zum Ziel gesetzt hat, alle Artikel zum Thema zu finden und zu Katalogisieren. Es gibt hier auch Artikel über die KIs bestehender Spiele.<br />
|-<br />
|[http://www.aiguru.com/ AIGuru.com]<br />
|{{Englisch}}<br />
|Newsseite zum Thema KI, Künstliches Leben, Hiernforschung, Robotik, Nanotechnologie - Halt alles was Spass macht.<br />
|-<br />
|[http://www.generation5.org/ Generation5.org]<br />
|{{Englisch}}<br />
|Seite über KI, Robotik, etc. . Leider scheint die Seite Probleme zu haben regelmäßig aktualisiert zu werden. Aber zumindest sollte man einige Artikel finden. Die werden ja nicht schlecht.<br />
|-<br />
|[http://www.gameai.com/ GameAI.com]<br />
|{{Englisch}}<br />
|Seite zum Thema KI in Spielen. Soll wohl einen gewissen Stellenwert in der AI-Szene haben.<br />
|-<br />
|[http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo19.php Algorithmus der Woche - Informatikjahr 2006]<br />
|{{Deutsch}}<br />
|Vielleicht schon etwas älter aber doch eine gute Anleitung um eine einfache Schach-KI zu erstellen.<br />
|}<br />
</div></div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2009_10&diff=24349DGL Treffen/2009 102009-12-10T13:36:01Z<p>I0n0s: /* Jeder */</p>
<hr />
<div>Es wurde kurzfristig vorgeschlagen den Jahresresturlaub über Silvester im Allgäu (Füssen) zu verfeiern.<br />
<br />
;Thema: "DGL-FireNerds." ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://delphigl.com/forum/viewtopic.php?f=4&t=8785&start=0 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
Frase kann ein Ferienhaus in [http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=Wei%C3%9Fensee,+Thanellerstra%C3%9Fe+4,+F%C3%BCssen&sll=47.580912,10.629712&sspn=0.003836,0.006759&g=Thanellerstra%C3%9Fe+7,+Wei%C3%9Fensee+87629+F%C3%BCssen,+Ostallg%C3%A4u,+Bayern&ie=UTF8&hq=&hnear=Thanellerstra%C3%9Fe+4,+Wei%C3%9Fensee+87629+F%C3%BCssen,+Ostallg%C3%A4u,+Bayern&ll=47.582203,10.629991&spn=0.003836,0.006759&t=h&z=18 Weißensee] für 6-8 Personen zur Verfügung stellen.<br />
<br />
==Wann?==<br />
*Anreise: ca. Mo. 28.12.2009<br />
*Abreise: ca. So. 03.01.2010<br />
<br />
==Was kostet das?==<br />
Übernachtung wird nach aktuellem Stand kostenlos sein. Es fällt nur ein Unkostenbeitrag für Heizung, Strom und Wasser von 10 Euro pro Nase an (für die ganze Woche!).<br />
<br />
Verpflegung und Anreise sind wie beim letzten mal von den Teilnehmern zu tragen.<br />
Wir versuchen natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Es sind insgesamt 6+2 Betten im Haus.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(7=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|7<br />
|PKW <br />
|(2 Plätze im PKW frei.)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|7<br />
|Phobeus<br />
|<br />
|-<br />
|Phobeus<br />
|X<br />
|<br />
|7<br />
|PKW<br />
|(1 Plätze im Auto frei.)<br />
|-<br />
|Frase<br />
|X<br />
|<br />
|7<br />
|PKW<br />
|<br />
|-<br />
|''Evil-Devil''<br />
|<br />
|<br />
|7<br />
|Phobeus<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Noch zu klären.<br />
<br />
Flash reist vorraussichtlich mit dem PKW aus Chemnitz an. Wer zwischen Chemnitz und Füssen wohnt (z.B. Nürnberg oder Regensburg, München) kann aufgesammelt werden.<br />
Frase reist wohl auch per PKW an. Alles, was zwischen Nürnberg, München und Füssen wohnt, kann da eingesammelt werden.<br />
Phobeus reist vorraussichtlich mit dem PKW aus der Richtung Hamburg an. Der Reiseweg Richtung Füssen würde entlang der A7 über Hannover, Kassel, Würzburg gehen. Reiseweg danach ist unklar. Je Nach Reiselast der jeweiligen Leute würden 2-3 Leute mitkommen können. Fahrtkosten entfallen. Da die Reisezeit zwischen 8-10 Stunden abgelegt werden muss, wird eine frühzeitige Abfahrt aus HH stattfinden.<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche??<br />
* Handtücher??<br />
* Wechsel-Kleidung<br />
* Nahrungsmittel<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen (inkl. Sonnencreme)<br />
* Elektronik (Laptop, Fotoapparat, Tanzmatten)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Silvestergrillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*ausgewachsene Männchen der Spezies Homo sapiens sapiens bei Versuchen mit Brettern überfrorene Abhänge hinunter zu fahren. --> Lawinengefahr!! ;)</div>I0n0shttps://wiki.delphigl.com/index.php?title=DGL_Treffen/2009_10&diff=24348DGL Treffen/2009 102009-12-10T13:34:58Z<p>I0n0s: /* Wer kommt mit? */</p>
<hr />
<div>Es wurde kurzfristig vorgeschlagen den Jahresresturlaub über Silvester im Allgäu (Füssen) zu verfeiern.<br />
<br />
;Thema: "DGL-FireNerds." ;-)<br />
<br />
Weitere Infos und detaillierte Besprechungen finden in [http://delphigl.com/forum/viewtopic.php?f=4&t=8785&start=0 diesem Forenthread] statt.<br />
<br />
<br />
==Wo?==<br />
Frase kann ein Ferienhaus in [http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=Wei%C3%9Fensee,+Thanellerstra%C3%9Fe+4,+F%C3%BCssen&sll=47.580912,10.629712&sspn=0.003836,0.006759&g=Thanellerstra%C3%9Fe+7,+Wei%C3%9Fensee+87629+F%C3%BCssen,+Ostallg%C3%A4u,+Bayern&ie=UTF8&hq=&hnear=Thanellerstra%C3%9Fe+4,+Wei%C3%9Fensee+87629+F%C3%BCssen,+Ostallg%C3%A4u,+Bayern&ll=47.582203,10.629991&spn=0.003836,0.006759&t=h&z=18 Weißensee] für 6-8 Personen zur Verfügung stellen.<br />
<br />
==Wann?==<br />
*Anreise: ca. Mo. 28.12.2009<br />
*Abreise: ca. So. 03.01.2010<br />
<br />
==Was kostet das?==<br />
Übernachtung wird nach aktuellem Stand kostenlos sein. Es fällt nur ein Unkostenbeitrag für Heizung, Strom und Wasser von 10 Euro pro Nase an (für die ganze Woche!).<br />
<br />
Verpflegung und Anreise sind wie beim letzten mal von den Teilnehmern zu tragen.<br />
Wir versuchen natürlich beides zu optimieren d.h. Fahrgemeinschaften auf den Fahrten und Gemeinschaftskasse bei der Verpflegung.<br />
<br />
==Wer kommt mit?==<br />
Hier eine vorläufige Teilnehmerliste. Es sind insgesamt 6+2 Betten im Haus.<br />
{|{{Prettytable_B1}}<br />
!Teilnehmer<br />
!Fest<br />
!Bezahlt<br />
!Tage<br />
(7=max)<br />
!Anreise<br />
!Kommentar<br />
|-<br />
|Flash<br />
|X<br />
|<br />
|7<br />
|PKW <br />
|(2 Plätze im PKW frei.)<br />
|-<br />
|i0n0s<br />
|X<br />
|<br />
|7<br />
|Phobeus<br />
|<br />
|-<br />
|Phobeus<br />
|X<br />
|<br />
|7<br />
|PKW<br />
|(1 Plätze im Auto frei.)<br />
|-<br />
|Frase<br />
|X<br />
|<br />
|7<br />
|PKW<br />
|<br />
|-<br />
|''Evil-Devil''<br />
|<br />
|<br />
|7<br />
|Phobeus<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|''frei''<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|-<br />
|}<br />
<br />
==Wie kommt man hin?==<br />
Noch zu klären.<br />
<br />
Flash reist vorraussichtlich mit dem PKW aus Chemnitz an. Wer zwischen Chemnitz und Füssen wohnt (z.B. Nürnberg oder Regensburg, München) kann aufgesammelt werden.<br />
Frase reist wohl auch per PKW an. Alles, was zwischen Nürnberg, München und Füssen wohnt, kann da eingesammelt werden.<br />
Phobeus reist vorraussichtlich mit dem PKW aus der Richtung Hamburg an. Der Reiseweg Richtung Füssen würde entlang der A7 über Hannover, Kassel, Würzburg gehen. Reiseweg danach ist unklar. Je Nach Reiselast der jeweiligen Leute würden 2-3 Leute mitkommen können. Fahrtkosten entfallen. Da die Reisezeit zwischen 8-10 Stunden abgelegt werden muss, wird eine frühzeitige Abfahrt aus HH stattfinden.<br />
<br />
== Sonstiges Organisatorisches ==<br />
In jedem Fall sollte jeder Mitfahrer eigenständig Kontakt mit mindestens seinem Fahrer aufnehmen und die genaue Anreise klären. Handynummer können an Phobeus geschickt werden. Jeder der seine Nummer preisgibt, erhält die Nummern der jeweilig Anderen. Sofern also niemand damit bedenken hat, sollte davon gebrauch machen. Das letzte Mal hatten lediglich die Fahrer die Nummern untereinander, was unglücklich ist, da gerade diese am Steuer sitzen ;)<br />
<br />
==Was muss man mitbringen?==<br />
===1x für Alle===<br />
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)<br />
* Klopapier<br />
* 1 Router<br />
* Netzwerkkabel<br />
<br />
===Jeder===<br />
* Das [[DGL Shirt]] - wer eins hat!<br />
* Bargeld (Kaution (siehe Forum) + Reisekasse)<br />
* Bettwäsche??<br />
* Handtücher??<br />
* Wechsel-Kleidung<br />
* Nahrungsmittel<br />
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)<br />
* Reiseapotheke<br />
* Hygieneartikel<br />
* Badesachen (inkl. Sonnencreme)<br />
* Elektronik (Laptop, Fotoapparat)<br />
* Sonstiges (was zu lesen, Schreibzeug etc.) <br />
''zu klären''<br />
<br />
==Was gibts zu erleben?==<br />
*DGLer in echt ;)<br />
*Silvestergrillen<br />
*Eine Minni-LAN<br />
*Videoabende<br />
*Live Projektvorstellung<br />
*ausgewachsene Männchen der Spezies Homo sapiens sapiens bei Versuchen mit Brettern überfrorene Abhänge hinunter zu fahren. --> Lawinengefahr!! ;)</div>I0n0s