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

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Link&amp;diff=27058</id>
		<title>Link</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Link&amp;diff=27058"/>
				<updated>2021-08-30T16:39:10Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Soundeffekte */ noch ein Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
!!!!!!!! NUTZT DIESE TABELLE ALS VORLAGE FÜR WEITERE LINKTABELLEN !!!!!!!&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Linksammlung soll allgemeine Links zu unterschiedlichen Themen bieten, die mit der Multimediaentwicklung zu tun haben.&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Zusammenführung mit [[Tool]] sinnvoll!}}&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Aufteilung in Unterseiten sinnvoll (möglicherweise mit Kategorien)}}&lt;br /&gt;
&lt;br /&gt;
= Entwicklung mit OpenGL =&lt;br /&gt;
&lt;br /&gt;
== Hardwareinfos ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://openglcaps.delphigl.de/ glCapsViewer Datenbank]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Datenbank enthält alle mit [http://www.delphigl.com/forum/viewtopic.php?f=13&amp;amp;t=10010 glCapsViewer] gesammelten Informationen, also insbesondere OpenGL-Version und -Extensions verschiedener Grafikkarten.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090417044334/http://delphi3d.net/hardware/listreports.php OpenGL Hardware Registry - Hardwareübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090506094005/http://delphi3d.net/hardware/ OpenGL Hardware Registry - Extensionübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
||[[Tutorial|DGL Wiki - Tutorial]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|DelphiGL.com ist Betreiber dieses Wikis und stellt eine Vielzahl Tutorials mit Schwerpunkt OpenGL zur Verfügung. &lt;br /&gt;
Neben Tutorials für Einsteiger und OpenGL Anfänger gibt es auch fortgeschrittene Themen wie Shader oder Partikelsysteme. Sprache der Wahl ist hier Delphi.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.joachimrohde.com/cms/xoops/modules/articles/index.php?cat_id=1 joachimrohde.com]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr deutsche Übersetzungen der bekannten NeHe Tutorials. Sprache der Wahl ist hier C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cg.tuwien.ac.at/studentwork/VRSem96/OpenGL/ Technische Universität Wien]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Diese Seite bietet einen allgemeinen Überblick über die primären Funktionen von OpenGL und richtet sich vor allem an Einsteiger.&lt;br /&gt;
|-&lt;br /&gt;
|[http://nehe.gamedev.net/ Nehe] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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). )&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.sulaco.co.za/tut.htm sulaco.co.za] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| OpenGL Beispiele in Delphi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenGL Funktionen ==&lt;br /&gt;
&lt;br /&gt;
=== GL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GL|DGL Wiki - Kategorie GL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten OpenGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://developer.3dlabs.com/documents/glmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_4f03.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|OpenGL Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLU ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLU|DGL Wiki - Kategorie GLU]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLU Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/ OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Originalspezifikationen für die GLU Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_0e43.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|GLU Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLX ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLX|DGL Wiki - Kategorie GLX]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLX Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glx/ OpenGL.org - Original  Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Orgninalspezifikationen der GLX Befehle bei OpenGL.org.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WGL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:WGL|DGL Wiki - Kategorie WGL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Wiki-Kategorie die alle übersetzten WGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071218151417/http://developer.3dlabs.com/documents/wglmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung einiger WGL Befehlsspezifikationen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLUT ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://freeglut.sourceforge.net/docs/api.php The freeglut Projekt]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Englischsprachige Dokumentation zum OpenGL Utility Toolkit kurz GLUT.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SDL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:SDL|DGL Wiki - Kategorie SDL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ü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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.libsdl.org/cgi/docwiki.cgi/SDL_20API libsdl.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Das Dokumentationswiki von libSDL.org enthält die komplette Dokumenation zur SDL in englischer Sprache.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.freepascal-meets-sdl.net/ freepascal meets sdl]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Eine Webseite die speziell Informationen über die Programmierung von SDL unter Freepascal zur Verfügung stellt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[FAQ| DGL Wiki - FAQ]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ (Frequently Asked Questions = Häufig gestellte Fragen) zu DelphiGL.com und dem DGL Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dsource.de/faq/index.htm 3dsource.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ zu Fragen rund um OpenGL.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Effekte und Techniken mit OpenGL ==&lt;br /&gt;
&lt;br /&gt;
===Glow===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamasutra.com/view/feature/2107/realtime_glow.php Gamasutra]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt, wie man mit Hilfe von Shader(hier DirectX Shader) den Gloweffekt in Realtime umsetzt. Dabei wird erst die Technik dahinter erklärt, und dann wie man sie Schritt für Schritt umsetzt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071118043007/http://collective.valve-erc.com/index.php?go=tron1 valve-erc.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Schritt für Schritt Anleitung, wie man mit Hilfe von Cg in OpenGL den Glow Effekt realisieren kann &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===HDR===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601052809/http://www.gamedev.net/columns/hardcore/hdrrendering/ gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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ärungen gibt es kaum, dafür werden fertige Shader(für DirectX) geboten. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601202039/http://www.gamedev.net/reference/articles/article2208.asp gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt auch nur etwas kurz das HDR Verfahren, jedoch mit mehr mathematischen Hintergrund in Sachen Tonemapping. Beispielcode für Tonemapping in C++ liegt bei. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BSP Bäume===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081201115631/http://www.3dtechdev.com/tutorials/leafbsp/3dbsptrees.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081019041535/http://www.3dtechdev.com/tutorials/illegalgeometry/illegalgeometrytut.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Nicht ganz so gut geworden, wie sein erstes Tutorial, aber erklärt 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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/reference/articles/article981.asp Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=11 Part 1 - Allgemein]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|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ären oO). Aber ein guter Einstieg in dieses Thema. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=13 Part 2 - Kollision und PVS]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20060516103821/http://www.cs.uwec.edu/~stevende/cs455/programs/GameTutorials%20-%20Quake%203%20BSP%20Format.htm Quake3 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_q2bsp.shtml Quake2 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Himmel &amp;amp; Wolken===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=86024 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Guter Thread mit vielen Anregungen und Links. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=135654 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Hier wird die Diskussion zum obigen Link weitergeführt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/models/m_clouds.htm Plasma]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine nette Idee um Plasma in Echtzeit zu generieren, und zu verändern. Leider nichts zum Shading. &lt;br /&gt;
|-&lt;br /&gt;
|[http://nis-lab.is.s.u-tokyo.ac.jp/~nis/cdrom/sig00_cloud.pdf 3D Wolken]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20031011052035/http://www.geocities.com/ngdash/whitepapers/skydomecolor.html Skydome]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Wenn man mal schnell gute Farben für seinen Skydome braucht... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Terrain===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_geomipmaps.shtml FlipCode]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Artikel zu Geomipmaping. Zummindest hab ich es hier zum ersten mal gesehen. Und es funzt ganz gut. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.vterrain.org Virtual Terrain Project]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine Seite mit Links und Artikeln zu allem, was etwas mit Terrainrendering zu tun hat.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sonstiges===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[Materialsammlung]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Sammlung von gängigen Parametern für [[glMaterial]] hier im Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm Radiosity]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Erklärt sehr schön die Funktionsweise von Radiosity, liefert Beispielcodes und ist recht gut illustriert.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20050825110920/http://legion.gibbering.net/projectx/paper/shadow%20mapping/ Shadowmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt das Trapezoidal Shadow Mapping - Verfahren für gerichte Lichter.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_generatingnames.shtml Namensgenerator]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Per Zufallsgenrator Namen erzeugen, und nie wieder kreativ werden müssen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/tutorials/simplebump/simplebump.html Bumpmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Bumpmapping auf Lowend-Grakas. Damals war Bumpmapping noch was ganz tolles... &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/opengl/dpreflect/dpreflect.html Dot Product Reflect]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|zwar nur ne Demo, aber wenn man schon immer mal mit EMBM das Wasser aus Morrowind nachproggen wollte... &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiele/Demos mit Quelltext ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphigl.de DelphiGL.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich besonders eindrucksvolle Newton Physik Demos. Meißtens sogar mit Quelltext.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.shadow3d.de.vu/ Shadow 3D]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich zwei Demos wie man Quake 3 Modelle lädt und eine glSlang Demo&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadersammlung]] im DGL Wiki&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier findet man freie Shadersourcen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.humus.name Humus]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diverse eindrucksvolle Demos zu verschiedenen Techniken, häufig mit Quelltext in C (teilweise OpenGL / DirectX)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== weitere Links ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf CompGeo.pdf]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Script &amp;quot;Einführung in die Computergeometrie&amp;quot; von Dr. Pester (TU-Chemnitz). Ideales Nachschlagewerk für die Mathematik die einem bei der Grafikprogrammierung so begegnet.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.robsite.de/ robsite.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Auf dieser riesigen Seite finden sich auch viele weitere Links über verschiedene Themen der 3D Programmierung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dlinks.com/links.cfm?categoryid=3&amp;amp;subcategoryid=21 3dlinks.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diese Seite hat es sich zur Hauptaufgabe gemacht Links auf Seiten mit dem Thema 3D zu sammeln.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.two-kings.de/links.html two-kings.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Sammlung diverser interessanter Links, vorallem auf Themen im gamedev-Forum verweisend.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delgine.com Delgine.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Heimat des freien 3D Modellers &amp;quot;DeleD&amp;quot;, welcher in Delphi programmiert ist. Ihr findet dort auch Modellpackete, Texturpackete, Plugins und Hilfe bei der Programmierung von Delphi und OpenGL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Spieleentwicklung =&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.spieleprogrammierung.net/ Spieleprogrammierung - OpenGL - GLSL - OpenAL - KI - Animation - Spielephysik]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Artikel, Tutorials und Programmbeispiele rund um das Thema Spieleprogrammierung. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://graphics-and-physics-framework.spieleprogrammierung.net/ OpenGL Graphics And Physics Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenGL basiertes Grafik und Physik Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://audio-framework.spieleprogrammierung.net/ OpenAL Audio Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenAL Audio Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Unterstützt werden 3D Sounds, EFX (EAX Alternative) Reverb Effekte sowie Audio Streaming (Music and Voices). Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://spieleentwicklung-im-web.spieleprogrammierung.net/ Spieleentwicklung im Web]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Links (E-Books, Präsentationen, wissenschaftliche Arbeiten und Tutorials) zu verschiedenen Themengebieten der Spieleentwicklung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://harablog.wordpress.com/2011/08/26/fast-pathfinding-via-symmetry-breaking/ Fast pathfinding via symmetry breaking]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Optimierungen für A* Pfadsuche durch Ausnutzung von Symmetrien.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Kopierschutz==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://inner-smile.com/nocrack.phtml Inner-Smile.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite mit Gedanken zum Thema &amp;quot;Wie schütze ich meine Programme vor Crackern&amp;quot;. 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&amp;amp;hl=de&amp;amp;gl=de&amp;amp;ct=clnk&amp;amp;cd=1 Version im Archiv].&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Künstliche Intelligenz ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080319034335/http://www.kbs.uni-hannover.de/Lehre/KI2/Presentationen/presentation9798/esprit/spieltheorie/spieltheorie.html Uni-Hannover - Spieltheorie]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Artikel über die Grundlagen von KI in Spielen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080927010337/http://www.robsite.de/tutorials.php?tut=ki Robsite KI-Tutorials]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Sammlung von Texten zum Thema KI in Spielen. Beispiele sind meist in C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://ai-depot.com/ AI-Depot.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite die sich ausschließlich mit KI in Spielen beschäftigt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ai-junkie.com/links.html AI-Junkie.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Linkseite mit vielen KI relevanten Links. Die Seite AI-Junie selbst behandelt auch viele Themen rund um KI.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiwisdom.com/ AIWisdom.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiguru.com/ AIGuru.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Newsseite zum Thema KI, Künstliches Leben, Hiernforschung, Robotik, Nanotechnologie - Halt alles was Spaß macht.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.generation5.org/ Generation5.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080702005527/http://www.gameai.com/ www.gameai.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|''Wurde Januar 2010 als down gemeldet. Weiss irgendwer etwas genaueres?'' Seite zum Thema KI in Spielen. Soll wohl einen gewissen Stellenwert in der AI-Szene haben.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo19.php Algorithmus der Woche - Informatikjahr 2006]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Vielleicht schon etwas älter aber doch eine gute Anleitung um eine einfache Schach-KI zu erstellen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Ressourcen =&lt;br /&gt;
In dieser Gruppe finden sich Links um die Ressourcen für Eure Projekte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;80%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://opengameart.org/ opengameart.org]&lt;br /&gt;
|Eine Seite die es jedem anbietet Spielressourcen wie Musik, Texturen, 3D-Modelle und anderes hochzuladen und diese unter einer beliebigen Lizenz zu veröffentlichen. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texturen / 2D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
'''Legende:'''&lt;br /&gt;
:'''Kostenpflichtige Seiten''' sind mit einem * zu '''kennzeichnen'''&lt;br /&gt;
:GPL: Kompatibel mit der GPL&lt;br /&gt;
:MPL: Kompatibel mit der MPL&lt;br /&gt;
:OSS: Verwendung in OpenSource Software nicht verboten&lt;br /&gt;
:CSS: Verwendung in ClosedSource Software nicht verboten&lt;br /&gt;
:Komm: Verwendung in kommerzieller Software nicht verboten&lt;br /&gt;
&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Genre&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
!width=&amp;quot;35%&amp;quot;|Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.davegh.com/ davegh.com]&lt;br /&gt;
|Fantasy&lt;br /&gt;
|[http://www.davegh.com/legal.php Eigene]&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|Die Lizenz vererbt sich in die Projekte hinein.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cgtextures.com/ cgtextures.com]&lt;br /&gt;
|Allgemein&lt;br /&gt;
|[http://www.cgtextures.com/content.php?action=license Eigene]&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|Die Lizenz will im wesentlichen verhindern das Texturen in anderen Textursammlungen auftauchen. So wie ich das verstehe ist es kein Problem die Texturen unter einer anderen Lizenz zu veröffentlichen als die eigentliche Software. Die Software kann also sehr wohl OpenSource sein. Im Zweifelsfalls einfach den Support anschreiben, der ist sehr nett.&lt;br /&gt;
|-&lt;br /&gt;
|[https://wiki.openstreetmap.org/wiki/Texture_Library OpenStreetMap Texture Library]&lt;br /&gt;
|Allgemein &lt;br /&gt;
|Public Domain&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Die Texturen dienen der Visualisierung der 3D-Gebäude im OpenStreetMap Projekt&lt;br /&gt;
|-&lt;br /&gt;
|url&lt;br /&gt;
|Futuristisch, Mittelalter, etc.&lt;br /&gt;
|CC-BY-SA, etc., gerne auch mit Direktlink auf die Lizenzseite, so vorhanden.&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|Alle Bilder sind von Käse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sonstige 2D-Grafiken ===&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.famfamfam.com/lab/icons/silk/ famfamfam silk]&lt;br /&gt;
|Iconset, welches inzwischen relativ weit verbreitet ist. 700 sauber gezeichnete, erkennbare PNG-Icons in TrueColor. Man kann praktisch jede (Arbeits-)Anwendung mit diesem Set vollständig mit Icons versorgen.&lt;br /&gt;
|[http://creativecommons.org/licenses/by/2.5/ CC-BY 2.5], [http://creativecommons.org/licenses/by/3.0/ CC-BY 3.0]&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Texturerstellung ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://3d.diehlsworld.de/textures/index.htm 3d.diehlsworld.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr kurze aber inhaltlich reiche Tutorials zu der Frage &amp;quot;Wie erstelle ich XXXXX-Texturen&amp;quot;. 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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gimps.de/gimp/textur-muster/ gimps.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Schritt für Schritt Anleitungen wie man mit Gimp verschiedene Texturen erstellt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://cbt.k090999.de/gimp.php#texturen k090999.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Gimptutorials zum Erstellen verschiedene Texturen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modelle / 3D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/viewtopic.php?t=5786 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Ein Thread im Forum von [http://blendpolis.de Blendpolis] in dem '''sehr''' viele Tutorials aufgelistet sind&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/article_cat.php?fldAuto=7 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Eigentliche Tutorial Seite von [http://blendpolis.de Blendpolis] die Auswahl ist hier aber nicht so groß&lt;br /&gt;
|-&lt;br /&gt;
|[http://wikivid.com/index.php/Blender Blender at wikivid.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Linksammlung von Blender Video Tutorials &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.blender.org/education-help/tutorials/getting-started/ blender3d.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Auch die Heimatseite von Blender bietet viele Tutorials unter anderm auch Video Tuorials&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.Blenderunderground.com Blenderunderground]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| '''sehr gute''' Video-Tutorials&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sounds ==&lt;br /&gt;
&lt;br /&gt;
===Musik===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.jamendo.com/ Jamendo.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele Künstler stellen hier ihre Alben unter einer Creative Commons Lizenz online. Man kann dort die Künstler auch kontaktieren und fragen ob man ihre Musik nutzen kann. Taugt außerdem als Radio! ;)&lt;br /&gt;
|-&lt;br /&gt;
|[https://incompetech.com/music/ Incompetech.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele sehr schön gemacht instrumentale Musik aus allen möglichen Genres. Sie ist frei verwendbar, wenn man den Macher der Musik (Kevin MacLeod) in seinem Programm erwähnt. Aber das hat er auch verdient. Folgende Programme nutzen beispielsweise (auch) Musik von incompetech.com:&lt;br /&gt;
* OpenParty&lt;br /&gt;
|-&lt;br /&gt;
|[https://freepd.com/ freepd.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Musik ebenfalls von Kevin MacLeod und anderen Künstlern, die sogar unter Public Domain steht. Man darf sie also kostenlos für alles verwenden und muss noch nicht mal den Urheber nennen (wäre natürlich trotzdem nett).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundeffekte===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.freesound.org/ freesound.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Diverse Sounds unter [https://creativecommons.org/ CreativeCommons] Lizenzen.&lt;br /&gt;
|-&lt;br /&gt;
|[https://sonniss.com/gameaudiogdc SONNISS Game Audio GDC]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Gigabyteweise hochqualitative Sounds, kostenlos und kommerziell nutzbar. Ist wohl als Werbung für noch mehr Sounds von SONNISS gedacht.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundprogramme===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://audacity.sourceforge.net/?lang=de Sourceforgeseite von Audacity]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein einfaches, freies Programm um Sounddateien zu bearbeiten. Man kann es auch nutzen um Soundeffekte neu zu erstellen, indem man z.B. ein Geräusch mit dem Mikrofon aufnimmt und einige Effekt anwendet, um es passender und nicht mehr aufgenommen klingen zu lassen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://lmms.sourceforge.net/ LMMS]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|LMMS (Linux MultiMedia Studio) ist ein OpenSource+Freeware Composer-Programm ähnlich zum bekannteren aber auch teuren CuBase(r). Trotz des Namens auch für Windows erhältlich.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Link&amp;diff=27057</id>
		<title>Link</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Link&amp;diff=27057"/>
				<updated>2021-08-30T16:38:33Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Soundeffekte */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
!!!!!!!! NUTZT DIESE TABELLE ALS VORLAGE FÜR WEITERE LINKTABELLEN !!!!!!!&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Linksammlung soll allgemeine Links zu unterschiedlichen Themen bieten, die mit der Multimediaentwicklung zu tun haben.&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Zusammenführung mit [[Tool]] sinnvoll!}}&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Aufteilung in Unterseiten sinnvoll (möglicherweise mit Kategorien)}}&lt;br /&gt;
&lt;br /&gt;
= Entwicklung mit OpenGL =&lt;br /&gt;
&lt;br /&gt;
== Hardwareinfos ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://openglcaps.delphigl.de/ glCapsViewer Datenbank]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Datenbank enthält alle mit [http://www.delphigl.com/forum/viewtopic.php?f=13&amp;amp;t=10010 glCapsViewer] gesammelten Informationen, also insbesondere OpenGL-Version und -Extensions verschiedener Grafikkarten.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090417044334/http://delphi3d.net/hardware/listreports.php OpenGL Hardware Registry - Hardwareübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090506094005/http://delphi3d.net/hardware/ OpenGL Hardware Registry - Extensionübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
||[[Tutorial|DGL Wiki - Tutorial]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|DelphiGL.com ist Betreiber dieses Wikis und stellt eine Vielzahl Tutorials mit Schwerpunkt OpenGL zur Verfügung. &lt;br /&gt;
Neben Tutorials für Einsteiger und OpenGL Anfänger gibt es auch fortgeschrittene Themen wie Shader oder Partikelsysteme. Sprache der Wahl ist hier Delphi.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.joachimrohde.com/cms/xoops/modules/articles/index.php?cat_id=1 joachimrohde.com]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr deutsche Übersetzungen der bekannten NeHe Tutorials. Sprache der Wahl ist hier C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cg.tuwien.ac.at/studentwork/VRSem96/OpenGL/ Technische Universität Wien]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Diese Seite bietet einen allgemeinen Überblick über die primären Funktionen von OpenGL und richtet sich vor allem an Einsteiger.&lt;br /&gt;
|-&lt;br /&gt;
|[http://nehe.gamedev.net/ Nehe] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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). )&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.sulaco.co.za/tut.htm sulaco.co.za] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| OpenGL Beispiele in Delphi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenGL Funktionen ==&lt;br /&gt;
&lt;br /&gt;
=== GL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GL|DGL Wiki - Kategorie GL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten OpenGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://developer.3dlabs.com/documents/glmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_4f03.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|OpenGL Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLU ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLU|DGL Wiki - Kategorie GLU]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLU Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/ OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Originalspezifikationen für die GLU Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_0e43.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|GLU Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLX ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLX|DGL Wiki - Kategorie GLX]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLX Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glx/ OpenGL.org - Original  Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Orgninalspezifikationen der GLX Befehle bei OpenGL.org.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WGL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:WGL|DGL Wiki - Kategorie WGL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Wiki-Kategorie die alle übersetzten WGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071218151417/http://developer.3dlabs.com/documents/wglmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung einiger WGL Befehlsspezifikationen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLUT ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://freeglut.sourceforge.net/docs/api.php The freeglut Projekt]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Englischsprachige Dokumentation zum OpenGL Utility Toolkit kurz GLUT.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SDL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:SDL|DGL Wiki - Kategorie SDL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ü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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.libsdl.org/cgi/docwiki.cgi/SDL_20API libsdl.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Das Dokumentationswiki von libSDL.org enthält die komplette Dokumenation zur SDL in englischer Sprache.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.freepascal-meets-sdl.net/ freepascal meets sdl]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Eine Webseite die speziell Informationen über die Programmierung von SDL unter Freepascal zur Verfügung stellt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[FAQ| DGL Wiki - FAQ]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ (Frequently Asked Questions = Häufig gestellte Fragen) zu DelphiGL.com und dem DGL Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dsource.de/faq/index.htm 3dsource.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ zu Fragen rund um OpenGL.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Effekte und Techniken mit OpenGL ==&lt;br /&gt;
&lt;br /&gt;
===Glow===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamasutra.com/view/feature/2107/realtime_glow.php Gamasutra]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt, wie man mit Hilfe von Shader(hier DirectX Shader) den Gloweffekt in Realtime umsetzt. Dabei wird erst die Technik dahinter erklärt, und dann wie man sie Schritt für Schritt umsetzt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071118043007/http://collective.valve-erc.com/index.php?go=tron1 valve-erc.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Schritt für Schritt Anleitung, wie man mit Hilfe von Cg in OpenGL den Glow Effekt realisieren kann &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===HDR===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601052809/http://www.gamedev.net/columns/hardcore/hdrrendering/ gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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ärungen gibt es kaum, dafür werden fertige Shader(für DirectX) geboten. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601202039/http://www.gamedev.net/reference/articles/article2208.asp gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt auch nur etwas kurz das HDR Verfahren, jedoch mit mehr mathematischen Hintergrund in Sachen Tonemapping. Beispielcode für Tonemapping in C++ liegt bei. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BSP Bäume===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081201115631/http://www.3dtechdev.com/tutorials/leafbsp/3dbsptrees.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081019041535/http://www.3dtechdev.com/tutorials/illegalgeometry/illegalgeometrytut.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Nicht ganz so gut geworden, wie sein erstes Tutorial, aber erklärt 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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/reference/articles/article981.asp Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=11 Part 1 - Allgemein]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|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ären oO). Aber ein guter Einstieg in dieses Thema. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=13 Part 2 - Kollision und PVS]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20060516103821/http://www.cs.uwec.edu/~stevende/cs455/programs/GameTutorials%20-%20Quake%203%20BSP%20Format.htm Quake3 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_q2bsp.shtml Quake2 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Himmel &amp;amp; Wolken===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=86024 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Guter Thread mit vielen Anregungen und Links. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=135654 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Hier wird die Diskussion zum obigen Link weitergeführt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/models/m_clouds.htm Plasma]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine nette Idee um Plasma in Echtzeit zu generieren, und zu verändern. Leider nichts zum Shading. &lt;br /&gt;
|-&lt;br /&gt;
|[http://nis-lab.is.s.u-tokyo.ac.jp/~nis/cdrom/sig00_cloud.pdf 3D Wolken]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20031011052035/http://www.geocities.com/ngdash/whitepapers/skydomecolor.html Skydome]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Wenn man mal schnell gute Farben für seinen Skydome braucht... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Terrain===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_geomipmaps.shtml FlipCode]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Artikel zu Geomipmaping. Zummindest hab ich es hier zum ersten mal gesehen. Und es funzt ganz gut. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.vterrain.org Virtual Terrain Project]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine Seite mit Links und Artikeln zu allem, was etwas mit Terrainrendering zu tun hat.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sonstiges===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[Materialsammlung]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Sammlung von gängigen Parametern für [[glMaterial]] hier im Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm Radiosity]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Erklärt sehr schön die Funktionsweise von Radiosity, liefert Beispielcodes und ist recht gut illustriert.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20050825110920/http://legion.gibbering.net/projectx/paper/shadow%20mapping/ Shadowmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt das Trapezoidal Shadow Mapping - Verfahren für gerichte Lichter.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_generatingnames.shtml Namensgenerator]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Per Zufallsgenrator Namen erzeugen, und nie wieder kreativ werden müssen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/tutorials/simplebump/simplebump.html Bumpmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Bumpmapping auf Lowend-Grakas. Damals war Bumpmapping noch was ganz tolles... &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/opengl/dpreflect/dpreflect.html Dot Product Reflect]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|zwar nur ne Demo, aber wenn man schon immer mal mit EMBM das Wasser aus Morrowind nachproggen wollte... &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiele/Demos mit Quelltext ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphigl.de DelphiGL.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich besonders eindrucksvolle Newton Physik Demos. Meißtens sogar mit Quelltext.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.shadow3d.de.vu/ Shadow 3D]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich zwei Demos wie man Quake 3 Modelle lädt und eine glSlang Demo&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadersammlung]] im DGL Wiki&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier findet man freie Shadersourcen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.humus.name Humus]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diverse eindrucksvolle Demos zu verschiedenen Techniken, häufig mit Quelltext in C (teilweise OpenGL / DirectX)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== weitere Links ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf CompGeo.pdf]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Script &amp;quot;Einführung in die Computergeometrie&amp;quot; von Dr. Pester (TU-Chemnitz). Ideales Nachschlagewerk für die Mathematik die einem bei der Grafikprogrammierung so begegnet.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.robsite.de/ robsite.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Auf dieser riesigen Seite finden sich auch viele weitere Links über verschiedene Themen der 3D Programmierung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dlinks.com/links.cfm?categoryid=3&amp;amp;subcategoryid=21 3dlinks.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diese Seite hat es sich zur Hauptaufgabe gemacht Links auf Seiten mit dem Thema 3D zu sammeln.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.two-kings.de/links.html two-kings.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Sammlung diverser interessanter Links, vorallem auf Themen im gamedev-Forum verweisend.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delgine.com Delgine.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Heimat des freien 3D Modellers &amp;quot;DeleD&amp;quot;, welcher in Delphi programmiert ist. Ihr findet dort auch Modellpackete, Texturpackete, Plugins und Hilfe bei der Programmierung von Delphi und OpenGL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Spieleentwicklung =&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.spieleprogrammierung.net/ Spieleprogrammierung - OpenGL - GLSL - OpenAL - KI - Animation - Spielephysik]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Artikel, Tutorials und Programmbeispiele rund um das Thema Spieleprogrammierung. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://graphics-and-physics-framework.spieleprogrammierung.net/ OpenGL Graphics And Physics Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenGL basiertes Grafik und Physik Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://audio-framework.spieleprogrammierung.net/ OpenAL Audio Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenAL Audio Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Unterstützt werden 3D Sounds, EFX (EAX Alternative) Reverb Effekte sowie Audio Streaming (Music and Voices). Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://spieleentwicklung-im-web.spieleprogrammierung.net/ Spieleentwicklung im Web]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Links (E-Books, Präsentationen, wissenschaftliche Arbeiten und Tutorials) zu verschiedenen Themengebieten der Spieleentwicklung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://harablog.wordpress.com/2011/08/26/fast-pathfinding-via-symmetry-breaking/ Fast pathfinding via symmetry breaking]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Optimierungen für A* Pfadsuche durch Ausnutzung von Symmetrien.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Kopierschutz==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://inner-smile.com/nocrack.phtml Inner-Smile.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite mit Gedanken zum Thema &amp;quot;Wie schütze ich meine Programme vor Crackern&amp;quot;. 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&amp;amp;hl=de&amp;amp;gl=de&amp;amp;ct=clnk&amp;amp;cd=1 Version im Archiv].&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Künstliche Intelligenz ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080319034335/http://www.kbs.uni-hannover.de/Lehre/KI2/Presentationen/presentation9798/esprit/spieltheorie/spieltheorie.html Uni-Hannover - Spieltheorie]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Artikel über die Grundlagen von KI in Spielen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080927010337/http://www.robsite.de/tutorials.php?tut=ki Robsite KI-Tutorials]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Sammlung von Texten zum Thema KI in Spielen. Beispiele sind meist in C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://ai-depot.com/ AI-Depot.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite die sich ausschließlich mit KI in Spielen beschäftigt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ai-junkie.com/links.html AI-Junkie.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Linkseite mit vielen KI relevanten Links. Die Seite AI-Junie selbst behandelt auch viele Themen rund um KI.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiwisdom.com/ AIWisdom.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiguru.com/ AIGuru.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Newsseite zum Thema KI, Künstliches Leben, Hiernforschung, Robotik, Nanotechnologie - Halt alles was Spaß macht.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.generation5.org/ Generation5.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080702005527/http://www.gameai.com/ www.gameai.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|''Wurde Januar 2010 als down gemeldet. Weiss irgendwer etwas genaueres?'' Seite zum Thema KI in Spielen. Soll wohl einen gewissen Stellenwert in der AI-Szene haben.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo19.php Algorithmus der Woche - Informatikjahr 2006]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Vielleicht schon etwas älter aber doch eine gute Anleitung um eine einfache Schach-KI zu erstellen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Ressourcen =&lt;br /&gt;
In dieser Gruppe finden sich Links um die Ressourcen für Eure Projekte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;80%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://opengameart.org/ opengameart.org]&lt;br /&gt;
|Eine Seite die es jedem anbietet Spielressourcen wie Musik, Texturen, 3D-Modelle und anderes hochzuladen und diese unter einer beliebigen Lizenz zu veröffentlichen. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texturen / 2D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
'''Legende:'''&lt;br /&gt;
:'''Kostenpflichtige Seiten''' sind mit einem * zu '''kennzeichnen'''&lt;br /&gt;
:GPL: Kompatibel mit der GPL&lt;br /&gt;
:MPL: Kompatibel mit der MPL&lt;br /&gt;
:OSS: Verwendung in OpenSource Software nicht verboten&lt;br /&gt;
:CSS: Verwendung in ClosedSource Software nicht verboten&lt;br /&gt;
:Komm: Verwendung in kommerzieller Software nicht verboten&lt;br /&gt;
&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Genre&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
!width=&amp;quot;35%&amp;quot;|Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.davegh.com/ davegh.com]&lt;br /&gt;
|Fantasy&lt;br /&gt;
|[http://www.davegh.com/legal.php Eigene]&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|Die Lizenz vererbt sich in die Projekte hinein.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cgtextures.com/ cgtextures.com]&lt;br /&gt;
|Allgemein&lt;br /&gt;
|[http://www.cgtextures.com/content.php?action=license Eigene]&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|Die Lizenz will im wesentlichen verhindern das Texturen in anderen Textursammlungen auftauchen. So wie ich das verstehe ist es kein Problem die Texturen unter einer anderen Lizenz zu veröffentlichen als die eigentliche Software. Die Software kann also sehr wohl OpenSource sein. Im Zweifelsfalls einfach den Support anschreiben, der ist sehr nett.&lt;br /&gt;
|-&lt;br /&gt;
|[https://wiki.openstreetmap.org/wiki/Texture_Library OpenStreetMap Texture Library]&lt;br /&gt;
|Allgemein &lt;br /&gt;
|Public Domain&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Die Texturen dienen der Visualisierung der 3D-Gebäude im OpenStreetMap Projekt&lt;br /&gt;
|-&lt;br /&gt;
|url&lt;br /&gt;
|Futuristisch, Mittelalter, etc.&lt;br /&gt;
|CC-BY-SA, etc., gerne auch mit Direktlink auf die Lizenzseite, so vorhanden.&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|Alle Bilder sind von Käse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sonstige 2D-Grafiken ===&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.famfamfam.com/lab/icons/silk/ famfamfam silk]&lt;br /&gt;
|Iconset, welches inzwischen relativ weit verbreitet ist. 700 sauber gezeichnete, erkennbare PNG-Icons in TrueColor. Man kann praktisch jede (Arbeits-)Anwendung mit diesem Set vollständig mit Icons versorgen.&lt;br /&gt;
|[http://creativecommons.org/licenses/by/2.5/ CC-BY 2.5], [http://creativecommons.org/licenses/by/3.0/ CC-BY 3.0]&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Texturerstellung ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://3d.diehlsworld.de/textures/index.htm 3d.diehlsworld.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr kurze aber inhaltlich reiche Tutorials zu der Frage &amp;quot;Wie erstelle ich XXXXX-Texturen&amp;quot;. 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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gimps.de/gimp/textur-muster/ gimps.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Schritt für Schritt Anleitungen wie man mit Gimp verschiedene Texturen erstellt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://cbt.k090999.de/gimp.php#texturen k090999.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Gimptutorials zum Erstellen verschiedene Texturen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modelle / 3D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/viewtopic.php?t=5786 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Ein Thread im Forum von [http://blendpolis.de Blendpolis] in dem '''sehr''' viele Tutorials aufgelistet sind&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/article_cat.php?fldAuto=7 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Eigentliche Tutorial Seite von [http://blendpolis.de Blendpolis] die Auswahl ist hier aber nicht so groß&lt;br /&gt;
|-&lt;br /&gt;
|[http://wikivid.com/index.php/Blender Blender at wikivid.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Linksammlung von Blender Video Tutorials &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.blender.org/education-help/tutorials/getting-started/ blender3d.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Auch die Heimatseite von Blender bietet viele Tutorials unter anderm auch Video Tuorials&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.Blenderunderground.com Blenderunderground]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| '''sehr gute''' Video-Tutorials&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sounds ==&lt;br /&gt;
&lt;br /&gt;
===Musik===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.jamendo.com/ Jamendo.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele Künstler stellen hier ihre Alben unter einer Creative Commons Lizenz online. Man kann dort die Künstler auch kontaktieren und fragen ob man ihre Musik nutzen kann. Taugt außerdem als Radio! ;)&lt;br /&gt;
|-&lt;br /&gt;
|[https://incompetech.com/music/ Incompetech.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele sehr schön gemacht instrumentale Musik aus allen möglichen Genres. Sie ist frei verwendbar, wenn man den Macher der Musik (Kevin MacLeod) in seinem Programm erwähnt. Aber das hat er auch verdient. Folgende Programme nutzen beispielsweise (auch) Musik von incompetech.com:&lt;br /&gt;
* OpenParty&lt;br /&gt;
|-&lt;br /&gt;
|[https://freepd.com/ freepd.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Musik ebenfalls von Kevin MacLeod und anderen Künstlern, die sogar unter Public Domain steht. Man darf sie also kostenlos für alles verwenden und muss noch nicht mal den Urheber nennen (wäre natürlich trotzdem nett).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundeffekte===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.freesound.org/ freesound.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Diverse Sounds unter [https://creativecommons.org/ CreativeCommons] Lizenzen.&lt;br /&gt;
|-&lt;br /&gt;
|[https://sonniss.com/gameaudiogdc SONNISS Game Audio GDC]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Gigabyteweise hochqualitative Sounds, kostenlos und kommerziell nutzbar. Ist wohl als Werbung für noch mehr Sounds von SONISS gedacht.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundprogramme===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://audacity.sourceforge.net/?lang=de Sourceforgeseite von Audacity]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein einfaches, freies Programm um Sounddateien zu bearbeiten. Man kann es auch nutzen um Soundeffekte neu zu erstellen, indem man z.B. ein Geräusch mit dem Mikrofon aufnimmt und einige Effekt anwendet, um es passender und nicht mehr aufgenommen klingen zu lassen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://lmms.sourceforge.net/ LMMS]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|LMMS (Linux MultiMedia Studio) ist ein OpenSource+Freeware Composer-Programm ähnlich zum bekannteren aber auch teuren CuBase(r). Trotz des Namens auch für Windows erhältlich.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Link&amp;diff=27056</id>
		<title>Link</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Link&amp;diff=27056"/>
				<updated>2021-08-28T11:57:43Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Soundeffekte */ SONISS Game Audio GDC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
!!!!!!!! NUTZT DIESE TABELLE ALS VORLAGE FÜR WEITERE LINKTABELLEN !!!!!!!&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Linksammlung soll allgemeine Links zu unterschiedlichen Themen bieten, die mit der Multimediaentwicklung zu tun haben.&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Zusammenführung mit [[Tool]] sinnvoll!}}&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Aufteilung in Unterseiten sinnvoll (möglicherweise mit Kategorien)}}&lt;br /&gt;
&lt;br /&gt;
= Entwicklung mit OpenGL =&lt;br /&gt;
&lt;br /&gt;
== Hardwareinfos ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://openglcaps.delphigl.de/ glCapsViewer Datenbank]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Datenbank enthält alle mit [http://www.delphigl.com/forum/viewtopic.php?f=13&amp;amp;t=10010 glCapsViewer] gesammelten Informationen, also insbesondere OpenGL-Version und -Extensions verschiedener Grafikkarten.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090417044334/http://delphi3d.net/hardware/listreports.php OpenGL Hardware Registry - Hardwareübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090506094005/http://delphi3d.net/hardware/ OpenGL Hardware Registry - Extensionübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
||[[Tutorial|DGL Wiki - Tutorial]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|DelphiGL.com ist Betreiber dieses Wikis und stellt eine Vielzahl Tutorials mit Schwerpunkt OpenGL zur Verfügung. &lt;br /&gt;
Neben Tutorials für Einsteiger und OpenGL Anfänger gibt es auch fortgeschrittene Themen wie Shader oder Partikelsysteme. Sprache der Wahl ist hier Delphi.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.joachimrohde.com/cms/xoops/modules/articles/index.php?cat_id=1 joachimrohde.com]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr deutsche Übersetzungen der bekannten NeHe Tutorials. Sprache der Wahl ist hier C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cg.tuwien.ac.at/studentwork/VRSem96/OpenGL/ Technische Universität Wien]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Diese Seite bietet einen allgemeinen Überblick über die primären Funktionen von OpenGL und richtet sich vor allem an Einsteiger.&lt;br /&gt;
|-&lt;br /&gt;
|[http://nehe.gamedev.net/ Nehe] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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). )&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.sulaco.co.za/tut.htm sulaco.co.za] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| OpenGL Beispiele in Delphi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenGL Funktionen ==&lt;br /&gt;
&lt;br /&gt;
=== GL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GL|DGL Wiki - Kategorie GL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten OpenGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://developer.3dlabs.com/documents/glmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_4f03.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|OpenGL Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLU ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLU|DGL Wiki - Kategorie GLU]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLU Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/ OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Originalspezifikationen für die GLU Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_0e43.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|GLU Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLX ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLX|DGL Wiki - Kategorie GLX]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLX Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glx/ OpenGL.org - Original  Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Orgninalspezifikationen der GLX Befehle bei OpenGL.org.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WGL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:WGL|DGL Wiki - Kategorie WGL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Wiki-Kategorie die alle übersetzten WGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071218151417/http://developer.3dlabs.com/documents/wglmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung einiger WGL Befehlsspezifikationen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLUT ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://freeglut.sourceforge.net/docs/api.php The freeglut Projekt]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Englischsprachige Dokumentation zum OpenGL Utility Toolkit kurz GLUT.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SDL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:SDL|DGL Wiki - Kategorie SDL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ü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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.libsdl.org/cgi/docwiki.cgi/SDL_20API libsdl.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Das Dokumentationswiki von libSDL.org enthält die komplette Dokumenation zur SDL in englischer Sprache.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.freepascal-meets-sdl.net/ freepascal meets sdl]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Eine Webseite die speziell Informationen über die Programmierung von SDL unter Freepascal zur Verfügung stellt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[FAQ| DGL Wiki - FAQ]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ (Frequently Asked Questions = Häufig gestellte Fragen) zu DelphiGL.com und dem DGL Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dsource.de/faq/index.htm 3dsource.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ zu Fragen rund um OpenGL.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Effekte und Techniken mit OpenGL ==&lt;br /&gt;
&lt;br /&gt;
===Glow===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamasutra.com/view/feature/2107/realtime_glow.php Gamasutra]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt, wie man mit Hilfe von Shader(hier DirectX Shader) den Gloweffekt in Realtime umsetzt. Dabei wird erst die Technik dahinter erklärt, und dann wie man sie Schritt für Schritt umsetzt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071118043007/http://collective.valve-erc.com/index.php?go=tron1 valve-erc.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Schritt für Schritt Anleitung, wie man mit Hilfe von Cg in OpenGL den Glow Effekt realisieren kann &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===HDR===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601052809/http://www.gamedev.net/columns/hardcore/hdrrendering/ gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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ärungen gibt es kaum, dafür werden fertige Shader(für DirectX) geboten. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601202039/http://www.gamedev.net/reference/articles/article2208.asp gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt auch nur etwas kurz das HDR Verfahren, jedoch mit mehr mathematischen Hintergrund in Sachen Tonemapping. Beispielcode für Tonemapping in C++ liegt bei. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BSP Bäume===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081201115631/http://www.3dtechdev.com/tutorials/leafbsp/3dbsptrees.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081019041535/http://www.3dtechdev.com/tutorials/illegalgeometry/illegalgeometrytut.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Nicht ganz so gut geworden, wie sein erstes Tutorial, aber erklärt 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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/reference/articles/article981.asp Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=11 Part 1 - Allgemein]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|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ären oO). Aber ein guter Einstieg in dieses Thema. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=13 Part 2 - Kollision und PVS]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20060516103821/http://www.cs.uwec.edu/~stevende/cs455/programs/GameTutorials%20-%20Quake%203%20BSP%20Format.htm Quake3 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_q2bsp.shtml Quake2 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Himmel &amp;amp; Wolken===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=86024 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Guter Thread mit vielen Anregungen und Links. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=135654 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Hier wird die Diskussion zum obigen Link weitergeführt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/models/m_clouds.htm Plasma]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine nette Idee um Plasma in Echtzeit zu generieren, und zu verändern. Leider nichts zum Shading. &lt;br /&gt;
|-&lt;br /&gt;
|[http://nis-lab.is.s.u-tokyo.ac.jp/~nis/cdrom/sig00_cloud.pdf 3D Wolken]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20031011052035/http://www.geocities.com/ngdash/whitepapers/skydomecolor.html Skydome]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Wenn man mal schnell gute Farben für seinen Skydome braucht... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Terrain===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_geomipmaps.shtml FlipCode]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Artikel zu Geomipmaping. Zummindest hab ich es hier zum ersten mal gesehen. Und es funzt ganz gut. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.vterrain.org Virtual Terrain Project]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine Seite mit Links und Artikeln zu allem, was etwas mit Terrainrendering zu tun hat.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sonstiges===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[Materialsammlung]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Sammlung von gängigen Parametern für [[glMaterial]] hier im Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm Radiosity]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Erklärt sehr schön die Funktionsweise von Radiosity, liefert Beispielcodes und ist recht gut illustriert.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20050825110920/http://legion.gibbering.net/projectx/paper/shadow%20mapping/ Shadowmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt das Trapezoidal Shadow Mapping - Verfahren für gerichte Lichter.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_generatingnames.shtml Namensgenerator]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Per Zufallsgenrator Namen erzeugen, und nie wieder kreativ werden müssen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/tutorials/simplebump/simplebump.html Bumpmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Bumpmapping auf Lowend-Grakas. Damals war Bumpmapping noch was ganz tolles... &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/opengl/dpreflect/dpreflect.html Dot Product Reflect]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|zwar nur ne Demo, aber wenn man schon immer mal mit EMBM das Wasser aus Morrowind nachproggen wollte... &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiele/Demos mit Quelltext ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphigl.de DelphiGL.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich besonders eindrucksvolle Newton Physik Demos. Meißtens sogar mit Quelltext.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.shadow3d.de.vu/ Shadow 3D]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich zwei Demos wie man Quake 3 Modelle lädt und eine glSlang Demo&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadersammlung]] im DGL Wiki&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier findet man freie Shadersourcen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.humus.name Humus]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diverse eindrucksvolle Demos zu verschiedenen Techniken, häufig mit Quelltext in C (teilweise OpenGL / DirectX)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== weitere Links ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf CompGeo.pdf]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Script &amp;quot;Einführung in die Computergeometrie&amp;quot; von Dr. Pester (TU-Chemnitz). Ideales Nachschlagewerk für die Mathematik die einem bei der Grafikprogrammierung so begegnet.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.robsite.de/ robsite.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Auf dieser riesigen Seite finden sich auch viele weitere Links über verschiedene Themen der 3D Programmierung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dlinks.com/links.cfm?categoryid=3&amp;amp;subcategoryid=21 3dlinks.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diese Seite hat es sich zur Hauptaufgabe gemacht Links auf Seiten mit dem Thema 3D zu sammeln.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.two-kings.de/links.html two-kings.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Sammlung diverser interessanter Links, vorallem auf Themen im gamedev-Forum verweisend.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delgine.com Delgine.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Heimat des freien 3D Modellers &amp;quot;DeleD&amp;quot;, welcher in Delphi programmiert ist. Ihr findet dort auch Modellpackete, Texturpackete, Plugins und Hilfe bei der Programmierung von Delphi und OpenGL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Spieleentwicklung =&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.spieleprogrammierung.net/ Spieleprogrammierung - OpenGL - GLSL - OpenAL - KI - Animation - Spielephysik]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Artikel, Tutorials und Programmbeispiele rund um das Thema Spieleprogrammierung. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://graphics-and-physics-framework.spieleprogrammierung.net/ OpenGL Graphics And Physics Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenGL basiertes Grafik und Physik Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://audio-framework.spieleprogrammierung.net/ OpenAL Audio Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenAL Audio Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Unterstützt werden 3D Sounds, EFX (EAX Alternative) Reverb Effekte sowie Audio Streaming (Music and Voices). Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://spieleentwicklung-im-web.spieleprogrammierung.net/ Spieleentwicklung im Web]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Links (E-Books, Präsentationen, wissenschaftliche Arbeiten und Tutorials) zu verschiedenen Themengebieten der Spieleentwicklung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://harablog.wordpress.com/2011/08/26/fast-pathfinding-via-symmetry-breaking/ Fast pathfinding via symmetry breaking]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Optimierungen für A* Pfadsuche durch Ausnutzung von Symmetrien.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Kopierschutz==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://inner-smile.com/nocrack.phtml Inner-Smile.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite mit Gedanken zum Thema &amp;quot;Wie schütze ich meine Programme vor Crackern&amp;quot;. 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&amp;amp;hl=de&amp;amp;gl=de&amp;amp;ct=clnk&amp;amp;cd=1 Version im Archiv].&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Künstliche Intelligenz ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080319034335/http://www.kbs.uni-hannover.de/Lehre/KI2/Presentationen/presentation9798/esprit/spieltheorie/spieltheorie.html Uni-Hannover - Spieltheorie]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Artikel über die Grundlagen von KI in Spielen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080927010337/http://www.robsite.de/tutorials.php?tut=ki Robsite KI-Tutorials]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Sammlung von Texten zum Thema KI in Spielen. Beispiele sind meist in C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://ai-depot.com/ AI-Depot.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite die sich ausschließlich mit KI in Spielen beschäftigt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ai-junkie.com/links.html AI-Junkie.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Linkseite mit vielen KI relevanten Links. Die Seite AI-Junie selbst behandelt auch viele Themen rund um KI.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiwisdom.com/ AIWisdom.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiguru.com/ AIGuru.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Newsseite zum Thema KI, Künstliches Leben, Hiernforschung, Robotik, Nanotechnologie - Halt alles was Spaß macht.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.generation5.org/ Generation5.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080702005527/http://www.gameai.com/ www.gameai.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|''Wurde Januar 2010 als down gemeldet. Weiss irgendwer etwas genaueres?'' Seite zum Thema KI in Spielen. Soll wohl einen gewissen Stellenwert in der AI-Szene haben.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo19.php Algorithmus der Woche - Informatikjahr 2006]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Vielleicht schon etwas älter aber doch eine gute Anleitung um eine einfache Schach-KI zu erstellen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Ressourcen =&lt;br /&gt;
In dieser Gruppe finden sich Links um die Ressourcen für Eure Projekte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;80%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://opengameart.org/ opengameart.org]&lt;br /&gt;
|Eine Seite die es jedem anbietet Spielressourcen wie Musik, Texturen, 3D-Modelle und anderes hochzuladen und diese unter einer beliebigen Lizenz zu veröffentlichen. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texturen / 2D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
'''Legende:'''&lt;br /&gt;
:'''Kostenpflichtige Seiten''' sind mit einem * zu '''kennzeichnen'''&lt;br /&gt;
:GPL: Kompatibel mit der GPL&lt;br /&gt;
:MPL: Kompatibel mit der MPL&lt;br /&gt;
:OSS: Verwendung in OpenSource Software nicht verboten&lt;br /&gt;
:CSS: Verwendung in ClosedSource Software nicht verboten&lt;br /&gt;
:Komm: Verwendung in kommerzieller Software nicht verboten&lt;br /&gt;
&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Genre&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
!width=&amp;quot;35%&amp;quot;|Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.davegh.com/ davegh.com]&lt;br /&gt;
|Fantasy&lt;br /&gt;
|[http://www.davegh.com/legal.php Eigene]&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|Die Lizenz vererbt sich in die Projekte hinein.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cgtextures.com/ cgtextures.com]&lt;br /&gt;
|Allgemein&lt;br /&gt;
|[http://www.cgtextures.com/content.php?action=license Eigene]&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|Die Lizenz will im wesentlichen verhindern das Texturen in anderen Textursammlungen auftauchen. So wie ich das verstehe ist es kein Problem die Texturen unter einer anderen Lizenz zu veröffentlichen als die eigentliche Software. Die Software kann also sehr wohl OpenSource sein. Im Zweifelsfalls einfach den Support anschreiben, der ist sehr nett.&lt;br /&gt;
|-&lt;br /&gt;
|[https://wiki.openstreetmap.org/wiki/Texture_Library OpenStreetMap Texture Library]&lt;br /&gt;
|Allgemein &lt;br /&gt;
|Public Domain&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Die Texturen dienen der Visualisierung der 3D-Gebäude im OpenStreetMap Projekt&lt;br /&gt;
|-&lt;br /&gt;
|url&lt;br /&gt;
|Futuristisch, Mittelalter, etc.&lt;br /&gt;
|CC-BY-SA, etc., gerne auch mit Direktlink auf die Lizenzseite, so vorhanden.&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|Alle Bilder sind von Käse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sonstige 2D-Grafiken ===&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.famfamfam.com/lab/icons/silk/ famfamfam silk]&lt;br /&gt;
|Iconset, welches inzwischen relativ weit verbreitet ist. 700 sauber gezeichnete, erkennbare PNG-Icons in TrueColor. Man kann praktisch jede (Arbeits-)Anwendung mit diesem Set vollständig mit Icons versorgen.&lt;br /&gt;
|[http://creativecommons.org/licenses/by/2.5/ CC-BY 2.5], [http://creativecommons.org/licenses/by/3.0/ CC-BY 3.0]&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Texturerstellung ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://3d.diehlsworld.de/textures/index.htm 3d.diehlsworld.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr kurze aber inhaltlich reiche Tutorials zu der Frage &amp;quot;Wie erstelle ich XXXXX-Texturen&amp;quot;. 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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gimps.de/gimp/textur-muster/ gimps.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Schritt für Schritt Anleitungen wie man mit Gimp verschiedene Texturen erstellt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://cbt.k090999.de/gimp.php#texturen k090999.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Gimptutorials zum Erstellen verschiedene Texturen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modelle / 3D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/viewtopic.php?t=5786 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Ein Thread im Forum von [http://blendpolis.de Blendpolis] in dem '''sehr''' viele Tutorials aufgelistet sind&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/article_cat.php?fldAuto=7 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Eigentliche Tutorial Seite von [http://blendpolis.de Blendpolis] die Auswahl ist hier aber nicht so groß&lt;br /&gt;
|-&lt;br /&gt;
|[http://wikivid.com/index.php/Blender Blender at wikivid.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Linksammlung von Blender Video Tutorials &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.blender.org/education-help/tutorials/getting-started/ blender3d.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Auch die Heimatseite von Blender bietet viele Tutorials unter anderm auch Video Tuorials&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.Blenderunderground.com Blenderunderground]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| '''sehr gute''' Video-Tutorials&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sounds ==&lt;br /&gt;
&lt;br /&gt;
===Musik===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.jamendo.com/ Jamendo.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele Künstler stellen hier ihre Alben unter einer Creative Commons Lizenz online. Man kann dort die Künstler auch kontaktieren und fragen ob man ihre Musik nutzen kann. Taugt außerdem als Radio! ;)&lt;br /&gt;
|-&lt;br /&gt;
|[https://incompetech.com/music/ Incompetech.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele sehr schön gemacht instrumentale Musik aus allen möglichen Genres. Sie ist frei verwendbar, wenn man den Macher der Musik (Kevin MacLeod) in seinem Programm erwähnt. Aber das hat er auch verdient. Folgende Programme nutzen beispielsweise (auch) Musik von incompetech.com:&lt;br /&gt;
* OpenParty&lt;br /&gt;
|-&lt;br /&gt;
|[https://freepd.com/ freepd.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Musik ebenfalls von Kevin MacLeod und anderen Künstlern, die sogar unter Public Domain steht. Man darf sie also kostenlos für alles verwenden und muss noch nicht mal den Urheber nennen (wäre natürlich trotzdem nett).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundeffekte===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.freesound.org/ freesound.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Diverse Sounds unter [https://creativecommons.org/ CreativeCommons] Lizenzen.&lt;br /&gt;
|-&lt;br /&gt;
|[https://sonniss.com/gameaudiogdc SONISS Game Audio GDC]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Gigabyteweise hochqualitative Sounds, kostenlos und kommerziell nutzbar. Ist wohl als Werbung für noch mehr Sounds von SONISS gedacht.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundprogramme===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://audacity.sourceforge.net/?lang=de Sourceforgeseite von Audacity]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein einfaches, freies Programm um Sounddateien zu bearbeiten. Man kann es auch nutzen um Soundeffekte neu zu erstellen, indem man z.B. ein Geräusch mit dem Mikrofon aufnimmt und einige Effekt anwendet, um es passender und nicht mehr aufgenommen klingen zu lassen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://lmms.sourceforge.net/ LMMS]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|LMMS (Linux MultiMedia Studio) ist ein OpenSource+Freeware Composer-Programm ähnlich zum bekannteren aber auch teuren CuBase(r). Trotz des Namens auch für Windows erhältlich.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Triple-Buffering&amp;diff=27021</id>
		<title>Triple-Buffering</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Triple-Buffering&amp;diff=27021"/>
				<updated>2018-11-25T20:22:17Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Weiterleitung nach Framerate#Triple-Buffering erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Framerate#Triple-Buffering]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Triple_Buffering&amp;diff=27020</id>
		<title>Triple Buffering</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Triple_Buffering&amp;diff=27020"/>
				<updated>2018-11-25T20:21:56Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Weiterleitung nach Framerate#Triple-Buffering erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Framerate#Triple-Buffering]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=DGL_Treffen/2018/Organisation&amp;diff=26961</id>
		<title>DGL Treffen/2018/Organisation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=DGL_Treffen/2018/Organisation&amp;diff=26961"/>
				<updated>2018-07-28T10:38:45Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Wer kommt mit? */ glAwesome gestrichen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist diesmal irgendwo in Polen... ;-)&lt;br /&gt;
&lt;br /&gt;
Thema&lt;br /&gt;
    &amp;quot;Going East&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&amp;amp;t=11634 diesem Forenthread] statt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wo?==&lt;br /&gt;
'''Polen'''&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.e-domizil.de/ferienhaus/376211/ferienhaus-in-swiecianowo-malechowo-ostseekueste-westpommern-westpommern-polen/ Ferienwohnungen], &amp;lt;br&amp;gt;&lt;br /&gt;
;Addresse: Święcianowo 48A, 76-142 Święcianowo, Polen&lt;br /&gt;
;Koordinaten: [https://www.openstreetmap.org/?mlat=54.279437&amp;amp;mlon=16.583419&amp;amp;zoom=8 54.279437° N, 16.583419° O]&lt;br /&gt;
&lt;br /&gt;
==Wann?==&lt;br /&gt;
*Anreise: Sa 11.08.2018&lt;br /&gt;
*Abreise: So 19.08.2018&lt;br /&gt;
&lt;br /&gt;
==Was kostet das?==&lt;br /&gt;
Für die Übernachter ca. 20€ pro Nacht plus Nahrung.&lt;br /&gt;
Für Ausflüge, Museen etc ca. 10-20€&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Wer kommt mit?==&lt;br /&gt;
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Teilnehmer&lt;br /&gt;
!Fest&lt;br /&gt;
!Bezahlt&lt;br /&gt;
!Tage&lt;br /&gt;
(8=max)&lt;br /&gt;
!Anreise&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|Flash&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|8 &lt;br /&gt;
|PKW ab Berlin? &lt;br /&gt;
|(Frase + 1 Platz im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|i0n0s&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|PKW ab Gießen&lt;br /&gt;
|(1 Platz im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|Phobeus&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|PKW ab Hamburg (ARG Nord)&lt;br /&gt;
|(0 Platz im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|Pixelschubser&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
| via ARG Nord&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|End&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
| via ARG Nord&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Polarwolf&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|PKW am 12.8&lt;br /&gt;
|(1 Platz ab Hamburg)&lt;br /&gt;
 (Früh los Nachts zurück)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;glAwesome&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;s&amp;gt;8&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Mitfahrt bei Flash&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Zustieg bei Flash in Szczecin Gumience (Stettin Scheune)&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Frase&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Nürnberg -&amp;gt; Berlin, dann via Flash&lt;br /&gt;
|Zustieg bei Flash im Berliner Norden&lt;br /&gt;
|-&lt;br /&gt;
|''frei''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|''frei''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wie kommt man hin?==&lt;br /&gt;
Auto oder Bahn.&lt;br /&gt;
&lt;br /&gt;
== Sonstiges Organisatorisches ==&lt;br /&gt;
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 ;)&lt;br /&gt;
&lt;br /&gt;
==Was muss man mitbringen?==&lt;br /&gt;
===1x für Alle===&lt;br /&gt;
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)&lt;br /&gt;
* Klopapier&lt;br /&gt;
* 1 Router&lt;br /&gt;
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)&lt;br /&gt;
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss&lt;br /&gt;
* Cocktail Zeug!&lt;br /&gt;
&lt;br /&gt;
===Jeder===&lt;br /&gt;
* Das [[DGL Shirt]] - wer eins hat!&lt;br /&gt;
* Bargeld (Kaution (siehe Forum) + Reisekasse)&lt;br /&gt;
* Bettwäsche!&lt;br /&gt;
* Handtücher!&lt;br /&gt;
* Wechsel-Kleidung (Waschmaschine ist vorhanden)&lt;br /&gt;
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)&lt;br /&gt;
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)&lt;br /&gt;
* Reiseapotheke&lt;br /&gt;
* Hygieneartikel&lt;br /&gt;
* Badesachen!&lt;br /&gt;
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)&lt;br /&gt;
* Sonstiges (was zu lesen, Schreibzeug etc.) &lt;br /&gt;
''zu klären''&lt;br /&gt;
&lt;br /&gt;
==Was gibts zu erleben?==&lt;br /&gt;
*DGLer in echt ;)&lt;br /&gt;
*Grillen&lt;br /&gt;
*Eine Mini-LAN&lt;br /&gt;
*Videoabende&lt;br /&gt;
*Live Projektvorstellung&lt;br /&gt;
**Frase: Masterprojekt Bildkompression von DSLR-RAW-Files mit SPIHT (Wavelets)&lt;br /&gt;
**Frase: Verteilter Lock-Mechanismus ohne zentralen Koordinator, LamportLock (Verteilte Systeme)&lt;br /&gt;
*Umgebung erkunden&lt;br /&gt;
&lt;br /&gt;
==Was gibts zu essen?==&lt;br /&gt;
&lt;br /&gt;
In Polen kann man sehr gut und sehr günstig essen gehen, so günstig, dass selber abwaschen teurer ist (kalkulatorischer Stundenlohn des Geschirrspülers).&lt;br /&gt;
Sollte Irgendetwas ein auswärtiges Es­sen­fas­sen und anschließendes Abwaschen lassen verhindern folgen ein paar Malzeiten die sich schnell und einfach zubereiten lassen.&lt;br /&gt;
&lt;br /&gt;
Notmalzeiten&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Koch&lt;br /&gt;
!Speise&lt;br /&gt;
!Benötigte Zutaten&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|Pixelschubser&lt;br /&gt;
|Spaghetti mit Tomatensauce&lt;br /&gt;
|Spaghetti, Fleischwurst, Letscho, Paprika, Parmesan, Pfeffer, Salz, Tomaten, Zwiebeln, Zuchini, Zucker&lt;br /&gt;
|Die Zutaten gibt es vor Ort günstiger als in Deutschland&lt;br /&gt;
|-&lt;br /&gt;
|Polarwolf&lt;br /&gt;
 (am 12.8)&lt;br /&gt;
|Käse Toasti, Nicht näher bekanntes totes Tier in Stücken und Käsekuchen mit Kompott  &lt;br /&gt;
|Rezept, jop hab ich.&lt;br /&gt;
|Zutaten, bring ich mit.&lt;br /&gt;
|-&lt;br /&gt;
|Frase&lt;br /&gt;
|Vegetarisches Chilli&lt;br /&gt;
|Zutaten: TODO, aber u.A. geschredderter Blumen- oder Grünkohl, Mais, Paprikas, Chillis, Salz, Pfeffer, Knoblauch, Zwiebeln …&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Frase&lt;br /&gt;
|Shakshuka&lt;br /&gt;
|Zutaten: Tomaten, Eier, Kreuzkümmel (AKA Cumin), Knoblauch, Zwiebeln, Olivenöl, Salz, Pfeffer, optional Paprika. Dazu ein Weißbrot, am besten Pita.&lt;br /&gt;
|Das Brot lässt sich auch ganz einfach selber backen. Man braucht nur Mehl, Salz, Olivenöl und irgend eine Hefe.&lt;br /&gt;
|-&lt;br /&gt;
|WER&lt;br /&gt;
|WAS&lt;br /&gt;
|REZEPT/ZUTATEN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Nahrungsmittel==&lt;br /&gt;
Was muss für Sonntag usw besorgt werden (macht Flash):&lt;br /&gt;
- Cocktailzeug &amp;amp; Crushed Ice (Flash &amp;amp; i0n0s)&lt;br /&gt;
- ''Abendessen???''&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=DGL_Treffen/2018/Organisation&amp;diff=26868</id>
		<title>DGL Treffen/2018/Organisation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=DGL_Treffen/2018/Organisation&amp;diff=26868"/>
				<updated>2018-07-06T22:05:02Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Wer kommt mit? */ glAwesome in Liste aufgenommen, soweit bisher möglich&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist diesmal irgendwo in Polen... ;-)&lt;br /&gt;
&lt;br /&gt;
Thema&lt;br /&gt;
    &amp;quot;Going East&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&amp;amp;t=11634 diesem Forenthread] statt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wo?==&lt;br /&gt;
'''Polen'''&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.e-domizil.de/ferienhaus/376211/ferienhaus-in-swiecianowo-malechowo-ostseekueste-westpommern-westpommern-polen/ Ferienwohnungen], &amp;lt;br&amp;gt;&lt;br /&gt;
;Addresse: Święcianowo 48A, 76-142 Święcianowo, Polen&lt;br /&gt;
;Koordinaten: [https://www.openstreetmap.org/?mlat=54.279437&amp;amp;mlon=16.583419&amp;amp;zoom=8 54.279437° N, 16.583419° O]&lt;br /&gt;
&lt;br /&gt;
==Wann?==&lt;br /&gt;
*Anreise: Sa 11.08.2018&lt;br /&gt;
*Abreise: So 19.08.2018&lt;br /&gt;
&lt;br /&gt;
==Was kostet das?==&lt;br /&gt;
Für die Übernachter ca. 20€ pro Nacht plus Nahrung.&lt;br /&gt;
Für Ausflüge, Museen etc ca. 10-20€&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Wer kommt mit?==&lt;br /&gt;
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Teilnehmer&lt;br /&gt;
!Fest&lt;br /&gt;
!Bezahlt&lt;br /&gt;
!Tage&lt;br /&gt;
(8=max)&lt;br /&gt;
!Anreise&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|Flash&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|8 &lt;br /&gt;
|PKW ab Berlin? &lt;br /&gt;
|(2 Plätze im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|i0n0s&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|PKW ab Gießen&lt;br /&gt;
|(1 Platz im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|Phobeus&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|PKW ab Hamburg (ARG Nord)&lt;br /&gt;
|(0 Platz im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|Pixelschubser&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
| via ARG Nord&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|End&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
| via ARG Nord&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Polarwolf&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|PKW am 12.8&lt;br /&gt;
|(1 Platz ab Hamburg)&lt;br /&gt;
 (Früh los Nachts zurück)&lt;br /&gt;
|-&lt;br /&gt;
|glAwesome&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Mitfahrt bei Flash?&lt;br /&gt;
|Antwort von Flash steht noch aus.&lt;br /&gt;
|-&lt;br /&gt;
|''frei''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|''frei''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wie kommt man hin?==&lt;br /&gt;
Auto oder Bahn.&lt;br /&gt;
&lt;br /&gt;
== Sonstiges Organisatorisches ==&lt;br /&gt;
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 ;)&lt;br /&gt;
&lt;br /&gt;
==Was muss man mitbringen?==&lt;br /&gt;
===1x für Alle===&lt;br /&gt;
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)&lt;br /&gt;
* Klopapier&lt;br /&gt;
* 1 Router&lt;br /&gt;
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)&lt;br /&gt;
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss&lt;br /&gt;
* Cocktail Zeug!&lt;br /&gt;
&lt;br /&gt;
===Jeder===&lt;br /&gt;
* Das [[DGL Shirt]] - wer eins hat!&lt;br /&gt;
* Bargeld (Kaution (siehe Forum) + Reisekasse)&lt;br /&gt;
* Bettwäsche!&lt;br /&gt;
* Handtücher!&lt;br /&gt;
* Wechsel-Kleidung (Waschmaschine ist vorhanden)&lt;br /&gt;
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)&lt;br /&gt;
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)&lt;br /&gt;
* Reiseapotheke&lt;br /&gt;
* Hygieneartikel&lt;br /&gt;
* Badesachen!&lt;br /&gt;
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)&lt;br /&gt;
* Sonstiges (was zu lesen, Schreibzeug etc.) &lt;br /&gt;
''zu klären''&lt;br /&gt;
&lt;br /&gt;
==Was gibts zu erleben?==&lt;br /&gt;
*DGLer in echt ;)&lt;br /&gt;
*Grillen&lt;br /&gt;
*Eine Mini-LAN&lt;br /&gt;
*Videoabende&lt;br /&gt;
*Live Projektvorstellung&lt;br /&gt;
*Umgebung erkunden&lt;br /&gt;
&lt;br /&gt;
==Was gibts zu essen?==&lt;br /&gt;
&lt;br /&gt;
In Polen kann man sehr gut und sehr günstig essen gehen, so günstig, dass selber abwaschen teurer ist (kalkulatorischer Stundenlohn des Geschirrspülers).&lt;br /&gt;
Sollte Irgendetwas ein auswärtiges Es­sen­fas­sen und anschließendes Abwaschen lassen verhindern folgen ein paar Malzeiten die sich schnell und einfach zubereiten lassen.&lt;br /&gt;
&lt;br /&gt;
Notmalzeiten&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Koch&lt;br /&gt;
!Speise&lt;br /&gt;
!Benötigte Zutaten&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|Pixelschubser&lt;br /&gt;
|Spaghetti mit Tomatensauce&lt;br /&gt;
|Spaghetti, Fleischwurst, Letscho, Paprika, Parmesan, Pfeffer, Salz, Tomaten, Zwiebeln, Zuchini, Zucker&lt;br /&gt;
|Die Zutaten gibt es vor Ort günstiger als in Deutschland&lt;br /&gt;
|-&lt;br /&gt;
|Polarwolf&lt;br /&gt;
 (am 12.8)&lt;br /&gt;
|Käse Toasti, Nicht näher bekanntes totes Tier in Stücken und Käsekuchen mit Kompott  &lt;br /&gt;
|Rezept, jop hab ich.&lt;br /&gt;
|Zutaten, bring ich mit.&lt;br /&gt;
|-&lt;br /&gt;
|WER&lt;br /&gt;
|WAS&lt;br /&gt;
|REZEPT/ZUTATEN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Nahrungsmittel==&lt;br /&gt;
Was muss für Sonntag usw besorgt werden (macht Flash):&lt;br /&gt;
- Cocktailzeug &amp;amp; Crushed Ice (Flash &amp;amp; i0n0s)&lt;br /&gt;
- Knabberzeug (Knittel)&lt;br /&gt;
- ''Abendessen???''&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=DGL_Treffen/2018/Organisation&amp;diff=26867</id>
		<title>DGL Treffen/2018/Organisation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=DGL_Treffen/2018/Organisation&amp;diff=26867"/>
				<updated>2018-07-06T21:58:15Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Wo? */ Koordinaten verlinkt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es wurde einmal mehr vorgeschlagen sich im Sommer zu treffen. Ort ist diesmal irgendwo in Polen... ;-)&lt;br /&gt;
&lt;br /&gt;
Thema&lt;br /&gt;
    &amp;quot;Going East&amp;quot; ;-)&lt;br /&gt;
&lt;br /&gt;
Weitere Infos und detaillierte Besprechungen finden in [https://delphigl.com/forum/viewtopic.php?f=4&amp;amp;t=11634 diesem Forenthread] statt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wo?==&lt;br /&gt;
'''Polen'''&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.e-domizil.de/ferienhaus/376211/ferienhaus-in-swiecianowo-malechowo-ostseekueste-westpommern-westpommern-polen/ Ferienwohnungen], &amp;lt;br&amp;gt;&lt;br /&gt;
;Addresse: Święcianowo 48A, 76-142 Święcianowo, Polen&lt;br /&gt;
;Koordinaten: [https://www.openstreetmap.org/?mlat=54.279437&amp;amp;mlon=16.583419&amp;amp;zoom=8 54.279437° N, 16.583419° O]&lt;br /&gt;
&lt;br /&gt;
==Wann?==&lt;br /&gt;
*Anreise: Sa 11.08.2018&lt;br /&gt;
*Abreise: So 19.08.2018&lt;br /&gt;
&lt;br /&gt;
==Was kostet das?==&lt;br /&gt;
Für die Übernachter ca. 20€ pro Nacht plus Nahrung.&lt;br /&gt;
Für Ausflüge, Museen etc ca. 10-20€&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Wer kommt mit?==&lt;br /&gt;
Hier eine vorläufige Teilnehmerliste. Anzahl Betten und Schlafzimmer noch offen.&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Teilnehmer&lt;br /&gt;
!Fest&lt;br /&gt;
!Bezahlt&lt;br /&gt;
!Tage&lt;br /&gt;
(8=max)&lt;br /&gt;
!Anreise&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|Flash&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|8 &lt;br /&gt;
|PKW ab Berlin? &lt;br /&gt;
|(2 Plätze im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|i0n0s&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|PKW ab Gießen&lt;br /&gt;
|(1 Platz im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|Phobeus&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|PKW ab Hamburg (ARG Nord)&lt;br /&gt;
|(0 Platz im PKW frei.)&lt;br /&gt;
|-&lt;br /&gt;
|Pixelschubser&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
| via ARG Nord&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|End&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
| via ARG Nord&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Polarwolf&lt;br /&gt;
|x&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|PKW am 12.8&lt;br /&gt;
|(1 Platz ab Hamburg)&lt;br /&gt;
 (Früh los Nachts zurück)&lt;br /&gt;
|-&lt;br /&gt;
|''frei''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|''frei''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|''frei''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wie kommt man hin?==&lt;br /&gt;
Auto oder Bahn.&lt;br /&gt;
&lt;br /&gt;
== Sonstiges Organisatorisches ==&lt;br /&gt;
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 ;)&lt;br /&gt;
&lt;br /&gt;
==Was muss man mitbringen?==&lt;br /&gt;
===1x für Alle===&lt;br /&gt;
* Küchenequipement (Gewürze, Dosenöffner/Korkenzieher/Flaschenöffner, Kaffeefilter, Geschirrtücher, Wischtücher, Küchenrolle, Spülmittel)&lt;br /&gt;
* Klopapier&lt;br /&gt;
* 1 Router&lt;br /&gt;
* Netzwerkkabel (1x für alle? Ich weiß ja net... *g*)&lt;br /&gt;
* Was W-Lan Router mäßiges wäre suuuuper! Ist aber kein muss&lt;br /&gt;
* Cocktail Zeug!&lt;br /&gt;
&lt;br /&gt;
===Jeder===&lt;br /&gt;
* Das [[DGL Shirt]] - wer eins hat!&lt;br /&gt;
* Bargeld (Kaution (siehe Forum) + Reisekasse)&lt;br /&gt;
* Bettwäsche!&lt;br /&gt;
* Handtücher!&lt;br /&gt;
* Wechsel-Kleidung (Waschmaschine ist vorhanden)&lt;br /&gt;
* Nahrungsmittel (Es wird aber auch zentral, vor Grenzübertritt, eingekauft)&lt;br /&gt;
* Reisedokumente (Führerschein, Personalausweis, Versicherungs und Geldkarten)&lt;br /&gt;
* Reiseapotheke&lt;br /&gt;
* Hygieneartikel&lt;br /&gt;
* Badesachen!&lt;br /&gt;
* Elektronik (Laptop, Fotoapparat, Tanzmatten, MEHRFACHSTECKDOSEN!)&lt;br /&gt;
* Sonstiges (was zu lesen, Schreibzeug etc.) &lt;br /&gt;
''zu klären''&lt;br /&gt;
&lt;br /&gt;
==Was gibts zu erleben?==&lt;br /&gt;
*DGLer in echt ;)&lt;br /&gt;
*Grillen&lt;br /&gt;
*Eine Mini-LAN&lt;br /&gt;
*Videoabende&lt;br /&gt;
*Live Projektvorstellung&lt;br /&gt;
*Umgebung erkunden&lt;br /&gt;
&lt;br /&gt;
==Was gibts zu essen?==&lt;br /&gt;
&lt;br /&gt;
In Polen kann man sehr gut und sehr günstig essen gehen, so günstig, dass selber abwaschen teurer ist (kalkulatorischer Stundenlohn des Geschirrspülers).&lt;br /&gt;
Sollte Irgendetwas ein auswärtiges Es­sen­fas­sen und anschließendes Abwaschen lassen verhindern folgen ein paar Malzeiten die sich schnell und einfach zubereiten lassen.&lt;br /&gt;
&lt;br /&gt;
Notmalzeiten&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!Koch&lt;br /&gt;
!Speise&lt;br /&gt;
!Benötigte Zutaten&lt;br /&gt;
!Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|Pixelschubser&lt;br /&gt;
|Spaghetti mit Tomatensauce&lt;br /&gt;
|Spaghetti, Fleischwurst, Letscho, Paprika, Parmesan, Pfeffer, Salz, Tomaten, Zwiebeln, Zuchini, Zucker&lt;br /&gt;
|Die Zutaten gibt es vor Ort günstiger als in Deutschland&lt;br /&gt;
|-&lt;br /&gt;
|Polarwolf&lt;br /&gt;
 (am 12.8)&lt;br /&gt;
|Käse Toasti, Nicht näher bekanntes totes Tier in Stücken und Käsekuchen mit Kompott  &lt;br /&gt;
|Rezept, jop hab ich.&lt;br /&gt;
|Zutaten, bring ich mit.&lt;br /&gt;
|-&lt;br /&gt;
|WER&lt;br /&gt;
|WAS&lt;br /&gt;
|REZEPT/ZUTATEN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Nahrungsmittel==&lt;br /&gt;
Was muss für Sonntag usw besorgt werden (macht Flash):&lt;br /&gt;
- Cocktailzeug &amp;amp; Crushed Ice (Flash &amp;amp; i0n0s)&lt;br /&gt;
- Knabberzeug (Knittel)&lt;br /&gt;
- ''Abendessen???''&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Link&amp;diff=26353</id>
		<title>Link</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Link&amp;diff=26353"/>
				<updated>2017-05-12T19:19:51Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Soundeffekte */ http -&amp;gt; https&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
!!!!!!!! NUTZT DIESE TABELLE ALS VORLAGE FÜR WEITERE LINKTABELLEN !!!!!!!&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Linksammlung soll allgemeine Links zu unterschiedlichen Themen bieten, die mit der Multimediaentwicklung zu tun haben.&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Zusammenführung mit [[Tool]] sinnvoll!}}&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Aufteilung in Unterseiten sinnvoll (möglicherweise mit Kategorien)}}&lt;br /&gt;
&lt;br /&gt;
= Entwicklung mit OpenGL =&lt;br /&gt;
&lt;br /&gt;
== Hardwareinfos ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://openglcaps.delphigl.de/ glCapsViewer Datenbank]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Datenbank enthält alle mit [http://www.delphigl.com/forum/viewtopic.php?f=13&amp;amp;t=10010 glCapsViewer] gesammelten Informationen, also insbesondere OpenGL-Version und -Extensions verschiedener Grafikkarten.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090417044334/http://delphi3d.net/hardware/listreports.php OpenGL Hardware Registry - Hardwareübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090506094005/http://delphi3d.net/hardware/ OpenGL Hardware Registry - Extensionübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
||[[Tutorial|DGL Wiki - Tutorial]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|DelphiGL.com ist Betreiber dieses Wikis und stellt eine Vielzahl Tutorials mit Schwehrpunkt OpenGL zur Verfügung. &lt;br /&gt;
Neben Tutorials für Einsteiger und OpenGL Anfänger gibt es auch fortgeschrittene Themen wie Shader oder Partikelsysteme.Sprache der Wahl ist hier Delphi.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.joachimrohde.com/cms/xoops/modules/articles/index.php?cat_id=1 joachimrohde.com]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr deutsche Übersetzungen der bekannten NeHe Tutorials. Sprache der Wahl ist hier C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cg.tuwien.ac.at/studentwork/VRSem96/OpenGL/ Technische Universität Wien]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Diese Seite bietet einen allgemeinen Überblick über die primären Funktionen von OpenGL und richtet sich vor allem an Einsteiger.&lt;br /&gt;
|-&lt;br /&gt;
|[http://nehe.gamedev.net/ Nehe] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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). )&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.sulaco.co.za/tut.htm sulaco.co.za] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| OpenGL Beispiele in Delphi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenGL Funktionen ==&lt;br /&gt;
&lt;br /&gt;
=== GL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GL|DGL Wiki - Kategorie GL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten OpenGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://developer.3dlabs.com/documents/glmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_4f03.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|OpenGL Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLU ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLU|DGL Wiki - Kategorie GLU]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLU Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/ OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Originalspezifikationen für die GLU Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_0e43.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|GLU Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLX ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLX|DGL Wiki - Kategorie GLX]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLX Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glx/ OpenGL.org - Original  Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Orgninalspezifikationen der GLX Befehle bei OpenGL.org.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WGL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:WGL|DGL Wiki - Kategorie WGL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Wiki-Kategorie die alle übersetzten WGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071218151417/http://developer.3dlabs.com/documents/wglmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung einiger WGL Befehlsspezifikationen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLUT ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://freeglut.sourceforge.net/docs/api.php The freeglut Projekt]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Englischsprachige Dokumentation zum OpenGL Utility Toolkit kurz GLUT.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SDL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:SDL|DGL Wiki - Kategorie SDL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ü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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.libsdl.org/cgi/docwiki.cgi/SDL_20API libsdl.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Das Dokumentationswiki von libSDL.org enthält die komplette Dokumenation zur SDL in englischer Sprache.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.freepascal-meets-sdl.net/ freepascal meets sdl]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Eine Webseite die speziell Informationen über die Programmierung von SDL unter Freepascal zur Verfügung stellt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[FAQ| DGL Wiki - FAQ]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ (Frequently Asked Questions = Häufig gestellte Fragen) zu DelphiGL.com und dem DGL Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dsource.de/faq/index.htm 3dsource.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ zu Fragen rund um OpenGL.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Effekte und Techniken mit OpenGL ==&lt;br /&gt;
&lt;br /&gt;
===Glow===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamasutra.com/view/feature/2107/realtime_glow.php Gamasutra]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt, wie man mit Hilfe von Shader(hier DirectX Shader) den Gloweffekt in Realtime umsetzt. Dabei wird erst die Technik dahinter erklärt, und dann wie man sie Schritt für Schritt umsetzt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071118043007/http://collective.valve-erc.com/index.php?go=tron1 valve-erc.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Schritt für Schritt Anleitung, wie man mit Hilfe von Cg in OpenGL den Glow Effekt realisieren kann &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===HDR===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601052809/http://www.gamedev.net/columns/hardcore/hdrrendering/ gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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ärungen gibt es kaum, dafür werden fertige Shader(für DirectX) geboten. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601202039/http://www.gamedev.net/reference/articles/article2208.asp gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt auch nur etwas kurz das HDR Verfahren, jedoch mit mehr mathematischen Hintergrund in Sachen Tonemapping. Beispielcode für Tonemapping in C++ liegt bei. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BSP Bäume===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081201115631/http://www.3dtechdev.com/tutorials/leafbsp/3dbsptrees.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081019041535/http://www.3dtechdev.com/tutorials/illegalgeometry/illegalgeometrytut.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Nicht ganz so gut geworden, wie sein erstes Tutorial, aber erklärt 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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/reference/articles/article981.asp Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=11 Part 1 - Allgemein]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|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ären oO). Aber ein guter Einstieg in dieses Thema. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=13 Part 2 - Kollision und PVS]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20060516103821/http://www.cs.uwec.edu/~stevende/cs455/programs/GameTutorials%20-%20Quake%203%20BSP%20Format.htm Quake3 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_q2bsp.shtml Quake2 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Himmel &amp;amp; Wolken===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=86024 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Guter Thread mit vielen Anregungen und Links. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=135654 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Hier wird die Diskussion zum obigen Link weitergeführt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/models/m_clouds.htm Plasma]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine nette Idee um Plasma in Echtzeit zu generieren, und zu verändern. Leider nichts zum Shading. &lt;br /&gt;
|-&lt;br /&gt;
|[http://nis-lab.is.s.u-tokyo.ac.jp/~nis/cdrom/sig00_cloud.pdf 3D Wolken]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20031011052035/http://www.geocities.com/ngdash/whitepapers/skydomecolor.html Skydome]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Wenn man mal schnell gute Farben für seinen Skydome braucht... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Terrain===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_geomipmaps.shtml FlipCode]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Artikel zu Geomipmaping. Zummindest hab ich es hier zum ersten mal gesehen. Und es funzt ganz gut. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.vterrain.org Virtual Terrain Project]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine Seite mit Links und Artikeln zu allem, was etwas mit Terrainrendering zu tun hat.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sonstiges===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[Materialsammlung]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Sammlung von gängigen Parametern für [[glMaterial]] hier im Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm Radiosity]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Erklärt sehr schön die Funktionsweise von Radiosity, liefert Beispielcodes und ist recht gut illustriert.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20050825110920/http://legion.gibbering.net/projectx/paper/shadow%20mapping/ Shadowmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt das Trapezoidal Shadow Mapping - Verfahren für gerichte Lichter.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_generatingnames.shtml Namensgenerator]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Per Zufallsgenrator Namen erzeugen, und nie wieder kreativ werden müssen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/tutorials/simplebump/simplebump.html Bumpmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Bumpmapping auf Lowend-Grakas. Damals war Bumpmapping noch was ganz tolles... &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/opengl/dpreflect/dpreflect.html Dot Product Reflect]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|zwar nur ne Demo, aber wenn man schon immer mal mit EMBM das Wasser aus Morrowind nachproggen wollte... &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiele/Demos mit Quelltext ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphigl.de DelphiGL.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich besonders eindrucksvolle Newton Physik Demos. Meißtens sogar mit Quelltext.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.shadow3d.de.vu/ Shadow 3D]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich zwei Demos wie man Quake 3 Modelle lädt und eine glSlang Demo&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadersammlung]] im DGL Wiki&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier findet man freie Shadersourcen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.humus.name Humus]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diverse eindrucksvolle Demos zu verschiedenen Techniken, häufig mit Quelltext in C (teilweise OpenGL / DirectX)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== weitere Links ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf CompGeo.pdf]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Script &amp;quot;Einführung in die Computergeometrie&amp;quot; von Dr. Pester (TU-Chemnitz). Ideales Nachschlagewerk für die Mathematik die einem bei der Grafikprogrammierung so begegnet.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.robsite.de/ robsite.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Auf dieser riesigen Seite finden sich auch viele weitere Links über verschiedene Themen der 3D Programmierung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dlinks.com/links.cfm?categoryid=3&amp;amp;subcategoryid=21 3dlinks.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diese Seite hat es sich zur Hauptaufgabe gemacht Links auf Seiten mit dem Thema 3D zu sammeln.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.two-kings.de/links.html two-kings.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Sammlung diverser interessanter Links, vorallem auf Themen im gamedev-Forum verweisend.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delgine.com Delgine.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Heimat des freien 3D Modellers &amp;quot;DeleD&amp;quot;, welcher in Delphi programmiert ist. Ihr findet dort auch Modellpackete, Texturpackete, Plugins und Hilfe bei der Programmierung von Delphi und OpenGL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Spieleentwicklung =&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.spieleprogrammierung.net/ Spieleprogrammierung - OpenGL - GLSL - OpenAL - KI - Animation - Spielephysik]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Artikel, Tutorials und Programmbeispiele rund um das Thema Spieleprogrammierung. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://graphics-and-physics-framework.spieleprogrammierung.net/ OpenGL Graphics And Physics Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenGL basiertes Grafik und Physik Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://audio-framework.spieleprogrammierung.net/ OpenAL Audio Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenAL Audio Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Unterstützt werden 3D Sounds, EFX (EAX Alternative) Reverb Effekte sowie Audio Streaming (Music and Voices). Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://spieleentwicklung-im-web.spieleprogrammierung.net/ Spieleentwicklung im Web]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Links (E-Books, Präsentationen, wissenschaftliche Arbeiten und Tutorials) zu verschiedenen Themengebieten der Spieleentwicklung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://harablog.wordpress.com/2011/08/26/fast-pathfinding-via-symmetry-breaking/ Fast pathfinding via symmetry breaking]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Optimierungen für A* Pfadsuche durch Ausnutzung von Symmetrien.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Kopierschutz==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://inner-smile.com/nocrack.phtml Inner-Smile.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite mit Gedanken zum Thema &amp;quot;Wie schütze ich meine Programme vor Crackern&amp;quot;. 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&amp;amp;hl=de&amp;amp;gl=de&amp;amp;ct=clnk&amp;amp;cd=1 Version im Archiv].&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Künstliche Intelligenz ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080319034335/http://www.kbs.uni-hannover.de/Lehre/KI2/Presentationen/presentation9798/esprit/spieltheorie/spieltheorie.html Uni-Hannover - Spieltheorie]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Artikel über die Grundlagen von KI in Spielen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080927010337/http://www.robsite.de/tutorials.php?tut=ki Robsite KI-Tutorials]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Sammlung von Texten zum Thema KI in Spielen. Beispiele sind meist in C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://ai-depot.com/ AI-Depot.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite die sich ausschließlich mit KI in Spielen beschäftigt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ai-junkie.com/links.html AI-Junkie.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Linkseite mit vielen KI relevanten Links. Die Seite AI-Junie selbst behandelt auch viele Themen rund um KI.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiwisdom.com/ AIWisdom.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiguru.com/ AIGuru.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Newsseite zum Thema KI, Künstliches Leben, Hiernforschung, Robotik, Nanotechnologie - Halt alles was Spaß macht.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.generation5.org/ Generation5.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080702005527/http://www.gameai.com/ www.gameai.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|''Wurde Januar 2010 als down gemeldet. Weiss irgendwer etwas genaueres?'' Seite zum Thema KI in Spielen. Soll wohl einen gewissen Stellenwert in der AI-Szene haben.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo19.php Algorithmus der Woche - Informatikjahr 2006]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Vielleicht schon etwas älter aber doch eine gute Anleitung um eine einfache Schach-KI zu erstellen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Ressourcen =&lt;br /&gt;
In dieser Gruppe finden sich Links um die Ressourcen für Eure Projekte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;80%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://opengameart.org/ opengameart.org]&lt;br /&gt;
|Eine Seite die es jedem anbietet Spielressourcen wie Musik, Texturen, 3D-Modelle und anderes hochzuladen und diese unter einer beliebigen Lizenz zu veröffentlichen. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texturen / 2D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
'''Legende:'''&lt;br /&gt;
:'''Kostenpflichtige Seiten''' sind mit einem * zu '''kennzeichnen'''&lt;br /&gt;
:GPL: Kompatibel mit der GPL&lt;br /&gt;
:MPL: Kompatibel mit der MPL&lt;br /&gt;
:OSS: Verwendung in OpenSource Software nicht verboten&lt;br /&gt;
:CSS: Verwendung in ClosedSource Software nicht verboten&lt;br /&gt;
:Komm: Verwendung in kommerzieller Software nicht verboten&lt;br /&gt;
&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Genre&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
!width=&amp;quot;35%&amp;quot;|Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.davegh.com/ davegh.com]&lt;br /&gt;
|Fantasy&lt;br /&gt;
|[http://www.davegh.com/legal.php Eigene]&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|Die Lizenz vererbt sich in die Projekte hinein.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cgtextures.com/ cgtextures.com]&lt;br /&gt;
|Allgemein&lt;br /&gt;
|[http://www.cgtextures.com/content.php?action=license Eigene]&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|Die Lizenz will im wesentlichen verhindern das Texturen in anderen Textursammlungen auftauchen. So wie ich das verstehe ist es kein Problem die Texturen unter einer anderen Lizenz zu veröffentlichen als die eigentliche Software. Die Software kann also sehr wohl OpenSource sein. Im Zweifelsfalls einfach den Support anschreiben, der ist sehr nett.&lt;br /&gt;
|-&lt;br /&gt;
|[https://wiki.openstreetmap.org/wiki/Texture_Library OpenStreetMap Texture Library]&lt;br /&gt;
|Allgemein &lt;br /&gt;
|Public Domain&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Die Texturen dienen der Visualisierung der 3D-Gebäude im OpenStreetMap Projekt&lt;br /&gt;
|-&lt;br /&gt;
|url&lt;br /&gt;
|Futuristisch, Mittelalter, etc.&lt;br /&gt;
|CC-BY-SA, etc., gerne auch mit Direktlink auf die Lizenzseite, so vorhanden.&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|Alle Bilder sind von Käse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sonstige 2D-Grafiken ===&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.famfamfam.com/lab/icons/silk/ famfamfam silk]&lt;br /&gt;
|Iconset, welches inzwischen relativ weit verbreitet ist. 700 sauber gezeichnete, erkennbare PNG-Icons in TrueColor. Man kann praktisch jede (Arbeits-)Anwendung mit diesem Set vollständig mit Icons versorgen.&lt;br /&gt;
|[http://creativecommons.org/licenses/by/2.5/ CC-BY 2.5], [http://creativecommons.org/licenses/by/3.0/ CC-BY 3.0]&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Texturerstellung ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://3d.diehlsworld.de/textures/index.htm 3d.diehlsworld.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr kurze aber inhaltlich reiche Tutorials zu der Frage &amp;quot;Wie erstelle ich XXXXX-Texturen&amp;quot;. 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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gimps.de/gimp/textur-muster/ gimps.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Schritt für Schritt Anleitungen wie man mit Gimp verschiedene Texturen erstellt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://cbt.k090999.de/gimp.php#texturen k090999.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Gimptutorials zum Erstellen verschiedene Texturen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modelle / 3D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/viewtopic.php?t=5786 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Ein Thread im Forum von [http://blendpolis.de Blendpolis] in dem '''sehr''' viele Tutorials aufgelistet sind&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/article_cat.php?fldAuto=7 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Eigentliche Tutorial Seite von [http://blendpolis.de Blendpolis] die Auswahl ist hier aber nicht so groß&lt;br /&gt;
|-&lt;br /&gt;
|[http://wikivid.com/index.php/Blender Blender at wikivid.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Linksammlung von Blender Video Tutorials &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.blender.org/education-help/tutorials/getting-started/ blender3d.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Auch die Heimatseite von Blender bietet viele Tutorials unter anderm auch Video Tuorials&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.Blenderunderground.com Blenderunderground]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| '''sehr gute''' Video-Tutorials&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sounds ==&lt;br /&gt;
&lt;br /&gt;
===Musik===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.jamendo.com/ Jamendo.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele Künstler stellen hier ihre Alben unter einer Creative Commons Lizenz online. Man kann dort die Künstler auch kontaktieren und fragen ob man ihre Musik nutzen kann. Taugt außerdem als Radio! ;)&lt;br /&gt;
|-&lt;br /&gt;
|[https://incompetech.com/music/ Incompetech.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele sehr schön gemacht instrumentale Musik aus allen möglichen Genres. Sie ist frei verwendbar, wenn man den Macher der Musik (Kevin MacLeod) in seinem Programm erwähnt. Aber das hat er auch verdient. Folgende Programme nutzen beispielsweise (auch) Musik von incompetech.com:&lt;br /&gt;
* OpenParty&lt;br /&gt;
|-&lt;br /&gt;
|[https://freepd.com/ freepd.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Musik ebenfalls von Kevin MacLeod und anderen Künstlern, die sogar unter Public Domain steht. Man darf sie also kostenlos für alles verwenden und muss noch nicht mal den Urheber nennen (wäre natürlich trotzdem nett).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundeffekte===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[https://www.freesound.org/ freesound.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Diverse Sounds unter [https://creativecommons.org/ CreativeCommons] Lizenzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundprogramme===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://audacity.sourceforge.net/?lang=de Sourceforgeseite von Audacity]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein einfaches, freies Programm um Sounddateien zu bearbeiten. Man kann es auch nutzen um Soundeffekte neu zu erstellen, indem man z.B. ein Geräusch mit dem Mikrofon aufnimmt und einige Effekt anwendet, um es passender und nicht mehr aufgenommen klingen zu lassen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://lmms.sourceforge.net/ LMMS]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|LMMS (Linux MultiMedia Studio) ist ein OpenSource+Freeware Composer-Programm ähnlich zum bekannteren aber auch teuren CuBase(r). Trotz des Namens auch für Windows erhältlich.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Link&amp;diff=26352</id>
		<title>Link</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Link&amp;diff=26352"/>
				<updated>2017-05-07T18:31:08Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Musik */ Incompetech-Link angepasst, freepd.com hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
!!!!!!!! NUTZT DIESE TABELLE ALS VORLAGE FÜR WEITERE LINKTABELLEN !!!!!!!&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[Link]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Linksammlung soll allgemeine Links zu unterschiedlichen Themen bieten, die mit der Multimediaentwicklung zu tun haben.&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Zusammenführung mit [[Tool]] sinnvoll!}}&lt;br /&gt;
{{Hinweis|Vielleicht ist eine Aufteilung in Unterseiten sinnvoll (möglicherweise mit Kategorien)}}&lt;br /&gt;
&lt;br /&gt;
= Entwicklung mit OpenGL =&lt;br /&gt;
&lt;br /&gt;
== Hardwareinfos ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://openglcaps.delphigl.de/ glCapsViewer Datenbank]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Datenbank enthält alle mit [http://www.delphigl.com/forum/viewtopic.php?f=13&amp;amp;t=10010 glCapsViewer] gesammelten Informationen, also insbesondere OpenGL-Version und -Extensions verschiedener Grafikkarten.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090417044334/http://delphi3d.net/hardware/listreports.php OpenGL Hardware Registry - Hardwareübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090506094005/http://delphi3d.net/hardware/ OpenGL Hardware Registry - Extensionübersicht]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
||[[Tutorial|DGL Wiki - Tutorial]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|DelphiGL.com ist Betreiber dieses Wikis und stellt eine Vielzahl Tutorials mit Schwehrpunkt OpenGL zur Verfügung. &lt;br /&gt;
Neben Tutorials für Einsteiger und OpenGL Anfänger gibt es auch fortgeschrittene Themen wie Shader oder Partikelsysteme.Sprache der Wahl ist hier Delphi.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.joachimrohde.com/cms/xoops/modules/articles/index.php?cat_id=1 joachimrohde.com]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr deutsche Übersetzungen der bekannten NeHe Tutorials. Sprache der Wahl ist hier C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cg.tuwien.ac.at/studentwork/VRSem96/OpenGL/ Technische Universität Wien]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Diese Seite bietet einen allgemeinen Überblick über die primären Funktionen von OpenGL und richtet sich vor allem an Einsteiger.&lt;br /&gt;
|-&lt;br /&gt;
|[http://nehe.gamedev.net/ Nehe] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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). )&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.sulaco.co.za/tut.htm sulaco.co.za] &lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| OpenGL Beispiele in Delphi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenGL Funktionen ==&lt;br /&gt;
&lt;br /&gt;
=== GL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GL|DGL Wiki - Kategorie GL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten OpenGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://developer.3dlabs.com/documents/glmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Die Originalspezifikationen der OpenGL 1.0 und OpenGL 1.1 Befehle.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_4f03.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|OpenGL Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLU ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLU|DGL Wiki - Kategorie GLU]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLU Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/ OpenGL.org - Original Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Originalspezifikationen für die GLU Befehle. (Diese HTML-Dokumente sind nicht Copy&amp;amp;Paste freundlich, da sie vermutlich automatisch aus vorhandenen Dateien (Postscript) erzeugt wurden.)&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_0e43.asp MSDN von Microsoft]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|GLU Dokumentation in der MSDN. Die Erklärung der MSDN sind meist keine reinen Kopien der Originalspezifikationen, sondern enthalten hin und wieder auch zusätzliche Informationen, oder formulieren Texte auf verständlichere Art und Weise.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLX ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:GLX|DGL Wiki - Kategorie GLX]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Wiki-Kategorie die alle übersetzten GLX Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glx/ OpenGL.org - Original  Spezifkationen]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Orgninalspezifikationen der GLX Befehle bei OpenGL.org.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20040616082839/http://www.mevis.de/~uwe/opengl/opengl.html mevis.de mevis.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung von Englischsprachigen Spezifikationen für GL(bis Version 1.1), GLX und GLU Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WGL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:WGL|DGL Wiki - Kategorie WGL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Wiki-Kategorie die alle übersetzten WGL Befehle enthält.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071218151417/http://developer.3dlabs.com/documents/wglmanpage_index.htm 3dLabs]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Sammlung einiger WGL Befehlsspezifikationen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GLUT ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://freeglut.sourceforge.net/docs/api.php The freeglut Projekt]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Englischsprachige Dokumentation zum OpenGL Utility Toolkit kurz GLUT.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SDL ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[:Kategorie:SDL|DGL Wiki - Kategorie SDL]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ü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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.libsdl.org/cgi/docwiki.cgi/SDL_20API libsdl.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Das Dokumentationswiki von libSDL.org enthält die komplette Dokumenation zur SDL in englischer Sprache.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.freepascal-meets-sdl.net/ freepascal meets sdl]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Eine Webseite die speziell Informationen über die Programmierung von SDL unter Freepascal zur Verfügung stellt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[FAQ| DGL Wiki - FAQ]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ (Frequently Asked Questions = Häufig gestellte Fragen) zu DelphiGL.com und dem DGL Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dsource.de/faq/index.htm 3dsource.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein FAQ zu Fragen rund um OpenGL.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Effekte und Techniken mit OpenGL ==&lt;br /&gt;
&lt;br /&gt;
===Glow===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamasutra.com/view/feature/2107/realtime_glow.php Gamasutra]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt, wie man mit Hilfe von Shader(hier DirectX Shader) den Gloweffekt in Realtime umsetzt. Dabei wird erst die Technik dahinter erklärt, und dann wie man sie Schritt für Schritt umsetzt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20071118043007/http://collective.valve-erc.com/index.php?go=tron1 valve-erc.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Schritt für Schritt Anleitung, wie man mit Hilfe von Cg in OpenGL den Glow Effekt realisieren kann &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===HDR===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601052809/http://www.gamedev.net/columns/hardcore/hdrrendering/ gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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ärungen gibt es kaum, dafür werden fertige Shader(für DirectX) geboten. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20090601202039/http://www.gamedev.net/reference/articles/article2208.asp gamedev.net]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt auch nur etwas kurz das HDR Verfahren, jedoch mit mehr mathematischen Hintergrund in Sachen Tonemapping. Beispielcode für Tonemapping in C++ liegt bei. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BSP Bäume===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081201115631/http://www.3dtechdev.com/tutorials/leafbsp/3dbsptrees.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20081019041535/http://www.3dtechdev.com/tutorials/illegalgeometry/illegalgeometrytut.html 3dtechdev.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Nicht ganz so gut geworden, wie sein erstes Tutorial, aber erklärt 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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/reference/articles/article981.asp Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=11 Part 1 - Allgemein]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|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ären oO). Aber ein guter Einstieg in dieses Thema. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.zfx-online.de/Tutorials.php?ID=13 Part 2 - Kollision und PVS]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20060516103821/http://www.cs.uwec.edu/~stevende/cs455/programs/GameTutorials%20-%20Quake%203%20BSP%20Format.htm Quake3 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_q2bsp.shtml Quake2 *.bsp Format]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Himmel &amp;amp; Wolken===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=86024 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Guter Thread mit vielen Anregungen und Links. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gamedev.net/community/forums/topic.asp?topic_id=135654 Gamedev]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Hier wird die Diskussion zum obigen Link weitergeführt. &lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/models/m_clouds.htm Plasma]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine nette Idee um Plasma in Echtzeit zu generieren, und zu verändern. Leider nichts zum Shading. &lt;br /&gt;
|-&lt;br /&gt;
|[http://nis-lab.is.s.u-tokyo.ac.jp/~nis/cdrom/sig00_cloud.pdf 3D Wolken]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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. &lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20031011052035/http://www.geocities.com/ngdash/whitepapers/skydomecolor.html Skydome]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Wenn man mal schnell gute Farben für seinen Skydome braucht... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Terrain===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_geomipmaps.shtml FlipCode]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Artikel zu Geomipmaping. Zummindest hab ich es hier zum ersten mal gesehen. Und es funzt ganz gut. &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.vterrain.org Virtual Terrain Project]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Eine Seite mit Links und Artikeln zu allem, was etwas mit Terrainrendering zu tun hat.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Sonstiges===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[[Materialsammlung]]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Sammlung von gängigen Parametern für [[glMaterial]] hier im Wiki.&lt;br /&gt;
|-&lt;br /&gt;
|[http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm Radiosity]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Erklärt sehr schön die Funktionsweise von Radiosity, liefert Beispielcodes und ist recht gut illustriert.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20050825110920/http://legion.gibbering.net/projectx/paper/shadow%20mapping/ Shadowmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Beschreibt das Trapezoidal Shadow Mapping - Verfahren für gerichte Lichter.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.flipcode.com/articles/article_generatingnames.shtml Namensgenerator]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Per Zufallsgenrator Namen erzeugen, und nie wieder kreativ werden müssen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/tutorials/simplebump/simplebump.html Bumpmapping]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Bumpmapping auf Lowend-Grakas. Damals war Bumpmapping noch was ganz tolles... &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.paulsprojects.net/opengl/dpreflect/dpreflect.html Dot Product Reflect]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|zwar nur ne Demo, aber wenn man schon immer mal mit EMBM das Wasser aus Morrowind nachproggen wollte... &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiele/Demos mit Quelltext ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphigl.de DelphiGL.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich besonders eindrucksvolle Newton Physik Demos. Meißtens sogar mit Quelltext.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.shadow3d.de.vu/ Shadow 3D]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier finden sich zwei Demos wie man Quake 3 Modelle lädt und eine glSlang Demo&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadersammlung]] im DGL Wiki&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Hier findet man freie Shadersourcen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.humus.name Humus]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diverse eindrucksvolle Demos zu verschiedenen Techniken, häufig mit Quelltext in C (teilweise OpenGL / DirectX)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== weitere Links ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-user.tu-chemnitz.de/~pester/Lehre/CompGeo.pdf CompGeo.pdf]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Script &amp;quot;Einführung in die Computergeometrie&amp;quot; von Dr. Pester (TU-Chemnitz). Ideales Nachschlagewerk für die Mathematik die einem bei der Grafikprogrammierung so begegnet.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.robsite.de/ robsite.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Auf dieser riesigen Seite finden sich auch viele weitere Links über verschiedene Themen der 3D Programmierung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.3dlinks.com/links.cfm?categoryid=3&amp;amp;subcategoryid=21 3dlinks.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Diese Seite hat es sich zur Hauptaufgabe gemacht Links auf Seiten mit dem Thema 3D zu sammeln.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.two-kings.de/links.html two-kings.de]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Sammlung diverser interessanter Links, vorallem auf Themen im gamedev-Forum verweisend.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delgine.com Delgine.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Heimat des freien 3D Modellers &amp;quot;DeleD&amp;quot;, welcher in Delphi programmiert ist. Ihr findet dort auch Modellpackete, Texturpackete, Plugins und Hilfe bei der Programmierung von Delphi und OpenGL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Spieleentwicklung =&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.spieleprogrammierung.net/ Spieleprogrammierung - OpenGL - GLSL - OpenAL - KI - Animation - Spielephysik]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Artikel, Tutorials und Programmbeispiele rund um das Thema Spieleprogrammierung. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://graphics-and-physics-framework.spieleprogrammierung.net/ OpenGL Graphics And Physics Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenGL basiertes Grafik und Physik Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://audio-framework.spieleprogrammierung.net/ OpenAL Audio Framework]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr ein frei verfügbares OpenAL Audio Framework (LGPL-Lizenz) samt zugehöriger Probammbeispiele. Unterstützt werden 3D Sounds, EFX (EAX Alternative) Reverb Effekte sowie Audio Streaming (Music and Voices). Programmiersprache ist hier C/C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://spieleentwicklung-im-web.spieleprogrammierung.net/ Spieleentwicklung im Web]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet Ihr Links (E-Books, Präsentationen, wissenschaftliche Arbeiten und Tutorials) zu verschiedenen Themengebieten der Spieleentwicklung.&lt;br /&gt;
|-&lt;br /&gt;
|[http://harablog.wordpress.com/2011/08/26/fast-pathfinding-via-symmetry-breaking/ Fast pathfinding via symmetry breaking]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Optimierungen für A* Pfadsuche durch Ausnutzung von Symmetrien.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Kopierschutz==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://inner-smile.com/nocrack.phtml Inner-Smile.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite mit Gedanken zum Thema &amp;quot;Wie schütze ich meine Programme vor Crackern&amp;quot;. 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&amp;amp;hl=de&amp;amp;gl=de&amp;amp;ct=clnk&amp;amp;cd=1 Version im Archiv].&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Künstliche Intelligenz ==&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080319034335/http://www.kbs.uni-hannover.de/Lehre/KI2/Presentationen/presentation9798/esprit/spieltheorie/spieltheorie.html Uni-Hannover - Spieltheorie]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Artikel über die Grundlagen von KI in Spielen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080927010337/http://www.robsite.de/tutorials.php?tut=ki Robsite KI-Tutorials]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Sammlung von Texten zum Thema KI in Spielen. Beispiele sind meist in C++.&lt;br /&gt;
|-&lt;br /&gt;
|[http://ai-depot.com/ AI-Depot.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Seite die sich ausschließlich mit KI in Spielen beschäftigt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.ai-junkie.com/links.html AI-Junkie.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Linkseite mit vielen KI relevanten Links. Die Seite AI-Junie selbst behandelt auch viele Themen rund um KI.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiwisdom.com/ AIWisdom.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.aiguru.com/ AIGuru.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Newsseite zum Thema KI, Künstliches Leben, Hiernforschung, Robotik, Nanotechnologie - Halt alles was Spaß macht.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.generation5.org/ Generation5.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://web.archive.org/web/20080702005527/http://www.gameai.com/ www.gameai.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|''Wurde Januar 2010 als down gemeldet. Weiss irgendwer etwas genaueres?'' Seite zum Thema KI in Spielen. Soll wohl einen gewissen Stellenwert in der AI-Szene haben.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo19.php Algorithmus der Woche - Informatikjahr 2006]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Vielleicht schon etwas älter aber doch eine gute Anleitung um eine einfache Schach-KI zu erstellen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Ressourcen =&lt;br /&gt;
In dieser Gruppe finden sich Links um die Ressourcen für Eure Projekte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;80%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://opengameart.org/ opengameart.org]&lt;br /&gt;
|Eine Seite die es jedem anbietet Spielressourcen wie Musik, Texturen, 3D-Modelle und anderes hochzuladen und diese unter einer beliebigen Lizenz zu veröffentlichen. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texturen / 2D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
'''Legende:'''&lt;br /&gt;
:'''Kostenpflichtige Seiten''' sind mit einem * zu '''kennzeichnen'''&lt;br /&gt;
:GPL: Kompatibel mit der GPL&lt;br /&gt;
:MPL: Kompatibel mit der MPL&lt;br /&gt;
:OSS: Verwendung in OpenSource Software nicht verboten&lt;br /&gt;
:CSS: Verwendung in ClosedSource Software nicht verboten&lt;br /&gt;
:Komm: Verwendung in kommerzieller Software nicht verboten&lt;br /&gt;
&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Genre&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
!width=&amp;quot;35%&amp;quot;|Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.davegh.com/ davegh.com]&lt;br /&gt;
|Fantasy&lt;br /&gt;
|[http://www.davegh.com/legal.php Eigene]&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|Die Lizenz vererbt sich in die Projekte hinein.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.cgtextures.com/ cgtextures.com]&lt;br /&gt;
|Allgemein&lt;br /&gt;
|[http://www.cgtextures.com/content.php?action=license Eigene]&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|Die Lizenz will im wesentlichen verhindern das Texturen in anderen Textursammlungen auftauchen. So wie ich das verstehe ist es kein Problem die Texturen unter einer anderen Lizenz zu veröffentlichen als die eigentliche Software. Die Software kann also sehr wohl OpenSource sein. Im Zweifelsfalls einfach den Support anschreiben, der ist sehr nett.&lt;br /&gt;
|-&lt;br /&gt;
|[https://wiki.openstreetmap.org/wiki/Texture_Library OpenStreetMap Texture Library]&lt;br /&gt;
|Allgemein &lt;br /&gt;
|Public Domain&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Die Texturen dienen der Visualisierung der 3D-Gebäude im OpenStreetMap Projekt&lt;br /&gt;
|-&lt;br /&gt;
|url&lt;br /&gt;
|Futuristisch, Mittelalter, etc.&lt;br /&gt;
|CC-BY-SA, etc., gerne auch mit Direktlink auf die Lizenzseite, so vorhanden.&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|✔/✘/?&lt;br /&gt;
|Alle Bilder sind von Käse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sonstige 2D-Grafiken ===&lt;br /&gt;
&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Beschreibung&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;|Lizenz&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|GPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|MPL&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|OSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|CSS&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Komm.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.famfamfam.com/lab/icons/silk/ famfamfam silk]&lt;br /&gt;
|Iconset, welches inzwischen relativ weit verbreitet ist. 700 sauber gezeichnete, erkennbare PNG-Icons in TrueColor. Man kann praktisch jede (Arbeits-)Anwendung mit diesem Set vollständig mit Icons versorgen.&lt;br /&gt;
|[http://creativecommons.org/licenses/by/2.5/ CC-BY 2.5], [http://creativecommons.org/licenses/by/3.0/ CC-BY 3.0]&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Texturerstellung ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://3d.diehlsworld.de/textures/index.htm 3d.diehlsworld.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Auf dieser Seite findet ihr kurze aber inhaltlich reiche Tutorials zu der Frage &amp;quot;Wie erstelle ich XXXXX-Texturen&amp;quot;. 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.&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gimps.de/gimp/textur-muster/ gimps.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Schritt für Schritt Anleitungen wie man mit Gimp verschiedene Texturen erstellt.&lt;br /&gt;
|-&lt;br /&gt;
|[http://cbt.k090999.de/gimp.php#texturen k090999.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Gimptutorials zum Erstellen verschiedene Texturen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modelle / 3D-Grafiken ==&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/viewtopic.php?t=5786 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Ein Thread im Forum von [http://blendpolis.de Blendpolis] in dem '''sehr''' viele Tutorials aufgelistet sind&lt;br /&gt;
|-&lt;br /&gt;
|[http://blendpolis.de/f/article_cat.php?fldAuto=7 Blendpolis]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
| Eigentliche Tutorial Seite von [http://blendpolis.de Blendpolis] die Auswahl ist hier aber nicht so groß&lt;br /&gt;
|-&lt;br /&gt;
|[http://wikivid.com/index.php/Blender Blender at wikivid.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Linksammlung von Blender Video Tutorials &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.blender.org/education-help/tutorials/getting-started/ blender3d.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| Auch die Heimatseite von Blender bietet viele Tutorials unter anderm auch Video Tuorials&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.Blenderunderground.com Blenderunderground]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
| '''sehr gute''' Video-Tutorials&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sounds ==&lt;br /&gt;
&lt;br /&gt;
===Musik===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.jamendo.com/ Jamendo.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele Künstler stellen hier ihre Alben unter einer Creative Commons Lizenz online. Man kann dort die Künstler auch kontaktieren und fragen ob man ihre Musik nutzen kann. Taugt außerdem als Radio! ;)&lt;br /&gt;
|-&lt;br /&gt;
|[https://incompetech.com/music/ Incompetech.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Viele sehr schön gemacht instrumentale Musik aus allen möglichen Genres. Sie ist frei verwendbar, wenn man den Macher der Musik (Kevin MacLeod) in seinem Programm erwähnt. Aber das hat er auch verdient. Folgende Programme nutzen beispielsweise (auch) Musik von incompetech.com:&lt;br /&gt;
* OpenParty&lt;br /&gt;
|-&lt;br /&gt;
|[https://freepd.com/ freepd.com]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Musik ebenfalls von Kevin MacLeod und anderen Künstlern, die sogar unter Public Domain steht. Man darf sie also kostenlos für alles verwenden und muss noch nicht mal den Urheber nennen (wäre natürlich trotzdem nett).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundeffekte===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.freesound.org/ freesound.org]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|Diverse Sounds unter [http://www.creativecommons.org/ CreativeCommons] Lizenzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Soundprogramme===&lt;br /&gt;
{| width = &amp;quot;100%&amp;quot; {{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;|Sprache&lt;br /&gt;
!width=&amp;quot;70%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://audacity.sourceforge.net/?lang=de Sourceforgeseite von Audacity]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Ein einfaches, freies Programm um Sounddateien zu bearbeiten. Man kann es auch nutzen um Soundeffekte neu zu erstellen, indem man z.B. ein Geräusch mit dem Mikrofon aufnimmt und einige Effekt anwendet, um es passender und nicht mehr aufgenommen klingen zu lassen.&lt;br /&gt;
|-&lt;br /&gt;
|[http://lmms.sourceforge.net/ LMMS]&lt;br /&gt;
|{{Englisch}}&lt;br /&gt;
|LMMS (Linux MultiMedia Studio) ist ein OpenSource+Freeware Composer-Programm ähnlich zum bekannteren aber auch teuren CuBase(r). Trotz des Namens auch für Windows erhältlich.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertex_Array_Object&amp;diff=26318</id>
		<title>Vertex Array Object</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertex_Array_Object&amp;diff=26318"/>
				<updated>2016-04-08T09:39:49Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* IBO */ Aussage war nicht in jedem Fall korrekt, jetzt korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Willkommen zu meinem ersten Tutorial. Hier möchte ich euch erklären, was es mit Vertex Array Objects (VAOs) auf sich hat und wie man sie verwendet.&lt;br /&gt;
&lt;br /&gt;
==Warum VAOs?==&lt;br /&gt;
Nun werdet ihr euch vermutlich fragen, warum ihr schon wieder ein neues &amp;quot;Object&amp;quot; (neben [[VBO]], [[IBO]], [[FBO]] usw.) kennenlernen sollt. Da gibt es im Wesentlichen zwei Gründe:&lt;br /&gt;
Erstens habt ihr keine Wahl, wenn ihr mit einem [[Tutorial_OpenGL3_Zeichenkontext|OpenGL-Kontext ab Version 3.0]] im forward-compatible Modus VBOs benutzen möchtet. Ohne VAOs geht es da nicht.&lt;br /&gt;
Zweitens, und das ist vermutlich der Grund für diesen Zwang in neueren OpenGL-Versionen: Es erspart euch beim Rendern einige API-Funktionsaufrufe (konkret: [[glBindBuffer]], [[glEnableVertexAttribArray]] und [[glDisableVertexAttribArray]]), was bekanntlich der [[Performance]] zuträglich ist.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Was merkt sich ein VAO?==&lt;br /&gt;
In einem VAO wird gespeichert, welches Datenformat die Vertices haben, die ihr rendern möchtet. Also beispielsweise, dass ein Vertex aus 3 floats für die Position, 3 unsigned bytes für den Normalenvektor und 2 floats als Textur-Koordinaten besteht. Außerdem merkt sich das VAO, woher (aus welchem VBO) diese Daten genomen werden sollen. Wenn ihr einen Indexbuffer bindet, merkt sich das VAO auch dies.&lt;br /&gt;
&lt;br /&gt;
Kurz: Das VAO merkt sich alles, was ihr mit [[glVertexAttribPointer]] einstellen könnt plus den GL_ELEMENT_ARRAY_BUFFER, falls ihr einen gebunden habt.&lt;br /&gt;
&lt;br /&gt;
Es ist wichtig, den Unterschied zwischen VBO und VAO zu verstehen. Man könnte sagen, das VBO enthält die eigentlichen Vertexdaten und das VAO enthält die Informationen, in welchem VBO sich die benötigten Daten befinden und in welchem Format sie vorliegen. Das VAO ist also eine Lesevorschrift für die Daten im VBO.&lt;br /&gt;
&lt;br /&gt;
Ebenfalls wichtig: Obwohl im VAO gespeichert wird, aus welchem VBO die Daten beim Rendern entnommen werden sollen, führt das Binden des VAOs '''nicht''' dazu, dass das zugehörige VBO auch gebunden wird. Das ist auch nicht notwendig, denn welches VBO während des Zeichnens gebunden ist, hat keinen Einfluss auf den Rendervorgang. Entscheidend ist nur, welches VBO gebunden war, als das VAO initialisiert wurde (genauer: als ''glVertexAttribPointer'' aufgerufen wurde). Zum genauen Ablauf kommen wir im nächsten Abschnitt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Anwendung==&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
====VBO====&lt;br /&gt;
Es empfiehlt sich, zuerst das VBO zu initialisieren. Da möchte ich an dieser Stelle nicht zu sehr in die Details gehen, denn dazu gibt es bereits ein eigenes [[Tutorial_Vertexbufferobject|Tutorial]]. Daher nur ein kurzes Stück Beispielcode:&lt;br /&gt;
&amp;lt;cpp&amp;gt;GLuint VboID;              // für Delphi-Programmierer: var VboID : GLuint;&lt;br /&gt;
glGenBuffers(1, &amp;amp;VboID);   // in Pascal: glGenBuffers(1, @VboID);&lt;br /&gt;
glBindBuffer(GL_ARRAY_BUFFER, VboID);&lt;br /&gt;
glBufferData(GL_ARRAY_BUFFER, vbo_size, data, usage);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====VAO====&lt;br /&gt;
Wie fast alles in OpenGL, haben auch Vertex Array Objects einen Namen, der auch hier eigentlich nur ein Integer ist. Um einen solchen Namen zu erhalten, rufen wir die Funktion [[glGenVertexArrays]] auf:&lt;br /&gt;
&amp;lt;cpp&amp;gt;GLuint VaoID;&lt;br /&gt;
glGenVertexArrays(1, &amp;amp;VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Anschließend wird das VAO das erste Mal gebunden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glBindVertexArray(VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Spätestens hier sollte das VBO [[glBindBuffer|gebunden]] werden, falls noch nicht geschehen. Nun werden die Funktionen [[glEnableVertexAttribArray]] und [[glVertexAttribPointer]] aufgerufen, um das Vertexformat festzulegen. Zum Beispiel:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glEnableVertexAttribArray(0);&lt;br /&gt;
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex), 0);  // 3 floats für Position&lt;br /&gt;
glEnableVertexAttribArray(1);&lt;br /&gt;
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex), 12); // 3 floats für den Normalenvektor&lt;br /&gt;
glEnableVertexAttribArray(2);&lt;br /&gt;
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(TVertex), 24); // 2 floats als Textur-Koordinaten&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Der erste Parameter der beiden Funktionen ist der Index des jeweils betroffenen Vertexshader-Attributs (eine Variable, die im Vertexshader mit ''attribute'' oder ''in'' deklariert wurde). Dieser muss entweder vor dem Linken des Shaders mit [[glBindAttribLocation]] festgelegt werden, oder er wird nach dem Linken mit [[glGetAttribLocation]] abgefragt.&lt;br /&gt;
&lt;br /&gt;
====IBO====&lt;br /&gt;
An dieser Stelle besteht nun optional die Möglichkeit, auch einen Indexpuffer anzulegen. Dazu wieder ein kleines Stück Code:&lt;br /&gt;
&amp;lt;cpp&amp;gt;GLuint IboID;&lt;br /&gt;
glGenBuffers(1, &amp;amp;IboID);&lt;br /&gt;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IboID);&lt;br /&gt;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ibo_size, indexdata, usage);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Wichtig ist hierbei, dass ''glBindBuffer'' mit GL_ELEMENT_ARRAY_BUFFER nach ''glBindVertexArray'' aufgerufen werden muss. Sonst merkt sich das zuvor gebundene VAO den Indexbuffer (falls vorher ein anderes VAO gebunden war).&lt;br /&gt;
&lt;br /&gt;
===VAO vor Veränderung &amp;quot;schützen&amp;quot;===&lt;br /&gt;
Nun haben wir das VAO vollständig gefüllt. Jetzt können wir, falls wir das möchten, ein anderes VAO binden, oder wir entbinden das aktuelle einfach mit&lt;br /&gt;
&amp;lt;cpp&amp;gt;glBindVertexArray(0);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit sichern wir, dass sich nachfolgende Aufrufe von ''glVertexAttribPointer'' oder ''glBindBuffer'' nicht auf unser VAO auswirken.&lt;br /&gt;
&lt;br /&gt;
===Rendern===&lt;br /&gt;
Jetzt kommt der schöne Part. Da das komplette Vertexformat nämlich schon im VAO gespeichert ist, reicht ein einziger Aufruf von&lt;br /&gt;
&amp;lt;cpp&amp;gt;glBindVertexArray(VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
und schon stellt OpenGL alles so ein, wie wir es bei der Initialisierung festgelegt haben. Es ist jetzt nicht einmal mehr notwendig, ein VBO zu binden. Wir können einfach drauflos zeichnen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glDrawArrays(GL_TRIANGLES, 0, vertices_count);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Wer nicht nur ein VBO, sondern auch einen Indexbuffer angelegt hat, der schreibt statt der letzten Zeile nun:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glDrawElements(GL_TRIANGLES, indices_count, GL_UNSIGNED_SHORT, 0);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aufräumen===&lt;br /&gt;
Wenn wir das VAO nicht mehr benötigen, sollten wir es der Sauberkeit halber freigeben:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glDeleteVertexArrays(1, &amp;amp;VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
[[glDeleteVertexArrays]] ist sozusagen das genaue Gegenstück zu ''glGenVertexArrays''.&lt;br /&gt;
&lt;br /&gt;
==Schlusswort==&lt;br /&gt;
Das war schon alles! War doch gar nicht so schwer, oder? Falls dennoch Fragen offen geblieben sind, oder ihr etwas nicht versteht, dürft, nein sollt, ihr im [http://www.delphigl.com/forum/index.php Forum] gerne eure Fragen stellen. Ebenfalls freuen würde ich mich über Feedback zu diesem Tutorial oder zum Wiki allgemein. Dazu einfach einen Beitrag ins Unterforum [http://www.delphigl.com/forum/viewforum.php?f=8 &amp;quot;Feedback&amp;quot;] schreiben. In diesem Sinne: Vielen Dank fürs Lesen und Füße zurück! :)&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
[[Tutorial Vertexbufferobject]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[VBO ohne glInterleavedArrays]]&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
http://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt ARB_vertex_array_object] (Extension, um VAOs bereits in OpenGL 2.1 zu nutzen)&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertex_Array_Object&amp;diff=26317</id>
		<title>Vertex Array Object</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertex_Array_Object&amp;diff=26317"/>
				<updated>2016-04-08T08:59:14Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Klargestellt, dass sich ein VAO auch den ELEMENT_ARRAY_BUFFER merkt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Willkommen zu meinem ersten Tutorial. Hier möchte ich euch erklären, was es mit Vertex Array Objects (VAOs) auf sich hat und wie man sie verwendet.&lt;br /&gt;
&lt;br /&gt;
==Warum VAOs?==&lt;br /&gt;
Nun werdet ihr euch vermutlich fragen, warum ihr schon wieder ein neues &amp;quot;Object&amp;quot; (neben [[VBO]], [[IBO]], [[FBO]] usw.) kennenlernen sollt. Da gibt es im Wesentlichen zwei Gründe:&lt;br /&gt;
Erstens habt ihr keine Wahl, wenn ihr mit einem [[Tutorial_OpenGL3_Zeichenkontext|OpenGL-Kontext ab Version 3.0]] im forward-compatible Modus VBOs benutzen möchtet. Ohne VAOs geht es da nicht.&lt;br /&gt;
Zweitens, und das ist vermutlich der Grund für diesen Zwang in neueren OpenGL-Versionen: Es erspart euch beim Rendern einige API-Funktionsaufrufe (konkret: [[glBindBuffer]], [[glEnableVertexAttribArray]] und [[glDisableVertexAttribArray]]), was bekanntlich der [[Performance]] zuträglich ist.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Was merkt sich ein VAO?==&lt;br /&gt;
In einem VAO wird gespeichert, welches Datenformat die Vertices haben, die ihr rendern möchtet. Also beispielsweise, dass ein Vertex aus 3 floats für die Position, 3 unsigned bytes für den Normalenvektor und 2 floats als Textur-Koordinaten besteht. Außerdem merkt sich das VAO, woher (aus welchem VBO) diese Daten genomen werden sollen. Wenn ihr einen Indexbuffer bindet, merkt sich das VAO auch dies.&lt;br /&gt;
&lt;br /&gt;
Kurz: Das VAO merkt sich alles, was ihr mit [[glVertexAttribPointer]] einstellen könnt plus den GL_ELEMENT_ARRAY_BUFFER, falls ihr einen gebunden habt.&lt;br /&gt;
&lt;br /&gt;
Es ist wichtig, den Unterschied zwischen VBO und VAO zu verstehen. Man könnte sagen, das VBO enthält die eigentlichen Vertexdaten und das VAO enthält die Informationen, in welchem VBO sich die benötigten Daten befinden und in welchem Format sie vorliegen. Das VAO ist also eine Lesevorschrift für die Daten im VBO.&lt;br /&gt;
&lt;br /&gt;
Ebenfalls wichtig: Obwohl im VAO gespeichert wird, aus welchem VBO die Daten beim Rendern entnommen werden sollen, führt das Binden des VAOs '''nicht''' dazu, dass das zugehörige VBO auch gebunden wird. Das ist auch nicht notwendig, denn welches VBO während des Zeichnens gebunden ist, hat keinen Einfluss auf den Rendervorgang. Entscheidend ist nur, welches VBO gebunden war, als das VAO initialisiert wurde (genauer: als ''glVertexAttribPointer'' aufgerufen wurde). Zum genauen Ablauf kommen wir im nächsten Abschnitt.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Anwendung==&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
====VBO====&lt;br /&gt;
Es empfiehlt sich, zuerst das VBO zu initialisieren. Da möchte ich an dieser Stelle nicht zu sehr in die Details gehen, denn dazu gibt es bereits ein eigenes [[Tutorial_Vertexbufferobject|Tutorial]]. Daher nur ein kurzes Stück Beispielcode:&lt;br /&gt;
&amp;lt;cpp&amp;gt;GLuint VboID;              // für Delphi-Programmierer: var VboID : GLuint;&lt;br /&gt;
glGenBuffers(1, &amp;amp;VboID);   // in Pascal: glGenBuffers(1, @VboID);&lt;br /&gt;
glBindBuffer(GL_ARRAY_BUFFER, VboID);&lt;br /&gt;
glBufferData(GL_ARRAY_BUFFER, vbo_size, data, usage);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====VAO====&lt;br /&gt;
Wie fast alles in OpenGL, haben auch Vertex Array Objects einen Namen, der auch hier eigentlich nur ein Integer ist. Um einen solchen Namen zu erhalten, rufen wir die Funktion [[glGenVertexArrays]] auf:&lt;br /&gt;
&amp;lt;cpp&amp;gt;GLuint VaoID;&lt;br /&gt;
glGenVertexArrays(1, &amp;amp;VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Anschließend wird das VAO das erste Mal gebunden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glBindVertexArray(VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Spätestens hier sollte das VBO [[glBindBuffer|gebunden]] werden, falls noch nicht geschehen. Nun werden die Funktionen [[glEnableVertexAttribArray]] und [[glVertexAttribPointer]] aufgerufen, um das Vertexformat festzulegen. Zum Beispiel:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glEnableVertexAttribArray(0);&lt;br /&gt;
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex), 0);  // 3 floats für Position&lt;br /&gt;
glEnableVertexAttribArray(1);&lt;br /&gt;
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(TVertex), 12); // 3 floats für den Normalenvektor&lt;br /&gt;
glEnableVertexAttribArray(2);&lt;br /&gt;
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(TVertex), 24); // 2 floats als Textur-Koordinaten&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Der erste Parameter der beiden Funktionen ist der Index des jeweils betroffenen Vertexshader-Attributs (eine Variable, die im Vertexshader mit ''attribute'' oder ''in'' deklariert wurde). Dieser muss entweder vor dem Linken des Shaders mit [[glBindAttribLocation]] festgelegt werden, oder er wird nach dem Linken mit [[glGetAttribLocation]] abgefragt.&lt;br /&gt;
&lt;br /&gt;
====IBO====&lt;br /&gt;
An dieser Stelle besteht nun optional die Möglichkeit, auch einen Indexpuffer anzulegen. Dazu wieder ein kleines Stück Code:&lt;br /&gt;
&amp;lt;cpp&amp;gt;GLuint IboID;&lt;br /&gt;
glGenBuffers(1, &amp;amp;IboID);&lt;br /&gt;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IboID);&lt;br /&gt;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ibo_size, indexdata, usage);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Man kann den Indexbuffer auch ganz am Anfang (vor dem VBO) anlegen. Jedoch muss ''glBindBuffer'' nach ''glBindVertexArray'' aufgerufen werden, damit sich das VAO den Indexbuffer merkt.&lt;br /&gt;
&lt;br /&gt;
===VAO vor Veränderung &amp;quot;schützen&amp;quot;===&lt;br /&gt;
Nun haben wir das VAO vollständig gefüllt. Jetzt können wir, falls wir das möchten, ein anderes VAO binden, oder wir entbinden das aktuelle einfach mit&lt;br /&gt;
&amp;lt;cpp&amp;gt;glBindVertexArray(0);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit sichern wir, dass sich nachfolgende Aufrufe von ''glVertexAttribPointer'' oder ''glBindBuffer'' nicht auf unser VAO auswirken.&lt;br /&gt;
&lt;br /&gt;
===Rendern===&lt;br /&gt;
Jetzt kommt der schöne Part. Da das komplette Vertexformat nämlich schon im VAO gespeichert ist, reicht ein einziger Aufruf von&lt;br /&gt;
&amp;lt;cpp&amp;gt;glBindVertexArray(VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
und schon stellt OpenGL alles so ein, wie wir es bei der Initialisierung festgelegt haben. Es ist jetzt nicht einmal mehr notwendig, ein VBO zu binden. Wir können einfach drauflos zeichnen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glDrawArrays(GL_TRIANGLES, 0, vertices_count);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Wer nicht nur ein VBO, sondern auch einen Indexbuffer angelegt hat, der schreibt statt der letzten Zeile nun:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glDrawElements(GL_TRIANGLES, indices_count, GL_UNSIGNED_SHORT, 0);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aufräumen===&lt;br /&gt;
Wenn wir das VAO nicht mehr benötigen, sollten wir es der Sauberkeit halber freigeben:&lt;br /&gt;
&amp;lt;cpp&amp;gt;glDeleteVertexArrays(1, &amp;amp;VaoID);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
[[glDeleteVertexArrays]] ist sozusagen das genaue Gegenstück zu ''glGenVertexArrays''.&lt;br /&gt;
&lt;br /&gt;
==Schlusswort==&lt;br /&gt;
Das war schon alles! War doch gar nicht so schwer, oder? Falls dennoch Fragen offen geblieben sind, oder ihr etwas nicht versteht, dürft, nein sollt, ihr im [http://www.delphigl.com/forum/index.php Forum] gerne eure Fragen stellen. Ebenfalls freuen würde ich mich über Feedback zu diesem Tutorial oder zum Wiki allgemein. Dazu einfach einen Beitrag ins Unterforum [http://www.delphigl.com/forum/viewforum.php?f=8 &amp;quot;Feedback&amp;quot;] schreiben. In diesem Sinne: Vielen Dank fürs Lesen und Füße zurück! :)&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
[[Tutorial Vertexbufferobject]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[VBO ohne glInterleavedArrays]]&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
http://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt ARB_vertex_array_object] (Extension, um VAOs bereits in OpenGL 2.1 zu nutzen)&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Adaptive-Sync&amp;diff=26218</id>
		<title>Adaptive-Sync</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Adaptive-Sync&amp;diff=26218"/>
				<updated>2014-05-24T15:25:55Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Weiterleitung nach Framerate#variable Bildschirmfrequenz erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT: [[Framerate#variable_Bildschirmfrequenz]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Framerate&amp;diff=26217</id>
		<title>Framerate</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Framerate&amp;diff=26217"/>
				<updated>2014-05-24T15:17:58Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Adaptive Sync */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das englische Wort &amp;quot;frame&amp;quot; lässt sich in etwa mit &amp;quot;Rahmen&amp;quot; übersetzen. Das &amp;quot;Frame&amp;quot; in Framerate hat aber nichts mit einem Bilderrahmen o.ä. zu tun, sondern gemeint ist der zeitliche Rahmen, in dem ein bestimmter Rechenvorgang stattfindet. Wenn man von der Framerate von Spielen spricht, ist ein Frame also genau die Zeit, die der Computer benötigt, um ein neues Bild auf den Bildschirm zu rendern. Die Framerate (auch '''Bildwiederholrate''') gibt an, wie viele dieser Frames pro Sekunde (fps) vergehen.&lt;br /&gt;
&lt;br /&gt;
==24 fps Mythos==&lt;br /&gt;
Damit die grafische Ausgabe nicht wie eine Abfolge von Einzelbildern, sondern wie eine flüssige Bewegung aussieht, muss das angezeigte Bild schnell genug aktualisiert werden - mit anderen Worten: Die Framerate muss hoch genug sein. Experimente haben ergeben, dass das menschliche Auge eine Animation ab etwa 24 Bildern pro Sekunde nicht mehr als Bildfolge, sondern als Bewegung wahrnimmt. Daher stammt auch die weit verbreitete Meinung, ein Spieler könne keinen Unterschied zwischen 24 fps und beispielsweise 60 fps erkennen. Diese Annahme ist jedoch aus verschiedenen Gründen falsch! Siehe folgender Text.&lt;br /&gt;
&lt;br /&gt;
==Unschärfe bei Bewegung==&lt;br /&gt;
Überlegen wir einmal, was passiert, wenn ein weißer Ball schnell von links nach rechts durchs Bild fliegt. Das erste Bild, das der Computer rendert, zeigt den Ball auf der linken Seite des Bildes.&amp;lt;br&amp;gt;[[Datei:Ball_links.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Sofort nachdem das Bild fertig ist, misst das Programm natürlich die Zeit, die es für das eine Bild gebraucht hat (bei 24 fps knapp 42 ms). Anhand der gemessenen Zeit kann es bestimmen, welche Strecke der Ball in dieser Zeit zurückgelegt hat (s = v*t, [[Timebased Movement]]). Nun verschiebt es den Ball um die entsprechende Strecke und beginnt sofort, das nächste Bild zu rendern. Nun ist der Ball schon in der Mitte des Bildschirms angelangt.&amp;lt;br&amp;gt;[[Datei:Ball_mittig.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Wieder misst das Programm die vergangene Zeit, verschiebt den Ball um die entsprechende Strecke und rendert das nächste Bild. Nun ist der Ball rechts.&amp;lt;br&amp;gt;[[Datei:Ball_rechts.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Im nächsten Bild wird er gar nicht mehr zu sehen sein. Der Betrachter bekommt also hintereinander drei gestochen scharfe Bilder zu sehen, die er als Bewegung interpretieren soll. Das Problem dabei ist das &amp;quot;gestochen scharf&amp;quot;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Betrachten wir zum Vergleich einmal, was passieren würde, wenn sich diese Szene in der Natur abspielt. Der Ball wird von einer oder mehrerer Lichtquellen beleuchtet und reflektiert einen Teil des Lichts zum Auge des Betrachters. (Der Einfachheit halber nehmen wir an, dass der arme Betrachter nur ein Auge hat.) Währenddessen bewegt sich der Ball, und da der Betrachter seine Blickrichtung in dieser Zeit nicht ändert, wird das Licht während des Frames von 42 ms an verschiedene Stellen der Netzhaut reflektiert - allerdings wird kein Teil der Netzhaut 42 ms lang belichtet. Über den Sehnerv wird für jeden &amp;quot;Pixel&amp;quot; auf der Netzhaut der mittlere Helligkeitswert ans Gehirn übermittelt. Das Resultat ist ein grauer (nicht weißer) Streifen quer durchs Bild. Der Ball &amp;quot;verwischt&amp;quot; sozusagen, wie man es auch von Fotos mit zu langer Belichtungszeit kennt.&amp;lt;br&amp;gt;[[Datei:Ball_verwischt.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Genau diese Unschärfe erwartet auch der Spieler eines Computerspiels. Fehlt dieser Effekt, wirkt die Bewegung ruckelig. Eine Möglichkeit, diesen Effekt zu erzielen, wäre alle Bewegungen unscharf zu zeichnen. Das hat aber einen gewaltigen Nachteil, wie du im nächsten Abschnitt sehen wirst. Die andere Möglichkeit ist, einfach deutlich mehr Bilder pro Sekunde zu rendern, als nur 24.&lt;br /&gt;
&lt;br /&gt;
==Schärfe bei Bewegung==&lt;br /&gt;
Warum ist das Unscharf-Zeichnen ([[Motion-Blur]]) keine Lösung des Problems? Ganz einfach: Man stelle sich die selbe Szene noch einmal vor - mit dem einzigen Unterschied, dass der Betrachter dieses Mal nicht auf eine Stelle starrt, sondern den Ball mit seinem Blick verfolgt. Er sieht also erst auf die linke Seite des Bildschirms und bewegt seinen Blick mit konstanter Geschwindigkeit nacht rechts. Was würde er erwarten zu sehen? Denk' mal kurz darüber nach.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Der Spieler erwartet natürlich die selben Effekte, die er (unbewusst) zuvor in der Natur beobachtet hat. Nämlich dass der fliegende Ball gestochen scharf zu sehen ist, während der Hintergrund in Unschärfe verwischt. Denn dadurch, dass der Beobachter sein Auge immer nach dem Ball ausrichtet, trifft das von ihm reflektierte Licht immer die gleichen Stellen der Netzhaut.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Dem Ball auf dem Bildschirm zu folgen, nachdem dieser unscharf gezeichnet wurde, geht aber nicht - man sieht ja nur einen grauen Streifen, überall dort, wo der Ball im Laufe des Frames einmal war. Das Problem ist, dass der Programmierer nicht wissen kann, wie der oder die Betrachter des Bildschirms ihre Augen bewegen.&lt;br /&gt;
Würde man die gesamte Szene ohne Motion-Blur aber mit 24000 fps rendern (was natürlich kein PC oder Bildschirm schaffen würde), dann würde sich der Ball in jedem Frame um einen oder zwei Pixel verschieben und wäre zu jeder Zeit gestochen scharf, wenn man ihm folgt. Gleichzeitig würde er (für das Auge) verwischen, wenn man ihm nicht folgt.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die einzige Möglichkeit, dem Spieler ein wirklich realistisches visuelles Erlebnis zu bieten, besteht also darin, eine möglichst hohe Framerate zu erzielen. Eine geringe Framerate lässt sich im Allgemeinen nicht mit Motion-Blur kompensieren. Der Blur-Effekt kostet sogar noch Leistung und sorgt damit für eine geringere Framerate (das gilt natürlich nicht in Filmen). Dennoch hat Motion-Blur seine Existenzberechtigung: Erstens wenn die FPS-Grenze des Monitors bereits erreicht ist. Und zweitens um Dinge mit übertriebenem Motion-Blur schneller aussehen zu lassen, als sie sind.&lt;br /&gt;
&lt;br /&gt;
==Variation der Framerate==&lt;br /&gt;
Auch wenn die Framerate deutlich über 24 fps liegt, können selbst langsamere Bewegungen noch ruckelig wirken. Grund dafür ist dann, dass die Framelänge stark variiert. Als Beispiel muss mal wieder der Ball herhalten, der diesmal aber nicht in einer achtel Sekunde durchs gesamte Bild fliegt, sondern gemächlich mit konstanter Geschwindigkeit ins Bild rollt. Die Szene wird mit (normalerweise sehr flüssigen) 60 fps gerendert. Ein Frame hat also eine Dauer von 16,67 ms. Leider kommt es nun durch ungünstige Umstände dazu, dass ein einziges Frame plötzlich doppelt so lange dauert wie die anderen zuvor. Welche Auswirkungen hat also folgende Frame-Abfolge?&amp;lt;br&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! Frame &lt;br /&gt;
! Länge &lt;br /&gt;
|-&lt;br /&gt;
| Frame0 &lt;br /&gt;
| 16,67&lt;br /&gt;
|-&lt;br /&gt;
| Frame1 &lt;br /&gt;
| 16,67&lt;br /&gt;
|-&lt;br /&gt;
| Frame2 &lt;br /&gt;
| 33,33&lt;br /&gt;
|-&lt;br /&gt;
| Frame3 &lt;br /&gt;
| 16,67&lt;br /&gt;
|-&lt;br /&gt;
| Frame4 &lt;br /&gt;
| 16,67&lt;br /&gt;
|}&amp;lt;br&amp;gt;&lt;br /&gt;
Die Hälfte von 60 fps sind 30 fps. Man sollte meinen, dass dies immer noch als ruckelfrei empfunden wird. Das Problem ist auch nicht die Framelänge als solches, sondern die Länge von Frame2 im Vergleich zu den anderen Frames. Der Betrachter erwartet, dass der Ball mit konstanter Geschwindigkeit weiterrollt. Während das Bild gezeichnet wird, kann das Programm noch nicht wissen, wie viel Zeit vergangen sein wird, wenn das Bild fertig ist. Deshalb wird der Ball ja immer um die Strecke verschoben, die der letzten Framelänge entspricht. In Frame2 wird also der Ball verschoben, als wenn der Zeichenvorgang nur 16,67 ms dauern würde. In Wirklichkeit vergeht aber doppelt so viel Zeit, so dass es dem Spieler vorkommt, als hätte der Ball seine Geschwindigkeit plötzlich halbiert. Aber es kommt noch schlimmer: Da Frame3 wieder nur 16,67 ms dauert, der Ball aber so weit fortbewegt wird, als würde der Frame 33,33 ms dauern, vervierfacht sich die Geschwindigkeit nun! Erst in Frame4 bekommt der Ball durch eine erneute Tempohalbierung wieder seine wirkliche Geschwindigkeit. Diese Geschwindigkeitssprünge werden auch bei hoher Framerate noch als Ruckeln wahrgenommen. Man nennt diese Ruckler auch '''Mikroruckler'''.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Als st-Diagramm dargestellt sieht das so aus: &amp;lt;br&amp;gt;[[Datei:st-Diagramm_(Mikroruckler).png|300px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bildschirmfrequenz und V-Sync==&lt;br /&gt;
Kein Bildschirm kann beliebig viele Bilder pro Sekunde darstellen. Eine übliche Refreshrate bei Flachbildschirmen ist 60 Hz (das heißt, das Bild wird 60 mal pro Sekunde erneuert). Es gibt aber auch welche mit 120 Hz (für [[Tutorial_StereoSehen|Stereoskopie]]) oder 200 Hz. Da 60 Hz auf Röhrenbildschirmen stark flimmern, können diese alten Kisten oft auch 75, 85, oder 100 Hz. Egal, wie oft ein Monitor pro Sekunde sein Bild erneuern kann - es gibt (von Ausnahmefällen wie [[Benchmark]]ing abgesehen) keinen Grund, die Grafikkarte mehr Bilder berechnen zu lassen, zumal dies zu unerwünschten Artefakten führt ([[V-Sync#Tearing|Tearing]]).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deshalb gibt es eine Technik, die sich [[V-Sync]] nennt. Dabei wartet die Grafikkarte, bis das neue Bild an den Bildschirm übertragen wurde, bis sie das nächste beginnt. Es ist unbedingt zu empfehlen V-Sync einzuschalten, wenn der Computer sowieso mehr Bilder pro Sekunde rendern kann als der Bildschirm darzustellen vermag. Doch was passiert, wenn V-Sync eingeschaltet ist und der Rechner nicht die native Framerate des Bildschirms erreicht?&amp;lt;br&amp;gt;&lt;br /&gt;
Nehmen wir an, der Bildschirm wird 60 mal pro Sekunde aktualisiert, die GPU schafft aber nur 50 Bilder pro Sekunde. Sobald die Grafikkarte das Synchronisationssignal empfängt, kopiert sie den Backbufferinhalt in den Frontbuffer und rendert das nächste Bild in den Backbuffer. 16,67 ms später kommt das nächste Synchronisationssignal, aber die Grafikkarte ist noch nicht fertig. Also wird nichts in den Frontbuffer kopiert. Stattdessen zeigt der Bildschirm zweimal hintereinander das gleiche Bild an. Erst weitere 3,33 ms später stellt der Grafikchip das Bild fertig und muss nun 13,34 ms (!) auf das nächste Sync-Signal warten. Bis dieses kommt, sind insgesamt 33,33 ms vergangen - mit anderen Worten wir haben eine Framerate von nur 30 fps, obwohl der Computer 50 fps schaffen würde!&amp;lt;br&amp;gt;&lt;br /&gt;
===Triple-Buffering===&lt;br /&gt;
Das Problem dabei ist, dass die Grafikkarte während des Wartens auf das Sync-Signal nichts tut. Doch dafür gibt es eine Lösung: Da wir in den Backbuffer noch nicht schreiben dürfen, schreiben wir halt in einen anderen Backbuffer! Während wir in den zweiten Backbuffer schreiben, wird der erste in den Frontbuffer kopiert, sobald das Sync-Signal wieder kommt. Im nächsten Frame schreiben wir natürlich wieder in den ersten Backbuffer, während der zweite aufs Kopieren wartet. Somit erreichen wir die selbe [[Performance]] wie ohne V-Sync, sind aber gleichzeitig das Tearing losgeworden.&amp;lt;br&amp;gt;&lt;br /&gt;
Ein Nachteil des Verfahrens ist, dass wir etwas mehr Videospeicher benötigen. Der Mehrverbrauch hält sich aber in Grenzen, denn es wird lediglich ein weiterer Farbpuffer benötigt - den [[Z-Buffer|Z-]] und [[Stencilbuffer]] dagegen brauchen wir nicht noch einmal. Zudem handelt man sich natürlich weitere Mikroruckler ein - aber mal ehrlich: 50 fps mit Mikrorucklern sind immer noch besser als 30 fps ohne.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
OpemGL bietet selbst keine Möglichkeit, Triple-Buffering an- oder auszuschalten. Dies ist Sache des Treibers. Man kann Triple-Buffering zwar mittels eines [[FBO]]s emulieren, jedoch hat man dann in Wirklichkeit Quadruple-Buffering, wenn der Treiber sich bereits darum kümmert. (Quelle: [http://www.opengl.org/wiki/Common_Mistakes#Triple_Buffering])&lt;br /&gt;
===variable Bildschirmfrequenz===&lt;br /&gt;
Aktuell (2014) gibt es in der Industrie Bestrebungen, Displays mit variabler Refreshrate zu entwickeln. Bezeichnungen dafür sind '''Adaptive Sync''' (DisplayPort-Standard), '''G-Sync''' (Nvidia) oder '''FreeSync''' (AMD). Dabei soll das Problem der Synchronisation zwischen Bildschirm und Grafikkarte von der anderen Seite als bisher angegangen werden: Nicht mehr der Bildschirm gibt vor, in welchem Takt die Grafikkarte Bilddaten liefern soll, sondern die Grafikkarte signalisiert dem Bildschirm, wann sie fertig mit den Berechnungen ist. Daraufhin überträgt sie das neue Bild an den Schirm, welcher es dann sofort darstellt.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Vorteil: Die Latenz (Zeit zwischen Benutzereingabe und Bildausgabe) verkürzt sich, Triple-Buffering wird unnötig und die durch letzteres verursachten Mikroruckler verschwinden. Tearing sieht man ebenfalls nicht, da ja immer noch synchronisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
[[Frameratenbegrenzung]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Framecounter]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Framerate&amp;diff=26216</id>
		<title>Framerate</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Framerate&amp;diff=26216"/>
				<updated>2014-05-24T12:48:06Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Triple-Buffering */ (Nicht-)Implementierung in OpenGL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das englische Wort &amp;quot;frame&amp;quot; lässt sich in etwa mit &amp;quot;Rahmen&amp;quot; übersetzen. Das &amp;quot;Frame&amp;quot; in Framerate hat aber nichts mit einem Bilderrahmen o.ä. zu tun, sondern gemeint ist der zeitliche Rahmen, in dem ein bestimmter Rechenvorgang stattfindet. Wenn man von der Framerate von Spielen spricht, ist ein Frame also genau die Zeit, die der Computer benötigt, um ein neues Bild auf den Bildschirm zu rendern. Die Framerate (auch '''Bildwiederholrate''') gibt an, wie viele dieser Frames pro Sekunde (fps) vergehen.&lt;br /&gt;
&lt;br /&gt;
==24 fps Mythos==&lt;br /&gt;
Damit die grafische Ausgabe nicht wie eine Abfolge von Einzelbildern, sondern wie eine flüssige Bewegung aussieht, muss das angezeigte Bild schnell genug aktualisiert werden - mit anderen Worten: Die Framerate muss hoch genug sein. Experimente haben ergeben, dass das menschliche Auge eine Animation ab etwa 24 Bildern pro Sekunde nicht mehr als Bildfolge, sondern als Bewegung wahrnimmt. Daher stammt auch die weit verbreitete Meinung, ein Spieler könne keinen Unterschied zwischen 24 fps und beispielsweise 60 fps erkennen. Diese Annahme ist jedoch aus verschiedenen Gründen falsch! Siehe folgender Text.&lt;br /&gt;
&lt;br /&gt;
==Unschärfe bei Bewegung==&lt;br /&gt;
Überlegen wir einmal, was passiert, wenn ein weißer Ball schnell von links nach rechts durchs Bild fliegt. Das erste Bild, das der Computer rendert, zeigt den Ball auf der linken Seite des Bildes.&amp;lt;br&amp;gt;[[Datei:Ball_links.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Sofort nachdem das Bild fertig ist, misst das Programm natürlich die Zeit, die es für das eine Bild gebraucht hat (bei 24 fps knapp 42 ms). Anhand der gemessenen Zeit kann es bestimmen, welche Strecke der Ball in dieser Zeit zurückgelegt hat (s = v*t, [[Timebased Movement]]). Nun verschiebt es den Ball um die entsprechende Strecke und beginnt sofort, das nächste Bild zu rendern. Nun ist der Ball schon in der Mitte des Bildschirms angelangt.&amp;lt;br&amp;gt;[[Datei:Ball_mittig.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Wieder misst das Programm die vergangene Zeit, verschiebt den Ball um die entsprechende Strecke und rendert das nächste Bild. Nun ist der Ball rechts.&amp;lt;br&amp;gt;[[Datei:Ball_rechts.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Im nächsten Bild wird er gar nicht mehr zu sehen sein. Der Betrachter bekommt also hintereinander drei gestochen scharfe Bilder zu sehen, die er als Bewegung interpretieren soll. Das Problem dabei ist das &amp;quot;gestochen scharf&amp;quot;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Betrachten wir zum Vergleich einmal, was passieren würde, wenn sich diese Szene in der Natur abspielt. Der Ball wird von einer oder mehrerer Lichtquellen beleuchtet und reflektiert einen Teil des Lichts zum Auge des Betrachters. (Der Einfachheit halber nehmen wir an, dass der arme Betrachter nur ein Auge hat.) Währenddessen bewegt sich der Ball, und da der Betrachter seine Blickrichtung in dieser Zeit nicht ändert, wird das Licht während des Frames von 42 ms an verschiedene Stellen der Netzhaut reflektiert - allerdings wird kein Teil der Netzhaut 42 ms lang belichtet. Über den Sehnerv wird für jeden &amp;quot;Pixel&amp;quot; auf der Netzhaut der mittlere Helligkeitswert ans Gehirn übermittelt. Das Resultat ist ein grauer (nicht weißer) Streifen quer durchs Bild. Der Ball &amp;quot;verwischt&amp;quot; sozusagen, wie man es auch von Fotos mit zu langer Belichtungszeit kennt.&amp;lt;br&amp;gt;[[Datei:Ball_verwischt.png|400px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Genau diese Unschärfe erwartet auch der Spieler eines Computerspiels. Fehlt dieser Effekt, wirkt die Bewegung ruckelig. Eine Möglichkeit, diesen Effekt zu erzielen, wäre alle Bewegungen unscharf zu zeichnen. Das hat aber einen gewaltigen Nachteil, wie du im nächsten Abschnitt sehen wirst. Die andere Möglichkeit ist, einfach deutlich mehr Bilder pro Sekunde zu rendern, als nur 24.&lt;br /&gt;
&lt;br /&gt;
==Schärfe bei Bewegung==&lt;br /&gt;
Warum ist das Unscharf-Zeichnen ([[Motion-Blur]]) keine Lösung des Problems? Ganz einfach: Man stelle sich die selbe Szene noch einmal vor - mit dem einzigen Unterschied, dass der Betrachter dieses Mal nicht auf eine Stelle starrt, sondern den Ball mit seinem Blick verfolgt. Er sieht also erst auf die linke Seite des Bildschirms und bewegt seinen Blick mit konstanter Geschwindigkeit nacht rechts. Was würde er erwarten zu sehen? Denk' mal kurz darüber nach.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Der Spieler erwartet natürlich die selben Effekte, die er (unbewusst) zuvor in der Natur beobachtet hat. Nämlich dass der fliegende Ball gestochen scharf zu sehen ist, während der Hintergrund in Unschärfe verwischt. Denn dadurch, dass der Beobachter sein Auge immer nach dem Ball ausrichtet, trifft das von ihm reflektierte Licht immer die gleichen Stellen der Netzhaut.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Dem Ball auf dem Bildschirm zu folgen, nachdem dieser unscharf gezeichnet wurde, geht aber nicht - man sieht ja nur einen grauen Streifen, überall dort, wo der Ball im Laufe des Frames einmal war. Das Problem ist, dass der Programmierer nicht wissen kann, wie der oder die Betrachter des Bildschirms ihre Augen bewegen.&lt;br /&gt;
Würde man die gesamte Szene ohne Motion-Blur aber mit 24000 fps rendern (was natürlich kein PC oder Bildschirm schaffen würde), dann würde sich der Ball in jedem Frame um einen oder zwei Pixel verschieben und wäre zu jeder Zeit gestochen scharf, wenn man ihm folgt. Gleichzeitig würde er (für das Auge) verwischen, wenn man ihm nicht folgt.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die einzige Möglichkeit, dem Spieler ein wirklich realistisches visuelles Erlebnis zu bieten, besteht also darin, eine möglichst hohe Framerate zu erzielen. Eine geringe Framerate lässt sich im Allgemeinen nicht mit Motion-Blur kompensieren. Der Blur-Effekt kostet sogar noch Leistung und sorgt damit für eine geringere Framerate (das gilt natürlich nicht in Filmen). Dennoch hat Motion-Blur seine Existenzberechtigung: Erstens wenn die FPS-Grenze des Monitors bereits erreicht ist. Und zweitens um Dinge mit übertriebenem Motion-Blur schneller aussehen zu lassen, als sie sind.&lt;br /&gt;
&lt;br /&gt;
==Variation der Framerate==&lt;br /&gt;
Auch wenn die Framerate deutlich über 24 fps liegt, können selbst langsamere Bewegungen noch ruckelig wirken. Grund dafür ist dann, dass die Framelänge stark variiert. Als Beispiel muss mal wieder der Ball herhalten, der diesmal aber nicht in einer achtel Sekunde durchs gesamte Bild fliegt, sondern gemächlich mit konstanter Geschwindigkeit ins Bild rollt. Die Szene wird mit (normalerweise sehr flüssigen) 60 fps gerendert. Ein Frame hat also eine Dauer von 16,67 ms. Leider kommt es nun durch ungünstige Umstände dazu, dass ein einziges Frame plötzlich doppelt so lange dauert wie die anderen zuvor. Welche Auswirkungen hat also folgende Frame-Abfolge?&amp;lt;br&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! Frame &lt;br /&gt;
! Länge &lt;br /&gt;
|-&lt;br /&gt;
| Frame0 &lt;br /&gt;
| 16,67&lt;br /&gt;
|-&lt;br /&gt;
| Frame1 &lt;br /&gt;
| 16,67&lt;br /&gt;
|-&lt;br /&gt;
| Frame2 &lt;br /&gt;
| 33,33&lt;br /&gt;
|-&lt;br /&gt;
| Frame3 &lt;br /&gt;
| 16,67&lt;br /&gt;
|-&lt;br /&gt;
| Frame4 &lt;br /&gt;
| 16,67&lt;br /&gt;
|}&amp;lt;br&amp;gt;&lt;br /&gt;
Die Hälfte von 60 fps sind 30 fps. Man sollte meinen, dass dies immer noch als ruckelfrei empfunden wird. Das Problem ist auch nicht die Framelänge als solches, sondern die Länge von Frame2 im Vergleich zu den anderen Frames. Der Betrachter erwartet, dass der Ball mit konstanter Geschwindigkeit weiterrollt. Während das Bild gezeichnet wird, kann das Programm noch nicht wissen, wie viel Zeit vergangen sein wird, wenn das Bild fertig ist. Deshalb wird der Ball ja immer um die Strecke verschoben, die der letzten Framelänge entspricht. In Frame2 wird also der Ball verschoben, als wenn der Zeichenvorgang nur 16,67 ms dauern würde. In Wirklichkeit vergeht aber doppelt so viel Zeit, so dass es dem Spieler vorkommt, als hätte der Ball seine Geschwindigkeit plötzlich halbiert. Aber es kommt noch schlimmer: Da Frame3 wieder nur 16,67 ms dauert, der Ball aber so weit fortbewegt wird, als würde der Frame 33,33 ms dauern, vervierfacht sich die Geschwindigkeit nun! Erst in Frame4 bekommt der Ball durch eine erneute Tempohalbierung wieder seine wirkliche Geschwindigkeit. Diese Geschwindigkeitssprünge werden auch bei hoher Framerate noch als Ruckeln wahrgenommen. Man nennt diese Ruckler auch '''Mikroruckler'''.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Als st-Diagramm dargestellt sieht das so aus: &amp;lt;br&amp;gt;[[Datei:st-Diagramm_(Mikroruckler).png|300px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bildschirmfrequenz und V-Sync==&lt;br /&gt;
Kein Bildschirm kann beliebig viele Bilder pro Sekunde darstellen. Eine übliche Refreshrate bei Flachbildschirmen ist 60 Hz (das heißt, das Bild wird 60 mal pro Sekunde erneuert). Es gibt aber auch welche mit 120 Hz (für [[Tutorial_StereoSehen|Stereoskopie]]) oder 200 Hz. Da 60 Hz auf Röhrenbildschirmen stark flimmern, können diese alten Kisten oft auch 75, 85, oder 100 Hz. Egal, wie oft ein Monitor pro Sekunde sein Bild erneuern kann - es gibt (von Ausnahmefällen wie [[Benchmark]]ing abgesehen) keinen Grund, die Grafikkarte mehr Bilder berechnen zu lassen, zumal dies zu unerwünschten Artefakten führt ([[V-Sync#Tearing|Tearing]]).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deshalb gibt es eine Technik, die sich [[V-Sync]] nennt. Dabei wartet die Grafikkarte, bis das neue Bild an den Bildschirm übertragen wurde, bis sie das nächste beginnt. Es ist unbedingt zu empfehlen V-Sync einzuschalten, wenn der Computer sowieso mehr Bilder pro Sekunde rendern kann als der Bildschirm darzustellen vermag. Doch was passiert, wenn V-Sync eingeschaltet ist und der Rechner nicht die native Framerate des Bildschirms erreicht?&amp;lt;br&amp;gt;&lt;br /&gt;
Nehmen wir an, der Bildschirm wird 60 mal pro Sekunde aktualisiert, die GPU schafft aber nur 50 Bilder pro Sekunde. Sobald die Grafikkarte das Synchronisationssignal empfängt, kopiert sie den Backbufferinhalt in den Frontbuffer und rendert das nächste Bild in den Backbuffer. 16,67 ms später kommt das nächste Synchronisationssignal, aber die Grafikkarte ist noch nicht fertig. Also wird nichts in den Frontbuffer kopiert. Stattdessen zeigt der Bildschirm zweimal hintereinander das gleiche Bild an. Erst weitere 3,33 ms später stellt der Grafikchip das Bild fertig und muss nun 13,34 ms (!) auf das nächste Sync-Signal warten. Bis dieses kommt, sind insgesamt 33,33 ms vergangen - mit anderen Worten wir haben eine Framerate von nur 30 fps, obwohl der Computer 50 fps schaffen würde!&amp;lt;br&amp;gt;&lt;br /&gt;
===Triple-Buffering===&lt;br /&gt;
Das Problem dabei ist, dass die Grafikkarte während des Wartens auf das Sync-Signal nichts tut. Doch dafür gibt es eine Lösung: Da wir in den Backbuffer noch nicht schreiben dürfen, schreiben wir halt in einen anderen Backbuffer! Während wir in den zweiten Backbuffer schreiben, wird der erste in den Frontbuffer kopiert, sobald das Sync-Signal wieder kommt. Im nächsten Frame schreiben wir natürlich wieder in den ersten Backbuffer, während der zweite aufs Kopieren wartet. Somit erreichen wir die selbe [[Performance]] wie ohne V-Sync, sind aber gleichzeitig das Tearing losgeworden.&amp;lt;br&amp;gt;&lt;br /&gt;
Ein Nachteil des Verfahrens ist, dass wir etwas mehr Videospeicher benötigen. Der Mehrverbrauch hält sich aber in Grenzen, denn es wird lediglich ein weiterer Farbpuffer benötigt - den [[Z-Buffer|Z-]] und [[Stencilbuffer]] dagegen brauchen wir nicht noch einmal. Zudem handelt man sich natürlich weitere Mikroruckler ein - aber mal ehrlich: 50 fps mit Mikrorucklern sind immer noch besser als 30 fps ohne.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
OpemGL bietet selbst keine Möglichkeit, Triple-Buffering an- oder auszuschalten. Dies ist Sache des Treibers. Man kann Triple-Buffering zwar mittels eines [[FBO]]s emulieren, jedoch hat man dann in Wirklichkeit Quadruple-Buffering, wenn der Treiber sich bereits darum kümmert. (Quelle: [http://www.opengl.org/wiki/Common_Mistakes#Triple_Buffering])&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
[[Frameratenbegrenzung]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Framecounter]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26215</id>
		<title>Tutorial SDL2 Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26215"/>
				<updated>2014-05-14T07:06:16Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Code::Blocks (C++) auf Linux&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Andere Programmiersprachen/IDEs/Betriebssysteme sollten hier nachgetragen werden.}}&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird dir gezeigt, wie du deine Entwicklungsumgebung so einrichtest, dass du SDL2-Programme entwickeln kannst. Dies ist Voraussetzung für [[Tutorial OpenGL3 Lektion 1]]. Auch wenn das Prinzip überall gleich ist, hängen die Details von der jeweils verwendeten Programmiersprache, von der Entwicklungsumgebung und vom Betriebssystem ab. Daher ist der Rest des Artikels nach Programmiersprache und IDE aufgeteilt.&lt;br /&gt;
&lt;br /&gt;
==Code::Blocks (C++) unter Windows==&lt;br /&gt;
===SDL2 herunterladen===&lt;br /&gt;
Das erste, was wir benötigen, ist die Library SDL2 selbst. Diese lädst du dir [https://www.libsdl.org/download-2.0.php hier] herunter. Da wir Entwickler sind, brauchen wir nur, was im Abschnitt &amp;quot;Development Libraries&amp;quot; angeboten wird. Wer [http://www.codeblocks.org/ Code::Blocks] einsetzt, verwendet in der Regel den MinGW-Compiler. Dies ist dann der Fall, wenn man den Compiler gleichzeitig mit Code::Blocks installiert hat. Ist dies der Fall, speichert man als die Datei &amp;quot;SDL2-devel-2.0.3-mingw.tar.gz&amp;quot; auf dem Computer. Die Versionsnummer kann sich natürlich schon geändert haben, wenn du dieses Tutorial liest. Solange sie mit 2.0 beginnt, sollte alles so funktionieren, wie hier beschrieben.&lt;br /&gt;
===Archiv entpacken===&lt;br /&gt;
Die heruntergeladene Datei ist ein Archiv, also eine Datei in der weitere Dateien und Ordner komprimiert gespeichert sind. Schließlich wäre es mühsam, 100 Dateien einzeln herunterzuladen, nicht wahr? ;)  Um das Archiv zu entpacken, benötigst du ein Archivprogramm auf deinem Computer. Auf den meisten Computern ist das ohnehin installiert. Falls dies bei dir nicht der Fall ist, kann ich [http://www.7-zip.org/ 7-zip] empfehlen, welches kostenlos (sogar open-source) ist und sehr viele Formate lesen und schreiben kann - insbesondere auch das Format tar.gz. Wenn du das heruntergeladene Archiv entpackt hast, befindet sich auf deiner Festplatte ein Ordner &amp;quot;SDL2-2.0.3&amp;quot; (oder eine andere Versionsnummer).&lt;br /&gt;
===Die richtigen Dateien am richtigen Ort===&lt;br /&gt;
Damit der Compiler die heruntergeladenen Code-Dateien auch findet, müssen wir ihm sagen, wo sich diese befinden. Ich rate davon ab, das lokale Downloadverzeichnis (wo sich die Dateien bei dir vermutlich jetzt befinden) als Include-Pfad zu verwenden. Suche dir ein Verzeichnis auf der Festplatte aus, der deinem Ordnungssystem entspricht - auf deinem Computer herrscht doch Ordnung, oder?! ;)&amp;lt;br&amp;gt;&lt;br /&gt;
Der Einfachheit halber werde ich im Folgenden einfach annehmen, dass das Verzeichnis ''C:\include'' heißt. Darin erstellst du nun einen Ordner namens &amp;quot;SDL2&amp;quot;. Nun wechselst du in das von dir entpackte Verzeichnis nach ''SDL2-2.0.3\include'' und kopierst alle darin enthaltenen Dateien nach ''C:\include''.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem brauchen wir noch ein zweites Verzeichnis für Linker-Dateien. Dieses nenne ich hier einfach mal ''C:\lib''. Dorthin werden alle .a-Dateien kopiert, die sich im Ordner ''SDL2-2.0.3\i686-w64-mingw32\lib'' (wenn dein Programm 32bit ist) bzw. ''SDL2-2.0.3\x86_64-w64-mingw32\lib'' (falls du ein 64bit-Programm schreibst) befinden. Falls du unsicher bist, brauchst du wahrschenlich die 32bit-Version - auch wenn dein Betriebssystem 64bittig ist!&lt;br /&gt;
&lt;br /&gt;
===Projekteinstellungen===&lt;br /&gt;
Falls noch nicht geschehen, startest du nun Code::Blocks und erstellst ein neues Projekt (Konsolenanwendung, &amp;quot;Hello World&amp;quot;-Beispiel). Um sicherzugehen, dass alles andere funktioniert, kompilierst du deine Anwendung erstmal und führst sie aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist dies erfolgreich, klickst du im Menü auf &amp;quot;Project&amp;quot; -&amp;gt; &amp;quot;Build options...&amp;quot; und wählst in dem sich öffnenden Fenster den Reiter &amp;quot;Search directories&amp;quot;. Dieser enthält wiederum zwei Unterreiter &amp;quot;Compiler&amp;quot; und &amp;quot;Linker&amp;quot;. Beim Unterreiter &amp;quot;Compiler&amp;quot; klickst du auf &amp;quot;Add&amp;quot; und wählst ''C:\include'' aus. Auf die gleiche Weise wählst du beim Unterreiter &amp;quot;Linker&amp;quot; das Verzeichnis ''C:\lib'' aus.&lt;br /&gt;
Danach wechselst du noch zum Reiter &amp;quot;Linker settings&amp;quot; (neben &amp;quot;Search directories&amp;quot;) und fügst folgende Zeile in die Box &amp;quot;other linker options&amp;quot; ein:&lt;br /&gt;
 -lmingw32 -lSDL2main -lSDL2 -lopengl32&lt;br /&gt;
Anschließend natürlich noch mit einem Klick auf OK bestätigen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte nun erfolgreich gebaut (kompiliert und gelinkt) werden können:&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL2/SDL.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* args[])&lt;br /&gt;
{&lt;br /&gt;
  if(SDL_Init(SDL_INIT_EVERYTHING) != 0)&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init failed!\n&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init was successful!\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  SDL_Quit();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DLL-Fehlermeldung===&lt;br /&gt;
Bevor du jetzt laut &amp;quot;Fehlermeldung!&amp;quot; stöhnst: Ich sagte bauen, nicht ausführen ;) Die Ausführung funktioniert in der Tat noch nicht, da Windows bei der Ausführung des Programms vergeblich nach der Datei &amp;quot;SDL2.dll&amp;quot; sucht. Diese musst du erst noch in das Verzeichnis kopieren, in dem sich die exe-Datei deines Programms befindet. Du findest sie im Ordner ''SDL2-2.0.3\lib\x86'' (32bit) bzw. in ''SDL2-2.0.3\lib\x64'' (64bit).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Code::Blocks (C++) auf Linux==&lt;br /&gt;
===SDL2 herunterladen===&lt;br /&gt;
Die meisten Linux-Distributionen bieten die benötigte SDL2-Library bereits im Standard-Repository an. Unter [https://www.opensuse.org/ openSuSE] z.B. startet man einfach YaST und klickt auf &amp;quot;Software installieren oder löschen&amp;quot;. Im sich nun öffnenden Fenster suchst du nach &amp;quot;SDL2&amp;quot;. Die Pakete &amp;quot;libSDL2-2_0-0&amp;quot; und &amp;quot;libSDL2-devel&amp;quot; sind für uns interessant. Für spätere Tutorials könnten auch &amp;quot;libSDL2_image-2_0-0&amp;quot; und &amp;quot;libSDL2_image-devel&amp;quot; nützlich sein. Nach einem Klick auf &amp;quot;Akzeptieren&amp;quot; werden die ausgewählten Paket installiert. Auf anderen Linux-Distributionen sind die Schritte ähnlich und die Pakete sollten alle &amp;quot;SDL2&amp;quot; im Namen enthalten.&lt;br /&gt;
&lt;br /&gt;
===Projekteinstellungen===&lt;br /&gt;
Nach der Installation landen die SDL2-Headerdateien üblicherweise in ''/usr/include/SDL2/''. Dieser Pfad muss in Code::Blocks nicht extra angegeben werden, sondern wird normalerweise automatisch gefunden. Jedoch muss noch eine Linker-Einstellung gemacht werden. Dazu wählst du im Menü &amp;quot;Project&amp;quot; den Eintrag &amp;quot;Build options...&amp;quot; und wählst im sich öffnenden Fenster den Reiter &amp;quot;Linker settings&amp;quot;. Im Feld &amp;quot;other linker options&amp;quot; tippst du folgende Zeile ein:&lt;br /&gt;
 -ldl -lGL -lSDL2main -lSDL2&lt;br /&gt;
Nun solltest du folgenden Code problemlos kompilieren und ausführen können:&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL2/SDL.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* args[])&lt;br /&gt;
{&lt;br /&gt;
  if(SDL_Init(SDL_INIT_EVERYTHING) != 0)&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init failed!\n&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init was successful!\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  SDL_Quit();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Delphi / Lazarus unter Windows==&lt;br /&gt;
Für Delphi und Lazarus sind alle Schritte gleich, es gibt dann lediglich einen Unterschied beim Eintragen des Pfades im Compiler. Deswegen hier die Zusammenfassung für beide Compiler.&lt;br /&gt;
&lt;br /&gt;
===SDL2 herunterladen===&lt;br /&gt;
Wir benötigen natürlich auch erst einmal die Library SDL2, diese gibt es auch für uns auf der offiziellen  [http://www.libsdl.org SDL Seite]. Allerdings brauchen wir von hier lediglich die ''SDL2.dll'' mit den Programmfunktionen, also nehmen wir das entsprechende Paket der ''Runtime Libraries für Windows''. Im weiteren Verlauf gehen wir mal von der Datei ''SDL2-2.0.3-win32-x86.zip'' aus. Die Versionsnummer kann sich natürlich in Zukunft ändern. Wichtig ist nur, dass das Archiv mit &amp;quot;SDL2-2.&amp;quot; beginnt. Die 64-Bit Version benötigt man übrigens nur wenn man echte 64-Bit Programme erzeugt, also NICHT weil man ein 64-Bit Betriebssystem benutzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich benötigen wir jetzt noch Header-Dateien für Pascal, unser Compiler möchte ja auch gerne wissen, was so alles in der SDL2.dll enthalten ist ;-) Wir benutzen die Pascal-Portierung der SDL2 Header, die [http://www.delphigl.com/forum/viewtopic.php?f=13&amp;amp;t=10752 hier] erhältlich sind. Auf der GitHub-Seite angekommen schauen wir auf der rechten Seite, dort gibt es eine Schaltfläche &amp;quot;Download ZIP&amp;quot;, mit der man die Datei &amp;quot;Pascal-SDL-2-Headers-master.zip&amp;quot; erhält.&lt;br /&gt;
&lt;br /&gt;
===Archive entpacken===&lt;br /&gt;
Falls noch kein geeignetes Programm zum Entpacken von ZIP-Dateien vorhanden ist -&amp;gt; [http://www.7-zip.org/ 7-Zip].&lt;br /&gt;
Wenn ein anderes Programm benutzt wird solltest Du ja wissen, wie die Archive damit zu entpacken sind. Mit 7-Zip machen wir einen Rechtsklick auf das Archiv und wählen aus dem erscheinenden Kontextmenü &amp;quot;7-Zip&amp;quot;, es sollte dann ein Untermenü mit weiteren Befehlen erscheinen. Hier wählen wir entweder &amp;quot;Hier entpacken&amp;quot; oder &amp;quot;Entpacken nach &amp;lt;Archivname&amp;gt;&amp;quot;, besser ist die zweite Option. Damit wird in jedem Fall ein Unterordner erzeugt, der so heißt wie das Archiv und in dem sich dann die entpackten Dateien befinden. Nach dem Entpacken sollten also 2 Unterordner vorhanden sein, einer namens ''Pascal-SDL-2-Headers-master'' und einer namens ''SDL2-2.0.3-win32-x86''.&lt;br /&gt;
&lt;br /&gt;
===Die richtigen Dateien am richtigen Ort===&lt;br /&gt;
Wenn Du schon andere Fremdbibliotheken verwendest, gibt es bei Dir bestimmt einen extra Ordner dafür, im weiteren Verlauf verwenden wir mal ''C:\Library\''. In diesem erstellen wir jetzt beispielsweise einen Unterordner ''SDL2'' und kopieren/verschieben den Inhalt des entpackten Ordners ''Pascal-SDL-2-Headers-master'' hinein. Der Pfad zur Datei ''sdl2.pas'' sieht jetzt also so aus: ''C:\Library\SDL2\sdl2.pas''. Damit haben wir die Header schon mal an einem sinnvollen Ort.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt des zweiten Archivs mit der ''SDL2.dll'' wird im Projektverzeichnis deiner Anwendung benötigt, genauer: Dort wo deine ausführbare Datei erstellt wird. Wenn Du also beispielsweise ein Projekt in ''C:\Projekte\Beispiel\'' hast und deine exe-Datei dort erstellt wird, müssen die Dateien des entpackten Ordners ''SDL2-2.0.3-win32-x86'' dort hinein. Wenn im Projektordner Unterordner wie ''Debug'', ''Release'' usw. für das Erstellen der ausführbaren Datei benutzt werden, muss die ''SDL2.dll'' natürlich dort hinein.&lt;br /&gt;
&lt;br /&gt;
===Compilereinstellungen===&lt;br /&gt;
Um dem verwendeten Compiler nun die Library SDL2 bekannt zu machen, müssen wir ihm mitteilen in welchem Ordner wir die Header haben. Wie schon oben erwähnt gehen wir davon aus, das der Pfad ''C:\Library\SDL2\'' lautet.&lt;br /&gt;
&lt;br /&gt;
====Delphi====&lt;br /&gt;
Hier am Beispiel für Delphi 2009, in anderen Versionen sollte das ähnlich sein.&lt;br /&gt;
Im Menü wählen wir &amp;quot;Tools&amp;quot; -&amp;gt; &amp;quot;Optionen&amp;quot;, im erscheinenden Fenster wählen wir &amp;quot;Umgebungsoptionen&amp;quot; -&amp;gt; &amp;quot;Delphi-Optionen&amp;quot; -&amp;gt; &amp;quot;Bibliothek - Win32&amp;quot;. Auf der rechten Seite wird dann der &amp;quot;Bibliothekspfad&amp;quot; angezeigt, wir drücken die Schaltfläche &amp;quot;...&amp;quot; rechts davon. Im erscheinenden Fenster &amp;quot;Verzeichnisse&amp;quot; drücken wir dann wieder die Schaltfläche &amp;quot;...&amp;quot;, nun erscheint ein Explorerfenster in dem wir in den Ordner ''C:\Library\SDL2'' auswählen und bestätigen. Im Fenster &amp;quot;Verzeichnisse&amp;quot; danach nicht vergessen auf &amp;quot;Hinzufügen&amp;quot; zu drücken, dann mit &amp;quot;OK&amp;quot; das Fenster schließen. Abschließend im Fenster &amp;quot;Optionen&amp;quot; auch mit &amp;quot;OK&amp;quot; bestätigen. SDL2 kann nun in jedem Projekt verwendet werden, es muss hier nichts mehr in den Projekt-Optionen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Lazarus====&lt;br /&gt;
Hier am Beispiel für Lazarus 1.2.0, in anderen Versionen sollte das ähnlich sein.&lt;br /&gt;
Im Gegensatz zu Delphi gibt es keine mir bekannte Möglichkeit SDL2 generell für alle Projekte verfügbar zu machen. Wir müssen also erst einmal ein Projekt erstellt haben und können dann SDL2 für dieses Projekt folgendermaßen verfügbar machen: Im Menü wählen wir &amp;quot;Projekt&amp;quot; -&amp;gt; &amp;quot;Projekteinstellungen&amp;quot;, im sich öffnenden Fenster wählt man &amp;quot;Compilereinstellungen&amp;quot; -&amp;gt; &amp;quot;Pfade&amp;quot;. Rechts ist nun der Punkt &amp;quot;Andere Units...&amp;quot; zu sehen. Analog zu Delphi drücken wir rechts daneben die Schaltfläche &amp;quot;...&amp;quot;, es erscheint das Fenster &amp;quot;Pfadeditor&amp;quot;. Dort die Schaltfläche mit einem gelben Ordnersymbol drücken, im erscheinenden Auswahldialog nun den Ordner ''C:\Library\SDL2'' wählen und mit &amp;quot;OK&amp;quot; bestätigen. Im Fenster &amp;quot;Pfadeditor&amp;quot; danach nicht vergessen auf &amp;quot;Hinzufügen&amp;quot; zu drücken, dann mit &amp;quot;OK&amp;quot; das Fenster schließen. Abschließend im Fenster &amp;quot;Einstellungen für Projekt...&amp;quot; auch mit &amp;quot;OK&amp;quot; bestätigen. Nun kann SDL2 in diesem Projekt verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der folgende Code sollte nun kompiliert und ausgeführt werden können, vorausgesetzt Du hast nicht vergessen die ''SDL2.dll'' in den Projektordner zu kopieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;program Project1;&lt;br /&gt;
&lt;br /&gt;
{$APPTYPE CONSOLE}&lt;br /&gt;
&lt;br /&gt;
uses SysUtils, SDL2;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  if SDL_Init(SDL_INIT_EVERYTHING) &amp;lt;&amp;gt; 0 then&lt;br /&gt;
    WriteLn('SDL2 Initialisierung fehlgeschlagen!')&lt;br /&gt;
  else&lt;br /&gt;
    WriteLn('SDL2 erfolgreich initialisiert!');&lt;br /&gt;
  SDL_Quit();  &lt;br /&gt;
  Sleep(2000);&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DLL-Fehlermeldung===&lt;br /&gt;
Solltest Du beim Starten deines Programms eine Fehlermeldung bekommen (The program can't start because SDL2.dll is missing...) liegt das daran, das die SDL2-dll nicht gefunden wurde. Wie schon oben erwähnt muss diese in den gleichen Ordner kopiert werden wo deine exe-Datei ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|SDL2 Installation]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Rasterizer&amp;diff=26214</id>
		<title>Rasterizer</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Rasterizer&amp;diff=26214"/>
				<updated>2014-04-29T16:01:05Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Weiterleitung nach Rasterisierung erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT: [[Rasterisierung]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Blenderscript&amp;diff=26202</id>
		<title>Blenderscript</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Blenderscript&amp;diff=26202"/>
				<updated>2014-04-21T09:39:06Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Blender exporter Script */ Python-Code in &amp;lt;source&amp;gt;-Block gepackt (für Syntaxhighlighting)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Blender exporter Script==&lt;br /&gt;
&lt;br /&gt;
Folgendes Blenderscript, welches in Python geschrieben ist, exportiert [[Mesh]], Texturkoordinaten und Normalen. Es wurde von [[Benutzer:TAK2004|TAK2004]] geschrieben welcher es euch hiermit freistellt dieses zu erweitern, anzupassen oder einfach zu kopieren.&lt;br /&gt;
Zur Bedienung ist folgendes zu sagen:&lt;br /&gt;
*es ist auf korrekte Einrückung zu achten, da dadurch Codeblöcke, Funktionen und Einsprungspunkte erkannt werden&lt;br /&gt;
*die Datei wird an dem am Ende eingetragen Punkt gespeichert&lt;br /&gt;
*bevor das Script im File-&amp;gt;Export Menü erscheint muss das Script einmal interpretiert werden&lt;br /&gt;
*ein Script kann über ein Textfenster in Blender angezeigt und gestartet werden&lt;br /&gt;
*das Script achtet nicht auf die Rotation der Objekte, deswegen ist anzuraten durch folgende Tastenkombinationen die Objekte neu auszurichten : &amp;quot;a&amp;quot;(wählt alle Objekte aus/ab),&amp;quot;strg+s&amp;quot;(tranformiert Objektrotation mit dem Mesh und setz dann die rotation auf 0)&lt;br /&gt;
*es müssen Lichter,Empty und Kameras entfernt werden da diese sonst als Objekte interpretiert und falsch behandelt werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;#!BPY&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Name: '... Meshformat (.meshf)...'&lt;br /&gt;
Blender: 234&lt;br /&gt;
Group: 'Export'&lt;br /&gt;
Tooltip: 'Exportiert die aktuelle Szene in das ... Format'&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import struct&lt;br /&gt;
import Blender&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
from Blender import NMesh&lt;br /&gt;
from Blender import Image&lt;br /&gt;
from Blender.NMesh import *&lt;br /&gt;
from Blender.Image import *&lt;br /&gt;
&lt;br /&gt;
class TFace:&lt;br /&gt;
	vertstart=0&lt;br /&gt;
	vertcount=0&lt;br /&gt;
&lt;br /&gt;
class TObject:&lt;br /&gt;
	posx=0&lt;br /&gt;
	posy=0&lt;br /&gt;
	posz=0&lt;br /&gt;
	facestart=0&lt;br /&gt;
	facecount=0&lt;br /&gt;
&lt;br /&gt;
class meshf:&lt;br /&gt;
#header&lt;br /&gt;
	Version=&amp;quot;meshf1&amp;quot;&lt;br /&gt;
 	NumOfVert=0&lt;br /&gt;
	NumOfFace=0&lt;br /&gt;
 	NumOfObj=0&lt;br /&gt;
#data&lt;br /&gt;
&lt;br /&gt;
	Verts=[]&lt;br /&gt;
	Faces=[]&lt;br /&gt;
	Meshs=[]&lt;br /&gt;
	Texcoords=[]&lt;br /&gt;
&lt;br /&gt;
	size=0&lt;br /&gt;
&lt;br /&gt;
file=meshf&lt;br /&gt;
&lt;br /&gt;
#Funktion zum schreiben des Headers&lt;br /&gt;
def writeheader():&lt;br /&gt;
	iof.write(file.Version)&lt;br /&gt;
	data=struct.pack(&amp;quot;iii&amp;quot;,file.NumOfVert,&lt;br /&gt;
 		                        file.NumOfFace,&lt;br /&gt;
 		                        file.NumOfObj)&lt;br /&gt;
	iof.write(data)&lt;br /&gt;
&lt;br /&gt;
#Funktion zum schreiben des Datenteils&lt;br /&gt;
def writedata():&lt;br /&gt;
&lt;br /&gt;
	#Verticekoordinaten&lt;br /&gt;
	for v in file.Verts:&lt;br /&gt;
		data=struct.pack(&amp;quot;fff&amp;quot;,v.co[0],v.co[1],v.co[2])&lt;br /&gt;
		file.size=file.size+12&lt;br /&gt;
		iof.write(data)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	#Normalen&lt;br /&gt;
	for v in file.Verts:&lt;br /&gt;
		data=struct.pack(&amp;quot;fff&amp;quot;,v.no[0],v.no[1],v.no[2])&lt;br /&gt;
		file.size=file.size+12&lt;br /&gt;
		iof.write(data)&lt;br /&gt;
&lt;br /&gt;
	#Texkoordinaten&lt;br /&gt;
	for t in file.Texcoords:&lt;br /&gt;
		data=struct.pack(&amp;quot;ff&amp;quot;,t[0],t[1])&lt;br /&gt;
		file.size=file.size+8&lt;br /&gt;
		iof.write(data)&lt;br /&gt;
&lt;br /&gt;
	#Flächen&lt;br /&gt;
	for f in file.Faces:&lt;br /&gt;
		#vertstart,vertcount&lt;br /&gt;
		data=struct.pack(&amp;quot;ii&amp;quot;,f.vertstart,f.vertcount)&lt;br /&gt;
		iof.write(data)&lt;br /&gt;
		file.size=file.size+8&lt;br /&gt;
&lt;br /&gt;
	#Objekte&lt;br /&gt;
	for o in file.Meshs:&lt;br /&gt;
		data=struct.pack(&amp;quot;fff&amp;quot;,o.posx,o.posy,o.posz)&lt;br /&gt;
		iof.write(data)&lt;br /&gt;
		data=struct.pack(&amp;quot;ii&amp;quot;,o.facestart,o.facecount)&lt;br /&gt;
		iof.write(data)&lt;br /&gt;
&lt;br /&gt;
#Funktion zum lesen der Blender Daten&lt;br /&gt;
def readblenderdata():&lt;br /&gt;
	#lade alle Objekte in objs&lt;br /&gt;
	objs=Blender.Object.Get()&lt;br /&gt;
	#geht alle Objekte in objs durch&lt;br /&gt;
	for obj in objs:&lt;br /&gt;
			#holt sich die Meshdaten und speichert sie&lt;br /&gt;
			mesh=obj.getData()&lt;br /&gt;
			facecount=file.NumOfFace&lt;br /&gt;
			file.NumOfFace=file.NumOfFace+len(mesh.faces)&lt;br /&gt;
&lt;br /&gt;
			for f in mesh.faces:&lt;br /&gt;
				if len(f.v)==4:#wenn die Fläche aus 4 Vertice besteht&lt;br /&gt;
					file.Verts.append(f.v[0])&lt;br /&gt;
					file.Verts.append(f.v[1])&lt;br /&gt;
					file.Verts.append(f.v[2])&lt;br /&gt;
					fa=TFace()&lt;br /&gt;
					fa.vertstart=len(file.Verts)-3&lt;br /&gt;
					fa.vertcount=3&lt;br /&gt;
					file.Faces.append(fa)&lt;br /&gt;
&lt;br /&gt;
					file.Verts.append(f.v[0])&lt;br /&gt;
					file.Verts.append(f.v[2])&lt;br /&gt;
					file.Verts.append(f.v[3])&lt;br /&gt;
					fa=TFace()&lt;br /&gt;
					fa.vertstart=len(file.Verts)-3&lt;br /&gt;
					fa.vertcount=3&lt;br /&gt;
					file.Faces.append(fa)&lt;br /&gt;
&lt;br /&gt;
					file.NumOfFace=file.NumOfFace+1&lt;br /&gt;
					file.NumOfVert=file.NumOfVert+6&lt;br /&gt;
&lt;br /&gt;
					if len(f.uv)==0:&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
					else:&lt;br /&gt;
						file.Texcoords.append((f.uv[0][0],f.uv[0][1]))&lt;br /&gt;
						file.Texcoords.append((f.uv[1][0],f.uv[1][1]))&lt;br /&gt;
						file.Texcoords.append((f.uv[2][0],f.uv[2][1]))&lt;br /&gt;
						file.Texcoords.append((f.uv[0][0],f.uv[0][1]))&lt;br /&gt;
						file.Texcoords.append((f.uv[2][0],f.uv[2][1]))&lt;br /&gt;
						file.Texcoords.append((f.uv[3][0],f.uv[3][1]))&lt;br /&gt;
&lt;br /&gt;
				if len(f.v)==3:#wenn die Fläche aus 3 Vertice besteht&lt;br /&gt;
					for ve in f.v:&lt;br /&gt;
						file.Verts.append(ve)&lt;br /&gt;
					file.NumOfVert=file.NumOfVert+len(f.v)&lt;br /&gt;
					fa=TFace()&lt;br /&gt;
					fa.vertstart=len(file.Verts)-3&lt;br /&gt;
					fa.vertcount=3&lt;br /&gt;
					file.Faces.append(fa)&lt;br /&gt;
&lt;br /&gt;
					if len(f.uv)==0:&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
						file.Texcoords.append([0,0])&lt;br /&gt;
					else:&lt;br /&gt;
						for tc in f.uv:&lt;br /&gt;
							file.Texcoords.append((tc[0],tc[1]))&lt;br /&gt;
&lt;br /&gt;
			ob=TObject()&lt;br /&gt;
			ob.posx=obj.LocX&lt;br /&gt;
			ob.posy=obj.LocY&lt;br /&gt;
			ob.posz=obj.LocZ&lt;br /&gt;
			ob.facestart=facecount&lt;br /&gt;
			ob.facecount=file.NumOfFace-facecount&lt;br /&gt;
			file.Meshs.append(ob)&lt;br /&gt;
&lt;br /&gt;
			#Objektanzahl erhoehen&lt;br /&gt;
			file.NumOfObj=file.NumOfObj+1&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;start&amp;quot;&lt;br /&gt;
#Open File&lt;br /&gt;
iof=open(&amp;quot;C:/Medien/player.xdp&amp;quot;,&amp;quot;wb&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#holt die Szenendaten&lt;br /&gt;
readblenderdata()&lt;br /&gt;
&lt;br /&gt;
#schreibt den Header der Datei&lt;br /&gt;
writeheader()&lt;br /&gt;
&lt;br /&gt;
#schreibt den Datenteil der Datei&lt;br /&gt;
writedata()&lt;br /&gt;
&lt;br /&gt;
#Datei schliessen&lt;br /&gt;
iof.close()&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Flaechen:&amp;quot;+str(file.NumOfFace)&lt;br /&gt;
print &amp;quot;Vertice:&amp;quot;+str(file.NumOfVert)&lt;br /&gt;
print &amp;quot;ready Size:&amp;quot;+str(file.size)&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Rasterisierung&amp;diff=26193</id>
		<title>Rasterisierung</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Rasterisierung&amp;diff=26193"/>
				<updated>2014-04-16T12:29:22Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei der Rasterisierung werden aus den bisher gesammelten geometrischen Daten, die in den [[Viewport]] gemappt wurden, die [[Fragment]]e generiert, welche dann alle für eine Bildschirmkoordinate benötigten Daten beinhalten. Dazu wird die Primitive (hier: gelbes Dreieck) über das Pixelraster des Viewports gelegt. Alle Fragmente, die zu mindestens 50% von der Primitve verdeckt werden (grün ausgefüllt), werden im Folgenden weiter behandelt. Die anderen werden verworfen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Rasterizing.png|310px]]&lt;br /&gt;
&lt;br /&gt;
Rasterisierung findet nach dem [[Vertexshader|Vertex-]] und ggf. [[Geometryshader]] statt. Danach werden noch per-Fragment Operationen ([[Tiefentest|Z-Test]], [[Feste_Funktionspipeline#Alpha_Test|Alpha Test]], [[Feste_Funktionspipeline#Stencil_Test|Stencil Test]], [[Fragmentshader]], [[Blending]] etc.) für jedes gerasterte (grün ausgefüllte) Fragment durchgeführt, bevor aus dem Fragment dann ein [[Pixel]] im [[Farbpuffer]] wird.&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Rasterisierung&amp;diff=26192</id>
		<title>Rasterisierung</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Rasterisierung&amp;diff=26192"/>
				<updated>2014-04-16T12:26:51Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Bild eingefügt, ein paar Textergänzungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei der Rasterisierung werden aus den bisher gesammelten geometrischen Daten, die in den [[Viewport]] gemappt wurden, die [[Fragment]]e generiert, welche dann alle für eine Bildschirmkoordinate benötigten Daten beinhalten. Dazu wird die Primitive (hier: gelbes Dreieck) über das Pixelraster des Viewports gelegt. Alle Fragmente, die zu mindestens 50% von der Primitve verdeckt werden (grün ausgefüllt), werden im Folgenden weiter behandelt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Rasterizing.png|310px]]&lt;br /&gt;
&lt;br /&gt;
Rasterisierung findet nach dem [[Vertexshader|Vertex-]] und ggf. [[Geometryshader]] statt. Danach werden noch per-Fragment Operationen ([[Tiefentest|Z-Test]], [[Feste_Funktionspipeline#Alpha_Test|Alpha Test]], [[Feste_Funktionspipeline#Stencil_Test|Stencil Test]], [[Fragmentshader]], [[Blending]] etc.) durchgeführt, bevor aus dem Fragment dann ein [[Pixel]] im [[Farbpuffer]] wird.&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:Rasterizing.png&amp;diff=26191</id>
		<title>Datei:Rasterizing.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:Rasterizing.png&amp;diff=26191"/>
				<updated>2014-04-16T12:13:57Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Allgemeines&amp;diff=26190</id>
		<title>Tutorial Allgemeines</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Allgemeines&amp;diff=26190"/>
				<updated>2014-04-16T08:44:02Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Rendertechniken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite sind alle Tutorials von DGL aufgelistet, die nicht direkt etwas mit OpenGL zu tun haben. Dennoch sind die Inhalte für die meisten OpenGL-Entwickler durchaus relevant. Wer etwas über OpenGL selbst lernen will, sollte sich [[Tutorial GL3+]] ansehen. Außerdem gibt es noch eine ganze Menge lesenswerte aber veraltete Tutorials im Artikel [[Tutorial deprecated OpenGL]].&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
{{Hinweis|Alle Tutorials sind der [[:Kategorie:Tutorial]] zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Schwierigkeitsgrad&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_1}} &lt;br /&gt;
|Jeder Schritt wird ausführlich erklärt. Absolut Einsteigertauglich.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_2}} &lt;br /&gt;
|Verständnis der Grundprinzipien wird voraus gesetzt. Die Materie bleibt aber einfach.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_3}}&lt;br /&gt;
|Ihr wisst um was es geht. Es wird erwartet, dass ihr selbst das Thema weiterdenkt.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_4}}  &lt;br /&gt;
|Das Tutorial bietet euch einen Einstieg. Es wird erwartet, dass ihr euch selbst noch eingehender mit den beschriebenen Techniken befasst. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_5}}  &lt;br /&gt;
|Um das Tutorial zu verstehen werden Kenntnisse auf dem entsprechenden Gebiet vorausgesetzt, welche über Grundwissen hinausgehen. Es wird erwartet, dass ihr euch eingehender mit dem Thema auseinandersetzt und auch andere Quellen lest/gelesen habt. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KI ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding|Tutorial Pathfinding]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding.png|right]] &amp;quot;Pathfinding 1&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial zeigt euch Flo wie man recht simpel eine Wegfindungsroutine implementiert. Besonders wenn man sowas ohne großen Lernaufwand in sein Spiel einbinden möchte, sollte man einen Blick riskieren.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding2|Tutorial Pathfinding 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding2.png|right]] &amp;quot;Pathfinding 2&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Gerade bei aktuelleren Programmen reicht es meist nicht aus, wenn man seine Einheiten nur in 8 Himmelsrichtungen bewegen kann. Frase stellt in diesem Tutorial vor, wie man eine Wegfindungsroutine implementieren kann, wie diese in einem heutigen RTS vorkommen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spieletutorials und Softwareentwicklung==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman1|Tutorial Bomberman 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Bomberman1.jpg|right]] &amp;quot;Bomberman1 - Codebasis und Editor&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser kleinen Tutorialserie zum Thema Spieleprogrammierung kümmern wir uns neben der Erstellung unseres Basiscodes auch um einen fertigen Editor. Nach der Durcharbeitung dieses Tutorials von Sascha Willems sollte der Leser alle Grundprinzipien zur Programmierung eines Spiels verstanden haben.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman2|Tutorial Bomberman 2]]&lt;br /&gt;
{{Level_3}}&lt;br /&gt;
|[[Bild:Tutorial_Bomberman2.jpg|right]] &amp;quot;Bomberman2 - Der 3D-Bombermanklon (Grundversion)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten Teil gehts ans Eingemachte, nämlich einen fertigen Bombermanklon. In Sascha Willems Tutorial werdet ihr zusätzlich zu den bereits erworbenen Prinzipien diverse Techniken die in so ziemlich jedem Spiel Verwendung finden erlernen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung1|Tutorial Softwareentwicklung 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE1.jpg|right]] &amp;quot;Softwareentwicklung1 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser Tutorialserie zum Thema Softwareentwicklung erklärt euch Flash, wie man an ein Projekt herangeht und herausfindet was eigentlich zu tun ist. Es geht dabei um Analyse der Anforderungen und die Modellierung sogenannter Use Cases. Die hier vorgestellten Arbeiten sind Grundlage um später Klassen zu finden auf denen dann der Code aufgebaut wird.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung2|Tutorial Softwareentwicklung 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE2.jpg|right]] &amp;quot;Softwareentwicklung2 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten und umfangreichsten Teil der Serie steht das Thema &amp;quot;Klassen&amp;quot; im Zentrum. Flash erklärt euch wie man aus den Use Cases Klassen ableitet und welche unterschiedlichen Einsatzgebiete Klassen innerhalb der Software haben können.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung3|Tutorial Softwareentwicklung 3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE3_Interface.jpg|right|128px]] &amp;quot;Softwareentwicklung3 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im letzten Teil der Serie steht das Thema &amp;quot;Verhalten&amp;quot; im Zentrum. Flash erklärt euch wie die Klassen miteinander in Beziehung gesetzt werden. Außerdem wird nocheinmal auf den RUP als '''iterative''' Vorgehensweise eingegangen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mathematisches ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lineare Algebra]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_lineare_Algebra_Preview.jpg|right]] &amp;quot;Vektorrechnung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In vielen Tutorials tauchen eine Menge Begriffe aus der linearen Algebra und analytischen Geometrie auf. Wer bei Begriffen wie Vektoren, Skalar-Produkt, Vektorkreuzprodukt, etc. ein wenig Auffrischung und Implementationshinweise braucht, ist mit diesem Tutorial von EternalLearner an der richtigen Stelle.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lineare Algebra]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_lineare_Algebra_Preview.jpg|right]] &amp;quot;Rechnen mit Vektoren und Matrizen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von TAK2004 kann als Neuauflage des Tutorials &amp;quot;Lineare Algebra&amp;quot; verstanden werden. Es ist umfangreicher als sein Vorgänger und behandelt auch Matrizen. Zum Schluss werden außerdem ein paar Tipps zur Implementierung gegeben.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nachsitzen]]{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Nachsitzen_preview.png|right]] &amp;quot;3d-Mathematik&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Wer die mathematischen Grundlagen wie Sinus, Cosinus und Matrizen aus der Schule schon wieder vergessen oder noch vor sich liegen hat, der kann mit Hilfe dieses Tutorials von Delphic dieses Wissen erlernen bzw. auffrischen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt gedreht und dennoch nach vorne bewegt]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_gedreht_und_dennoch_nach_vorne_bewegt_preview.gif|right]] &amp;quot;Objekt gedreht und dennoch nach vorne bewegt&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt in diesem Tutorial wie man ein Objekt drehen und dabei trotzdem vorwärts bewegen kann. Quer fahrende Autos sind zwar praktisch zum Einparken Aber doch eher selten ;-)&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt immer um eigene Achse drehen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_immer_um_die_eigene_Achse_drehen_preview.gif|right]] &amp;quot;Objekt immer um eigene Achse drehen&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ihr euer Objekt nun noch um die eigene Achse drehen wollt, seid ihr mit diesem Tutorial von SchodMC an der richtigen Adresse&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Separating Axis Theorem]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:SAT_Kollision.jpg|right|128px]] &amp;quot;Separating Axis Theorem&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Seth erklärt in diesem Tutorial wie man Polygonkollisionen mit Hilfe des ''Seperating Axis Theorem'' erkennen kann. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision1_Coll2.png|128px|right]] &amp;quot;Kollision 1&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Reinhard Niehoff fragte uns ob er ein Tutorial über Kollision schreiben könnte. Das konnten wir nicht ablehnen, und so entstand dieses Tutorial in dem grundlegende Kollisionsberechnungen erklärt werden. Weitere sollen folgen. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision2]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision2_Thumb.png|128px|right]] &amp;quot;Kollision 2&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim zweiten Tutorial gehts mehr in die Tiefe und einige Spezialfälle bei Kugel-Polygon-Kollisionen werden erläutert. Mit dabei: Die [[Werkzeugkiste]] mit nützlichen Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision3_Thumb.png|128px|right]] &amp;quot;Kollision 3&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim letzten Tutorial dieser Serie gehts darum, wie man die bisherigen Ansätze in einem Programm unterbringt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grafik und Modellierung ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch1_preview.jpg|right]] &amp;quot;Modellierung eines Low-Poly-Menschen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Die Modellierung von organischen &amp;quot;Objekten&amp;quot; gehört mit zu den kompliziertesten Aufgaben, die es beim Modelling gibt. Wie man einen Menschen mit aus möglichst wenigen Polygonen mit dem Programm 3D Studio Max erstellen kann wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch2_preview.jpg|right]] &amp;quot;Kleider machen Leute (UVW-Mapping)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nun spendiert Sascha Willems seinem Menschen aus dem 1. Tutorial eine schmucke Uniform, so dass er sich endlich in der Öffentlichkeit blicken lassen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scripting mit JvInterpreterProgram]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_JvInterpreter_preview.png|right]] &amp;quot;Skripting mithilfe der Jedi-Code-Library&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt hier wie man mit relativ wenig Aufwand Skripte in eigene Programme integrieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 1]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen1_preview.gif|right]] &amp;quot;Scriptsprachen Teil 1 - Einführung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Delphic genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der erste Teil widmet sich der Lexikalischen Analyse und dem Parsen des Quellcodes&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 2]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen2_preview.gif|right]] &amp;quot;Scriptsprachen Teil 2 - Virtuelle Computer und Code Erzeugung&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Delphic genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil beschreibt den Bau einer VM und der Codeerzeugung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Delphi allgemein ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Debugging]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Debugging.gif|right]] &amp;quot;Debugger benutzen und andere praktische Tipps&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet von Delphic mit der Nutzung des Delphi-Debuggers eingeführt. Auch werden Wege zur Vermeidung von Fehlern aufgezeigt. Genauso findet Ihr aber auch in diesem Tutorial Hinweise, zu häufig begangenen Fehlern und deren Ursachen.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Komponentenentwicklung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Komponentenentwicklung.png|right]] &amp;quot;Komponentenentwicklung&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet ihr ein wenig tiefer in die Entwicklung von Komponenten unter Delphi eingeführt. Es wird Grundwissen auf diesem Gebiet vorausgesetzt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Multithreading]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Multithreading.gif|right]] &amp;quot;Das Prinzip der Dualität&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Threads sind ein erweitertes Prinzip des bekannten Multitasking und werden innerhalb eines Programmes oft dazu genutzt, verschiedene Aufträge gleichzeitig abzuarbeiten. LossyEx erklärt euch hier deren Nutzung.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Software-Synthesizer]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Noexist.jpg|right]] &amp;quot;Software-Synthesizer&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Computerspiele bestehen nicht nur aus Grafik. Dieses Tutorial widmet sich einem ganz anderen Bereich der Spieleprogrammierung: Der Erzeugung von synthetischen Sounds und Musik.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Rendertechniken ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Frustum Culling]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Frustum Culling.jpg|right]] &amp;quot;Frustum Culling&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Frustum Culling ist eine einfache Möglichkeit die Rendergeschwindigkeit zu erhöhen, da man damit schon vor dem Senden der Daten an die Grafikkarten feststellen kann, welche Objekte sich im Blickfeld des Spielers befinden und welche nicht.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Octree]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Octree preview.jpg|right]] &amp;quot;Octrees&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Octrees sind eine einfach zu implementierende, aber sehr effiziente Möglichkeit um besonders Outdoor-Szenen abhängig vom Betrachterblickfeld stark zu beschleunigen. In diesem Tutorial zeigt Shadow euch eine komplette Implementation eines Octrees inklusive ausgiebigem Quellcode.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Charakteranimation]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:walk30left.gif|right]] &amp;quot;Charakteranimation&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Wer menschliche Charaktere oder Tiere lebendig aussehend animieren will, kommt mit herkömmlichen Mitteln wie Translation und Rotation der Modelview-Matrix nicht weiter. In diesem Tutorial erklärt euch glAwesome, wie ihr eure Meshes zum Leben erweckt.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Raytracing - Grundlagen I]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen I&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 1 - Von den Strahlen bis zur ersten Darstellung von Kugeln und Ebenen&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Raytracing - Grundlagen II]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen II&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 2 - Einfache Basisobjekte, Transformationen und Phong-Lightning&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:walk30left.gif&amp;diff=26189</id>
		<title>Datei:walk30left.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:walk30left.gif&amp;diff=26189"/>
				<updated>2014-04-16T08:31:14Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Glawesome lud eine neue Version von „Datei:walk30left.gif“ hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=26188</id>
		<title>Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial&amp;diff=26188"/>
				<updated>2014-04-16T08:16:42Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Rendertechniken */ Bild für Tutorial Charakteranimation hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite findet ihr alle Tutorials die DelphiGL.com zu bieten hat. Falls ihr zu einem Thema kein Tutorial findet könnt ihr noch einen Blick auf die [[Techniken und Algorithmen]] werfen. Diese enthalten weitere Artikel zu bestimmten Techniken.&lt;br /&gt;
&lt;br /&gt;
=Hinweise=&lt;br /&gt;
Bitte tragt selbst '''keine''' eigenen Tutorials ohne Absprache mit [[Benutzer:Flash (Kevin Fleischer)|Flash]] bzw. [[Benutzer:Phobeus|Phobeus]] hier ein. Tutorials werden prinzipiell vom DGL-Team gegengelesen, ''bevor'' sie veröffentlicht werden.&lt;br /&gt;
&lt;br /&gt;
Wer mit dem Gedanken spielt, ein Tutorial für DGL zu schreiben, sollte sich bereits bei der Themenwahl mit dem DGL-Team absprechen. DGL ist sehr an neuen Tutorials interessiert. Nur sollte man beachten, dass nichts doppelt geschrieben wird, bzw. dass nicht 2 Mann zur selben Zeit das selbe Thema beackern.&lt;br /&gt;
&lt;br /&gt;
==Hinweis für alle Programmieranfänger==&lt;br /&gt;
Falls ihr OpenGL nutzen wollt aber noch keinerlei Programmiererfahrung habt, so solltet ihr zuerst eine Programmiersprache lernen.&lt;br /&gt;
&lt;br /&gt;
DGL kann folgende Tutorials empfehlen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Link&lt;br /&gt;
!Sprache&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphi-treff.de/tutorials/ Delphitutorials bei www.delphi-treff.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Delphi Source der Delphi Treff entstand durch den Zusammenschluss von Delphi-Source und dem Delphi-Treff und wurde mittlerweile wieder in Delphi-Treff umbenannt. Diese Community verfügt über eine ausgezeichnete Sammlung von Tutorials zum Thema &amp;quot;Delphiprogrammierung&amp;quot;. Es werden nicht nur die Grundlagen erklärt sondern nahezu alle Bereiche der Programmierung mit Delphi. Außerdem verfügt diese Community über ein Forum welches mit seiner ''Bastelecke'' auch für Anfänger geeignet ist.&lt;br /&gt;
|-&lt;br /&gt;
|[http://crashkurs.christian-stelzmann.de/ Crashkurs von Christian Stelzmann]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Der Crashkurs von Christian erklärt neben den Grundlagen zur und über die Sprache auch die IDE anhand von zahlreichen einfachen Beispielen, die den Einstieg in Delphi stark vereinfachen und so eine einfache Einführung in die Arbeit mit Delphi bieten.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Wer sehen möchte was DGLer aus dem hier Gelernten und ihrer Kreativität so machen, findet Beispiele davon in der [[DGL_Projekte]]-Ecke.''&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
{{Hinweis|Alle Tutorials sind der [[:Kategorie:Tutorial]] zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Schwierigkeitsgrad&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_1}} &lt;br /&gt;
|Jeder Schritt wird ausführlich erklärt. Absolut Einsteigertauglich.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_2}} &lt;br /&gt;
|Verständnis der Grundprinzipien wird voraus gesetzt. Die Materie bleibt aber einfach.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_3}}&lt;br /&gt;
|Ihr wisst um was es geht. Es wird erwartet, dass ihr selbst das Thema weiterdenkt.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_4}}  &lt;br /&gt;
|Das Tutorial bietet euch einen Einstieg. Es wird erwartet, dass ihr euch selbst noch eingehender mit den beschriebenen Techniken befasst. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_5}}  &lt;br /&gt;
|Um das Tutorial zu verstehen werden Kenntnisse auf dem entsprechenden Gebiet vorausgesetzt, welche über Grundwissen hinausgehen. Es wird erwartet, dass ihr euch eingehender mit dem Thema auseinandersetzt und auch andere Quellen lest/gelesen habt. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einsteiger-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{Hinweis|Die Einsteiger-Tutorials wurden auf [[SDL]] umgestellt. Dadurch wurde das Laden von Texturen erleichtert, vor allem aber ermöglicht SDL plattformunabhängig zu programmieren. Ihr benötigt deshalb die ''SDL.pas''. Diese Datei und alle anderen benötigten Dateien findet ihr im '''[[DGLSDK]]'''}}&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Quickstart]] (VCL)&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;Quickstart: OpenGL &amp;amp; Delphi&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle, die einen schnellen Einstieg in die OpenGL Programmierung mit Delphi suchen, hat Flash hier einen Einstieg geschaffen. Neben dem erstellen eines eigenen OpenGL-Templates hat er für alle, die Großes mit OpenGL vorhaben, am Ende noch einige Hinweise bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
''In diesem Tutorial wird eine Codevorlage für OpenGL-Projekte geschaffen. Diese basiert allerdings auf Borlands Visual Component Library (VCL) und nicht auf SDL. '''Unabhängig davon beherbergt dieses Tutorial im 2. Teil einige allgemeingültige Hinweise für OpenGL-Anfänger.''' Wer nicht mit SDL arbeitet weil z.B. Plattformunabhängigkeit nicht gewünscht oder durch die Sprache bereits gegeben ist, kann diese Codebasis leicht auf seine Sprache übertragen.''&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lektion 1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;Nicht zu weit aus dem Fenster lehnen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von Magellan ist für alle Neueinsteiger gedacht. Hier werden Grundlagen von &amp;quot;Was ist OpenGL&amp;quot; bis zu &amp;quot;Wie initialisiere ich OpenGL?&amp;quot; besprochen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lektion 2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion2.jpg|right]] &amp;quot;Entdeckung einer neuen Welt&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Unter dieser Überschrift empfängt euch Phobeus zu eurem ersten OpenGL Tutorial welches sich mit der Anwendung der OpenGL-API befasst.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lektion 3]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion3.gif|right]] &amp;quot;Eine Welt des Grauens?&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Hinter diesem Titel verbirgt sich ein Einsteigertutorial zum Thema Matrizen in OpenGL. Wiederum führt euch Phobeus durch den Stoff.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lektion 4]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion4.png|right]] &amp;quot;Texturen, Tapeten und Ihre Tücken&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Wie bekomme ich ein Bild auf meine Primitiven? Wer sich diese Frage bei den vorigen Tutorials gestellt hat, der bekommt hier nun von Phobeus die Antworten.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lektion 5]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion5.jpg|right]] &amp;quot;Artenvielfalten und Ihre Folgen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial geht Phobeus auf weitere Zeichentechniken und Methoden zur Verbesserung der Performance unter OpenGL ein.&lt;br /&gt;
|-&lt;br /&gt;
!''Tutorial Lektion 6 ''&lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Dark Engine&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial wurde geplant aber niemals umgesetzt. Heute hätte es auch keine Relevanz mehr, da die Dark Engine nicht gepflegt wurde. Falls ihr ein gutes Einsteigertutorial als Ersatz vorschlagen wollt, könnt ihr dies im Feedback-Forum von DelphiGL.com tun.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lektion 7]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion7.png|right]] &amp;quot;Verblendet!&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Wenn man halbdurchsichtige Fensterscheiben, Lightmaps oder etwas ähnliches in sein Projekt einbauen will, dann kommt man um Blending nicht herum. Wie man das ganze Nutzen kann ist in diesem Tutorial von Phobeus erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lektion 8]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion8.gif|right]] &amp;quot;Das Wesen von hell und dunkel - Licht&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Ohne Beleuchtung sieht selbst jede 3D-Umgebung platt aus. In diesem Tutorial wird primär der richtige Gebrauch des OpenGL-Lichtes beschrieben. Darüberhinaus wird noch die Berechnung von Normalen erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial 2D]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_2D.jpg|right]] &amp;quot;2D mit OpenGL&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
OpenGL ist zwar primär eine 3D-API, eignet sich aber, nicht zuletzt dank seiner leistungsstarken Hardwarebeschleunigung und der damit verbundenen Features, auch sehr gut für reine 2D-Anwendungen. Dieses Tutorial von Sascha Willems geht sehr ausführlich auf die Nutzung von OpenGL für 2D-Anwendungen ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Matrix2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Matrix2.png|right]] &amp;quot;Matrix2 - Matrizen und Matrixmanipulationen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Das Thema Matrizen stellt OpenGL-Einsteiger regelmäßig vor &amp;quot;unlösbare&amp;quot; Aufgaben:&amp;lt;br&amp;gt;&lt;br /&gt;
''Wieso dreht sich der Würfel so komisch, und nicht um sich selbst?''&amp;lt;br&amp;gt; &lt;br /&gt;
''Wieso verschiebt OpenGL die Kugel denn dahin, und nicht dorthin?''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Tutorial von Flash befasst sich mit den 3 Matrixtypen, die es in OpenGL gibt und erklärt was die Befehle '''glScale, glRotate und glTranslate''' wirklich machen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grundlagen-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Abseits eckiger Welten]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Abseits_eckiger_Welten.gif|right]] &amp;quot;Abseits eckiger Welten&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
3D-Welten bestehen seit eh und je aus Dreiecken, was sie oft recht eckig erscheinen lässt. In diesem Tutorial lernt ihr allerdings wie man mit Hilfe von Evaluatoren in OpenGL auch Rundungen erzeugen kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Renderpass]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Renderpass.jpg|right]] &amp;quot;Renderpass - Die Welt daneben&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
OpenGL bietet nicht nur die Möglichkeit seine Szene direkt auf den Bildschirm zu rendern, sondern auch diese in eine Textur zu rendern um diese dann auf ein Objekt zu kleben. Dadurch ergeben sich diverse neue Möglichkeiten, wie z.B. Spiegel, Portale oder nachträgliche Manipulation der Textur. Wie ihr eure Szene in eine Textur bekommt, erfahrt ihr hier.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Selection]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Selection.gif|right]] &amp;quot;Objectselektion A&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Die Selektion von Objekten braucht man spätestens dann, wenn man ein komfortable Interaktion mit der Spielwelt erstellen will. Mit diesem Tutorial von DCW_MrT ist die Thematik kein Problem mehr.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Objektselektion]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial_Selection_tut03.jpg|right]] &amp;quot;Objektselektion B&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Wie simpel der Objektselektionsmodus von OpenGL zu benutzen ist, wird in diesem Tutorial von Sascha Willems vermittelt. Dazu gibt es den Source-Code und eine fertig kompilierte Anwendung.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial ColorPicking Shader]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial_ColorPicking_Screenie.png|right]] &amp;quot;Color Picking Implementation mit Shadern&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die einfache Umsetzung von Color Picking ohne [[Shader]] enthält einige Nachteile die bei einer entsprechenden Umsetzung mit Shadern vermieden werden können. Dieses Tutorial zeigt eine shaderbasierte Methode ColorPicking so einzusetzen, dass es performant auch in größeren Szenen genutzt werden kann. Durch die Nutzung von Shadern und dem Fokus auf Optimierung des Selektionsvorganges sowie der Beachtung von Sonderfällen richtet sich dieses Tutorial an erfahrenere OpenGL Programmierer.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial TexFilter]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_TexFilter.jpg|right]] &amp;quot;Texturfilterung - Texturen-Feintuning&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Texturen sind seit langem ein wichtiger Bestandteil im Bereich der Echtzeitgrafik. OpenGL bietet auf diesem Gebiet auch diverse Möglichkeiten Texturen auch filtern zu lassen. Welche das sind und wie sie sich auswirken, könnt ihr in diesem Tutorial von Delphic nachlesen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kamera1]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Kamera1.gif|right]] &amp;quot;Dreht sich das Universum um uns? und andere philosophische Fragen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial von Delphic geht es um die Kamera. Wie eine Kameraklasse gebaut sein könnte und was sie macht wird hier erklärt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Effekte ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nebel]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Nebel.jpg|right]] &amp;quot;DGL Fogging Tutorial&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Erstaunlich einfach lässt sich mit OpenGL Nebel darstellen. Wie einfach, zeigt euch Lithander in diesem Tutorial. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Partikel1]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Partikel1.gif|right]] &amp;quot;Partikel-Tutorial I&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Partikel-Engine sollte in (fast) jeder Engine enthalten sein. Anhand dieses Tutorials von Lithander könnt ihr den Grundstein dazu legen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial BumpMap]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_BumpMap.png|right]] &amp;quot;Bumpmapping - Plastisches 2D&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Bumpmapping ist eine immer stärker genutzte Technik, um polygonarme Oberflächen ohne Tesselation mit vorgegaukelten Details - abhängig vom Lichteinfall - zu versehen. In diesem Tutorial zeigt euch HomerS, wie man Bumpmapping über die NVIDIA-spezifischen Combiner realisiert.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial MultiTexturing]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Multitex05.jpg|right]] &amp;quot;Multitexturing&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wie man mehrere Texturen auf ein Polygon bringen kann, erklärt auch Sascha Willems in diesem Tutorial zum Thema Multitexturing. Multitexturing ist seit OpenGL1.3 Teil des GL-Kerns und kann für z.B. für Lightmapping bzw. Detailmapping verwendet werden.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial StencilSpiegel]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_StencilSpiegel.jpg|right]] &amp;quot;Spiegelungen mit dem Stencil-Buffer&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Eine Echtzeit-Spiegelung ist einer der schönsten Effekte einer 3D-Welt und trägt viel zum Realismus bei. Eine Möglichkeit Spiegelungen über den Stencilpuffer zu realisieren, wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial StereoSehen]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_StereoSehen.gif|right]]Auch wenn moderne Grafikkarten durch eine immer besser werdende Darstellung dem Benutzer versuchen das Betreten einer virtuellen 3D-Welt vorzugaukeln, so schafft es doch auch das beste Doom3-Monster nur bis zur Glasröhre zu erschrecken, rutscht dann aber quietschend davon ab. Was also tun, wenn man einen Schritt weiter gehen und dem Anwender wirkliches 3D bieten möchte? Wer eine 3D-Brille hat, wird mit diesem Tutorial von Delphic eine Möglichkeit finden, die dritte Dimension am Computer zur erschließen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Alphamasking]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Alphamasking_tut04.jpg|right]]In diesem kleinen aber feinen Tutorial erklärt Sascha Willems, wie man Alphamasking dazu verwenden kann, eine Szene optisch aufzuwerten und gleichzeitig Performance zu sparen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Wassereffekt]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Wassertutorial-scrshot-preview.jpg|right]]In diesem Tutorial erklärt Lord Horazont wie man eine Wasserebene mit Brechungen mit und ohne Shader erzeugen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Extensions==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Cubemap]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Cubemap_mini.jpg|right]] &amp;quot;GL_ARB_Texture_Cubemap&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial erklärt Sascha Willems die Grundfunktionen der '''GL_ARB_Texture_Cubemap'''-Extension und zeigt auch weiterführende Techniken auf.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Vertexbufferobject]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial Vertexbufferobject preview.jpg|right]] &amp;quot;GL_ARB_Vertex_Buffer_Object&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Diese Extension führte '''VBO'''s ein. Wie man mit damit Vertexdaten schnell im Grafikkarten- und Hauptspeicher ablegt und darauf zugreift, erklärt Sascha Willems in diesem Tutorial.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Vertexprogramme]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_VP_preview.jpg|right]] &amp;quot;GL_ARB_Vertex_Program&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem umfangreichen Tutorial werden alle wichtigen Bereiche der Programmierung mit der GL_ARB_Vertex_Program-Extension abgedeckt. Man kann es als umfassende deutsche Referenz zu diesem Thema sehen, da auch alle wichtigen Funktionen aufgelistet werden und es auch sonst an nichts fehlt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial NVOcclusionQuery]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_NVO_preview.jpg|right]] &amp;quot;NV_Occlusion_Query&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Lard Middendorf geht in diesem Tutorial auf die Verwendung der NV_Occlusion_Query-Extension ein.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Pixelbuffer]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Pixelbuffer_preview.jpg|right]] &amp;quot;WGL_ARB_Pixel_Buffer&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Sascha Willems erklärt hier leicht verständlich den Umgang mit der Pixelbuffer-Extension. Als Additum wird auch noch auf die Nutzung dieser Extension für Shadowmapping eingegangen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial_Framebufferobject]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Framebufferobject_Preview.jpg|right]] &amp;quot;GL_EXT_FRAMEBUFFER_OBJECT&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Deathball erklärt in diesem Tutorial wie man Framebufferobjekte erstellt und diese zum Offscreenrendern benutzt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Shader ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial glsl|Tutorial glSlang]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_glsl1.png|right]] &amp;quot;Einführung in GLSL&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nach langem Ringen und Handeln hat es das ARB letztendlich doch geschafft, eine einheitliche Shaderhochsprache für OpenGL zu veröffentlichen, nämlich ''glSlang''. Mit glSlang können nun auch unter OpenGL Vertex- und Fragment-Shader in einer lesbaren, C-ähnlichen Hochsprache geschrieben werden, was deren Entwicklung stark vereinfacht. Diese Einführung von Sascha Willems ist weniger ein Tutorial, als ein kompletter Überblick über glSlang. Hier erfährt der Leser nicht nur etwas über die Benutzung von Shadern im Programm, sondern auch alles über die Sprachelemente, inklusive diverser Beispiele.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial glsl2|Tutorial glSlang 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;GLSL-Ergänzungen und Beispiele&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von La_Boda ist eine direkte Fortsetzung des GLSL-Tutorials. Es behandelt verstärkt die Praxis und liefert anhand von einigen Beispielen eine bessere Sicht auf die bereits gelernte Theorie.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KI ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding|Tutorial Pathfinding]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding.png|right]] &amp;quot;Pathfinding 1&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial zeigt euch Flo wie man recht simpel eine Wegfindungsroutine implementiert. Besonders wenn man sowas ohne großen Lernaufwand in sein Spiel einbinden möchte, sollte man einen Blick riskieren.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding2|Tutorial Pathfinding 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding2.png|right]] &amp;quot;Pathfinding 2&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Gerade bei aktuelleren Programmen reicht es meist nicht aus, wenn man seine Einheiten nur in 8 Himmelsrichtungen bewegen kann. Frase stellt in diesem Tutorial vor, wie man eine Wegfindungsroutine implementieren kann, wie diese in einem heutigen RTS vorkommen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Terrain und Landschaften ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain1.gif|right]] &amp;quot;Außenlandschaften mit System - Heightmaps&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Anhand der Graustufenwerte einer Bitmap-Datei kann man relativ einfach eine imposante Landschaft erstellen. Wie das ganze funktioniert erklärt euch Delphic in diesem Tutorial. Außerdem wird noch die Implementation von Skyboxen erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain2|Tutorial Terrain 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain2.gif|right]] &amp;quot;Heightmap-Texturen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Da das Terrain aus dem vorigen Tutorial noch recht eintönig grau aussieht und das natürlich geändert werden soll, erklärt euch Delphic, wie man schmucke Schatten und Texturen für die Heightmap generieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Terrain3|Tutorial Terrain 3]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Terrain3.gif|right]] &amp;quot;Terrain im Detail&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Da größere Landschaften aufgrund der hohen Polygonanzahl sehr aufwändig zu rendern sind erklärt euch Delphic hier, wie man entfernte Dreiecke &amp;quot;zusammenlegen&amp;quot; kann, um Rechenleistung zu sparen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Skyboxen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Skybox_Vorschau.jpg|right]] &amp;quot;Skyboxen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial erklärt Sascha Willems kurz und bündig den Umgang mit Skyboxen, mit denen man Landschaften schnell sehr stark optisch aufwerten kann. Es wird sowohl auf die Erstellung der Skybox-Texturen mit dem Programm Terragen als auch die Implementation der Skybox in OpenGL eingegangen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spieletutorials und Softwareentwicklung==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman1|Tutorial Bomberman 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Bomberman1.jpg|right]] &amp;quot;Bomberman1 - Codebasis und Editor&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser kleinen Tutorialserie zum Thema Spieleprogrammierung kümmern wir uns neben der Erstellung unseres Basiscodes auch um einen fertigen Editor. Nach der Durcharbeitung dieses Tutorials von Sascha Willems sollte der Leser alle Grundprinzipien zur Programmierung eines Spiels verstanden haben.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman2|Tutorial Bomberman 2]]&lt;br /&gt;
{{Level_3}}&lt;br /&gt;
|[[Bild:Tutorial_Bomberman2.jpg|right]] &amp;quot;Bomberman2 - Der 3D-Bombermanklon (Grundversion)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten Teil gehts ans Eingemachte, nämlich einen fertigen Bombermanklon. In Sascha Willems Tutorial werdet ihr zusätzlich zu den bereits erworbenen Prinzipien diverse Techniken die in so ziemlich jedem Spiel Verwendung finden erlernen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung1|Tutorial Softwareentwicklung 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE1.jpg|right]] &amp;quot;Softwareentwicklung1 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser Tutorialserie zum Thema Softwareentwicklung erklärt euch Flash, wie man an ein Projekt herangeht und herausfindet was eigentlich zu tun ist. Es geht dabei um Analyse der Anforderungen und die Modellierung sogenannter Use Cases. Die hier vorgestellten Arbeiten sind Grundlage um später Klassen zu finden auf denen dann der Code aufgebaut wird.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung2|Tutorial Softwareentwicklung 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE2.jpg|right]] &amp;quot;Softwareentwicklung2 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten und umfangreichsten Teil der Serie steht das Thema &amp;quot;Klassen&amp;quot; im Zentrum. Flash erklärt euch wie man aus den Use Cases Klassen ableitet und welche unterschiedlichen Einsatzgebiete Klassen innerhalb der Software haben können.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung3|Tutorial Softwareentwicklung 3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE3_Interface.jpg|right|128px]] &amp;quot;Softwareentwicklung3 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im letzten Teil der Serie steht das Thema &amp;quot;Verhalten&amp;quot; im Zentrum. Flash erklärt euch wie die Klassen miteinander in Beziehung gesetzt werden. Außerdem wird nocheinmal auf den RUP als '''iterative''' Vorgehensweise eingegangen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mathematisches ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lineare Algebra]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_lineare_Algebra_Preview.jpg|right]] &amp;quot;Vektorrechnung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In vielen Tutorials tauchen eine Menge Begriffe aus der linearen Algebra und analytischen Geometrie auf. Wer bei Begriffen wie Vektoren, Skalar-Produkt, Vektorkreuzprodukt, etc. ein wenig Auffrischung und Implementationshinweise braucht, ist mit diesem Tutorial von EternalLearner an der richtigen Stelle.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nachsitzen]]{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Nachsitzen_preview.png|right]] &amp;quot;3d-Mathematik&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Wer die mathematischen Grundlagen wie Sinus, Cosinus und Matrizen aus der Schule schon wieder vergessen oder noch vor sich liegen hat, der kann mit Hilfe dieses Tutorials von Delphic dieses Wissen erlernen bzw. auffrischen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt gedreht und dennoch nach vorne bewegt]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_gedreht_und_dennoch_nach_vorne_bewegt_preview.gif|right]] &amp;quot;Objekt gedreht und dennoch nach vorne bewegt&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt in diesem Tutorial wie man ein Objekt drehen und dabei trotzdem vorwärts bewegen kann. Quer fahrende Autos sind zwar praktisch zum Einparken Aber doch eher selten ;-)&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt immer um eigene Achse drehen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_immer_um_die_eigene_Achse_drehen_preview.gif|right]] &amp;quot;Objekt immer um eigene Achse drehen&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ihr euer Objekt nun noch um die eigene Achse drehen wollt, seid ihr mit diesem Tutorial von SchodMC an der richtigen Adresse&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Separating Axis Theorem]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:SAT_Kollision.jpg|right|128px]] &amp;quot;Separating Axis Theorem&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Seth erklärt in diesem Tutorial wie man Polygonkollisionen mit Hilfe des ''Seperating Axis Theorem'' erkennen kann. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision1_Coll2.png|128px|right]] &amp;quot;Kollision 1&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Reinhard Niehoff fragte uns ob er ein Tutorial über Kollision schreiben könnte. Das konnten wir nicht ablehnen, und so entstand dieses Tutorial in dem grundlegende Kollisionsberechnungen erklärt werden. Weitere sollen folgen. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision2]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision2_Thumb.png|128px|right]] &amp;quot;Kollision 2&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim zweiten Tutorial gehts mehr in die Tiefe und einige Spezialfälle bei Kugel-Polygon-Kollisionen werden erläutert. Mit dabei: Die [[Werkzeugkiste]] mit nützlichen Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision3_Thumb.png|128px|right]] &amp;quot;Kollision 3&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim letzten Tutorial dieser Serie gehts darum, wie man die bisherigen Ansätze in einem Programm unterbringt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grafik und Modellierung ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch1_preview.jpg|right]] &amp;quot;Modellierung eines Low-Poly-Menschen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Die Modellierung von organischen &amp;quot;Objekten&amp;quot; gehört mit zu den kompliziertesten Aufgaben, die es beim Modelling gibt. Wie man einen Menschen mit aus möglichst wenigen Polygonen mit dem Programm 3D Studio Max erstellen kann wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch2_preview.jpg|right]] &amp;quot;Kleider machen Leute (UVW-Mapping)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nun spendiert Sascha Willems seinem Menschen aus dem 1. Tutorial eine schmucke Uniform, so dass er sich endlich in der Öffentlichkeit blicken lassen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scripting mit JvInterpreterProgram]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_JvInterpreter_preview.png|right]] &amp;quot;Skripting mithilfe der Jedi-Code-Library&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt hier wie man mit relativ wenig Aufwand Skripte in eigene Programme integrieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 1]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen1_preview.gif|right]] &amp;quot;Scriptsprachen Teil 1 - Einführung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Delphic genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der erste Teil widmet sich der Lexikalischen Analyse und dem Parsen des Quellcodes&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 2]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen2_preview.gif|right]] &amp;quot;Scriptsprachen Teil 2 - Virtuelle Computer und Code Erzeugung&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Delphic genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil beschreibt den Bau einer VM und der Codeerzeugung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Delphi allgemein ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Debugging]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Debugging.gif|right]] &amp;quot;Debugger benutzen und andere praktische Tipps&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet von Delphic mit der Nutzung des Delphi-Debuggers eingeführt. Auch werden Wege zur Vermeidung von Fehlern aufgezeigt. Genauso findet Ihr aber auch in diesem Tutorial Hinweise, zu häufig begangenen Fehlern und deren Ursachen.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Komponentenentwicklung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Komponentenentwicklung.png|right]] &amp;quot;Komponentenentwicklung&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet ihr ein wenig tiefer in die Entwicklung von Komponenten unter Delphi eingeführt. Es wird Grundwissen auf diesem Gebiet vorausgesetzt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Multithreading]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Multithreading.gif|right]] &amp;quot;Das Prinzip der Dualität&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Threads sind ein erweitertes Prinzip des bekannten Multitasking und werden innerhalb eines Programmes oft dazu genutzt, verschiedene Aufträge gleichzeitig abzuarbeiten. LossyEx erklärt euch hier deren Nutzung.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Software-Synthesizer]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Noexist.jpg|right]] &amp;quot;Software-Synthesizer&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Computerspiele bestehen nicht nur aus Grafik. Dieses Tutorial widmet sich einem ganz anderen Bereich der Spieleprogrammierung: Der Erzeugung von synthetischen Sounds und Musik.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SDL ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial SDL Einstieg]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Lektion1.gif|right]] &amp;quot;SDL-Einsteiger-Tutorial&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Crossplattform-Programmierung ist das Zauberwort, welches in den letzten Jahren - dank verstärkter Präsenz von Linux - immer wieder in den Programmierforen des Internets auftaucht. Für Grafikprogrammier ist [[SDL]] hier das Mittel der Wahl. Bekannte Titel wie &amp;quot;Quake III&amp;quot; und &amp;quot;Civilisation - Call to Power&amp;quot; bauen bereits auf diese Bibiothek für ihre Linux-Ports. Phobeus zeigt euch in diesem ersten SDL-Tutorial was SDL ist und wie man es benutzt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial SDL_RWops]]&lt;br /&gt;
{{Level_2}}&lt;br /&gt;
| [[Bild:Noexist.jpg|right]] &amp;quot;SDL_RWops-Tutorial&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
SDL benutzt für den Dateizugriff SDL_RWops. [[Benutzer:Lord Horazont|Lord Horazont]] zeigt euch in diesen Tutorial wie man diese benutzt und auch komfortabler gestaltet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Rendertechniken ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Frustum Culling]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Frustum Culling.jpg|right]] &amp;quot;Frustum Culling&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Frustum Culling ist eine einfache Möglichkeit die Rendergeschwindigkeit zu erhöhen, da man damit schon vor dem Senden der Daten an die Grafikkarten feststellen kann, welche Objekte sich im Blickfeld des Spielers befinden und welche nicht.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Octree]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Octree preview.jpg|right]] &amp;quot;Octrees&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Octrees sind eine einfach zu implementierende, aber sehr effiziente Möglichkeit um besonders Outdoor-Szenen abhängig vom Betrachterblickfeld stark zu beschleunigen. In diesem Tutorial zeigt Shadow euch eine komplette Implementation eines Octrees inklusive ausgiebigem Quellcode.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Charakteranimation]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:walk30left.gif|right]] &amp;quot;Charakteranimation&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Wer menschliche Charaktere oder Tiere lebendig aussehend animieren will, kommt mit herkömmlichen Mitteln wie Translation und Rotation der Modelview-Matrix nicht weiter. In diesem Tutorial erklärt euch glAwesome, wie ihr eure Meshes zum Leben erweckt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Raytracing ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Raytracing - Grundlagen I]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen I&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 1 - Von den Strahlen bis zur ersten Darstellung von Kugeln und Ebenen&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Raytracing - Grundlagen II]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen II&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 2 - Einfache Basisobjekte, Transformationen und Phong-Lightning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial GLScene]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial GLScene preview.jpg|right]] &amp;quot;Einführung in GLScene&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
GLScene ist eine zu erstaunlicher Größe angewachsene Komponentensammlung, die quasi einen OpenGL-Wrapper darstellt und euch dank Delphis VCL dadurch recht einfach OpenGL-Programme erstellen lässt. LaBoda gibt euch zu dieser Komponentensammlung in diesem Tutorial deshalb eine kleine Einführung.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial WebGL]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Datei:webgl-sporeviewer.jpg|128px|right]] &amp;quot;WebGL&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
WebGL ist der neue Standard für OpenGL im Browser. Der Standard ermöglicht es hardwarebeschleunigte 3D-Grafik mit Shadern im Browser darzustellen, ohne dabei auf spezielle Plugins angewiesen zu sein. [[Benutzer:Coolcat|Coolcat]] stellt euch in diesem Tutorial die Besonderheiten dieses JavaScript-Bindings für OpenGL ES 2.0 gegenüber anderen OpenGL-Anwendungen vor.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:walk30left.gif&amp;diff=26187</id>
		<title>Datei:walk30left.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:walk30left.gif&amp;diff=26187"/>
				<updated>2014-04-16T08:14:45Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Allgemeines&amp;diff=26185</id>
		<title>Tutorial Allgemeines</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Allgemeines&amp;diff=26185"/>
				<updated>2014-04-12T10:40:34Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Die Seite wurde neu angelegt: „Auf dieser Seite sind alle Tutorials von DGL aufgelistet, die nicht direkt etwas mit OpenGL zu tun haben. Dennoch sind die Inhalte für die meisten OpenGL-Entw…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite sind alle Tutorials von DGL aufgelistet, die nicht direkt etwas mit OpenGL zu tun haben. Dennoch sind die Inhalte für die meisten OpenGL-Entwickler durchaus relevant. Wer etwas über OpenGL selbst lernen will, sollte sich [[Tutorial GL3+]] ansehen. Außerdem gibt es noch eine ganze Menge lesenswerte aber veraltete Tutorials im Artikel [[Tutorial deprecated OpenGL]].&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
{{Hinweis|Alle Tutorials sind der [[:Kategorie:Tutorial]] zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Schwierigkeitsgrad&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_1}} &lt;br /&gt;
|Jeder Schritt wird ausführlich erklärt. Absolut Einsteigertauglich.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_2}} &lt;br /&gt;
|Verständnis der Grundprinzipien wird voraus gesetzt. Die Materie bleibt aber einfach.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_3}}&lt;br /&gt;
|Ihr wisst um was es geht. Es wird erwartet, dass ihr selbst das Thema weiterdenkt.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_4}}  &lt;br /&gt;
|Das Tutorial bietet euch einen Einstieg. Es wird erwartet, dass ihr euch selbst noch eingehender mit den beschriebenen Techniken befasst. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_5}}  &lt;br /&gt;
|Um das Tutorial zu verstehen werden Kenntnisse auf dem entsprechenden Gebiet vorausgesetzt, welche über Grundwissen hinausgehen. Es wird erwartet, dass ihr euch eingehender mit dem Thema auseinandersetzt und auch andere Quellen lest/gelesen habt. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KI ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding|Tutorial Pathfinding]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding.png|right]] &amp;quot;Pathfinding 1&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In diesem Tutorial zeigt euch Flo wie man recht simpel eine Wegfindungsroutine implementiert. Besonders wenn man sowas ohne großen Lernaufwand in sein Spiel einbinden möchte, sollte man einen Blick riskieren.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial pathfinding2|Tutorial Pathfinding 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_pathfinding2.png|right]] &amp;quot;Pathfinding 2&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Gerade bei aktuelleren Programmen reicht es meist nicht aus, wenn man seine Einheiten nur in 8 Himmelsrichtungen bewegen kann. Frase stellt in diesem Tutorial vor, wie man eine Wegfindungsroutine implementieren kann, wie diese in einem heutigen RTS vorkommen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spieletutorials und Softwareentwicklung==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman1|Tutorial Bomberman 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Bomberman1.jpg|right]] &amp;quot;Bomberman1 - Codebasis und Editor&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser kleinen Tutorialserie zum Thema Spieleprogrammierung kümmern wir uns neben der Erstellung unseres Basiscodes auch um einen fertigen Editor. Nach der Durcharbeitung dieses Tutorials von Sascha Willems sollte der Leser alle Grundprinzipien zur Programmierung eines Spiels verstanden haben.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Bomberman2|Tutorial Bomberman 2]]&lt;br /&gt;
{{Level_3}}&lt;br /&gt;
|[[Bild:Tutorial_Bomberman2.jpg|right]] &amp;quot;Bomberman2 - Der 3D-Bombermanklon (Grundversion)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten Teil gehts ans Eingemachte, nämlich einen fertigen Bombermanklon. In Sascha Willems Tutorial werdet ihr zusätzlich zu den bereits erworbenen Prinzipien diverse Techniken die in so ziemlich jedem Spiel Verwendung finden erlernen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung1|Tutorial Softwareentwicklung 1]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE1.jpg|right]] &amp;quot;Softwareentwicklung1 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im ersten Teil dieser Tutorialserie zum Thema Softwareentwicklung erklärt euch Flash, wie man an ein Projekt herangeht und herausfindet was eigentlich zu tun ist. Es geht dabei um Analyse der Anforderungen und die Modellierung sogenannter Use Cases. Die hier vorgestellten Arbeiten sind Grundlage um später Klassen zu finden auf denen dann der Code aufgebaut wird.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung2|Tutorial Softwareentwicklung 2]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE2.jpg|right]] &amp;quot;Softwareentwicklung2 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im zweiten und umfangreichsten Teil der Serie steht das Thema &amp;quot;Klassen&amp;quot; im Zentrum. Flash erklärt euch wie man aus den Use Cases Klassen ableitet und welche unterschiedlichen Einsatzgebiete Klassen innerhalb der Software haben können.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Softwareentwicklung3|Tutorial Softwareentwicklung 3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_SWE3_Interface.jpg|right|128px]] &amp;quot;Softwareentwicklung3 - Objektorientierte Softwareentwicklung mit UML&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Im letzten Teil der Serie steht das Thema &amp;quot;Verhalten&amp;quot; im Zentrum. Flash erklärt euch wie die Klassen miteinander in Beziehung gesetzt werden. Außerdem wird nocheinmal auf den RUP als '''iterative''' Vorgehensweise eingegangen.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mathematisches ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Lineare Algebra]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_lineare_Algebra_Preview.jpg|right]] &amp;quot;Vektorrechnung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
In vielen Tutorials tauchen eine Menge Begriffe aus der linearen Algebra und analytischen Geometrie auf. Wer bei Begriffen wie Vektoren, Skalar-Produkt, Vektorkreuzprodukt, etc. ein wenig Auffrischung und Implementationshinweise braucht, ist mit diesem Tutorial von EternalLearner an der richtigen Stelle.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lineare Algebra]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_lineare_Algebra_Preview.jpg|right]] &amp;quot;Rechnen mit Vektoren und Matrizen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieses Tutorial von TAK2004 kann als Neuauflage des Tutorials &amp;quot;Lineare Algebra&amp;quot; verstanden werden. Es ist umfangreicher als sein Vorgänger und behandelt auch Matrizen. Zum Schluss werden außerdem ein paar Tipps zur Implementierung gegeben.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Nachsitzen]]{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Nachsitzen_preview.png|right]] &amp;quot;3d-Mathematik&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Wer die mathematischen Grundlagen wie Sinus, Cosinus und Matrizen aus der Schule schon wieder vergessen oder noch vor sich liegen hat, der kann mit Hilfe dieses Tutorials von Delphic dieses Wissen erlernen bzw. auffrischen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt gedreht und dennoch nach vorne bewegt]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_gedreht_und_dennoch_nach_vorne_bewegt_preview.gif|right]] &amp;quot;Objekt gedreht und dennoch nach vorne bewegt&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt in diesem Tutorial wie man ein Objekt drehen und dabei trotzdem vorwärts bewegen kann. Quer fahrende Autos sind zwar praktisch zum Einparken Aber doch eher selten ;-)&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Objekt immer um eigene Achse drehen]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Objekt_immer_um_die_eigene_Achse_drehen_preview.gif|right]] &amp;quot;Objekt immer um eigene Achse drehen&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ihr euer Objekt nun noch um die eigene Achse drehen wollt, seid ihr mit diesem Tutorial von SchodMC an der richtigen Adresse&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Separating Axis Theorem]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:SAT_Kollision.jpg|right|128px]] &amp;quot;Separating Axis Theorem&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Seth erklärt in diesem Tutorial wie man Polygonkollisionen mit Hilfe des ''Seperating Axis Theorem'' erkennen kann. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision1_Coll2.png|128px|right]] &amp;quot;Kollision 1&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Reinhard Niehoff fragte uns ob er ein Tutorial über Kollision schreiben könnte. Das konnten wir nicht ablehnen, und so entstand dieses Tutorial in dem grundlegende Kollisionsberechnungen erklärt werden. Weitere sollen folgen. &lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision2]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision2_Thumb.png|128px|right]] &amp;quot;Kollision 2&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim zweiten Tutorial gehts mehr in die Tiefe und einige Spezialfälle bei Kugel-Polygon-Kollisionen werden erläutert. Mit dabei: Die [[Werkzeugkiste]] mit nützlichen Funktionen.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Kollision3]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Kollision3_Thumb.png|128px|right]] &amp;quot;Kollision 3&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Beim letzten Tutorial dieser Serie gehts darum, wie man die bisherigen Ansätze in einem Programm unterbringt.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grafik und Modellierung ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 1]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch1_preview.jpg|right]] &amp;quot;Modellierung eines Low-Poly-Menschen&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Die Modellierung von organischen &amp;quot;Objekten&amp;quot; gehört mit zu den kompliziertesten Aufgaben, die es beim Modelling gibt. Wie man einen Menschen mit aus möglichst wenigen Polygonen mit dem Programm 3D Studio Max erstellen kann wird in diesem Tutorial von Sascha Willems erklärt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Modellierung eines Low-Poly Menschen Teil 2]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
|[[Bild:Tutorial_Low-Poly-Mensch2_preview.jpg|right]] &amp;quot;Kleider machen Leute (UVW-Mapping)&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Nun spendiert Sascha Willems seinem Menschen aus dem 1. Tutorial eine schmucke Uniform, so dass er sich endlich in der Öffentlichkeit blicken lassen kann.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scripting mit JvInterpreterProgram]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
|[[Bild:Tutorial_JvInterpreter_preview.png|right]] &amp;quot;Skripting mithilfe der Jedi-Code-Library&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
SchodMC erklärt hier wie man mit relativ wenig Aufwand Skripte in eigene Programme integrieren kann.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 1]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen1_preview.gif|right]] &amp;quot;Scriptsprachen Teil 1 - Einführung&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Delphic genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der erste Teil widmet sich der Lexikalischen Analyse und dem Parsen des Quellcodes&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Scriptsprachen Teil 2]]&lt;br /&gt;
{{Level_5}} &lt;br /&gt;
|[[Bild:Tutorial_Skriptsprachen2_preview.gif|right]] &amp;quot;Scriptsprachen Teil 2 - Virtuelle Computer und Code Erzeugung&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Für alle die schon immer einmal wissen wollten wie ein Compiler arbeitet ist diese Tutorial-Reihe von Delphic genau das richtige.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil beschreibt den Bau einer VM und der Codeerzeugung&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Delphi allgemein ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Debugging]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Debugging.gif|right]] &amp;quot;Debugger benutzen und andere praktische Tipps&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet von Delphic mit der Nutzung des Delphi-Debuggers eingeführt. Auch werden Wege zur Vermeidung von Fehlern aufgezeigt. Genauso findet Ihr aber auch in diesem Tutorial Hinweise, zu häufig begangenen Fehlern und deren Ursachen.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Komponentenentwicklung]]&lt;br /&gt;
{{Level_2}} &lt;br /&gt;
| [[Bild:Tutorial Komponentenentwicklung.png|right]] &amp;quot;Komponentenentwicklung&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
In diesem Tutorial werdet ihr ein wenig tiefer in die Entwicklung von Komponenten unter Delphi eingeführt. Es wird Grundwissen auf diesem Gebiet vorausgesetzt.&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial Multithreading]]&lt;br /&gt;
{{Level_3}} &lt;br /&gt;
|[[Bild:Tutorial_Multithreading.gif|right]] &amp;quot;Das Prinzip der Dualität&amp;quot;.&amp;lt;br&amp;gt; &lt;br /&gt;
Threads sind ein erweitertes Prinzip des bekannten Multitasking und werden innerhalb eines Programmes oft dazu genutzt, verschiedene Aufträge gleichzeitig abzuarbeiten. LossyEx erklärt euch hier deren Nutzung.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Software-Synthesizer]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Noexist.jpg|right]] &amp;quot;Software-Synthesizer&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Computerspiele bestehen nicht nur aus Grafik. Dieses Tutorial widmet sich einem ganz anderen Bereich der Spieleprogrammierung: Der Erzeugung von synthetischen Sounds und Musik.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Rendertechniken ==&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Frustum Culling]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Frustum Culling.jpg|right]] &amp;quot;Frustum Culling&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Frustum Culling ist eine einfache Möglichkeit die Rendergeschwindigkeit zu erhöhen, da man damit schon vor dem Senden der Daten an die Grafikkarten feststellen kann, welche Objekte sich im Blickfeld des Spielers befinden und welche nicht.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Octree]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
| [[Bild:Tutorial Octree preview.jpg|right]] &amp;quot;Octrees&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Octrees sind eine einfach zu implementierende, aber sehr effiziente Möglichkeit um besonders Outdoor-Szenen abhängig vom Betrachterblickfeld stark zu beschleunigen. In diesem Tutorial zeigt Shadow euch eine komplette Implementation eines Octrees inklusive ausgiebigem Quellcode.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Charakteranimation]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_na.jpg|right]] &amp;quot;Charakteranimation&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Wer menschliche Charaktere oder Tiere lebendig aussehend animieren will, kommt mit herkömmlichen Mitteln wie Translation und Rotation der Modelview-Matrix nicht weiter. In diesem Tutorial erklärt euch glAwesome, wie ihr eure Meshes zum Leben erweckt.&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Raytracing - Grundlagen I]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen I&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 1 - Von den Strahlen bis zur ersten Darstellung von Kugeln und Ebenen&lt;br /&gt;
|-&lt;br /&gt;
! [[Tutorial Raytracing - Grundlagen II]]&lt;br /&gt;
{{Level_4}} &lt;br /&gt;
| [[Bild:Tutorial_RaytracingI_thumb.jpg|right]] &amp;quot;Raytracing - Grundlagen II&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
Die Grundzüge des Raytracings Teil 2 - Einfache Basisobjekte, Transformationen und Phong-Lightning&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26183</id>
		<title>Tutorial SDL2 Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26183"/>
				<updated>2014-04-06T15:42:18Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Die richtigen Dateien am richtigen Ort */ überflüssiges Wort entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Andere Programmiersprachen/IDEs/Betriebssysteme sollten hier nachgetragen werden.}}&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird dir gezeigt, wie du deine Entwicklungsumgebung so einrichtest, dass du SDL2-Programme entwickeln kannst. Dies ist Voraussetzung für [[Tutorial OpenGL3 Lektion 1]]. Auch wenn das Prinzip überall gleich ist, hängen die Details von der jeweils verwendeten Programmiersprache, von der Entwicklungsumgebung und vom Betriebssystem ab. Daher ist der Rest des Artikels nach Programmiersprache und IDE aufgeteilt.&lt;br /&gt;
&lt;br /&gt;
==Code::Blocks (C++) unter Windows==&lt;br /&gt;
===SDL2 herunterladen===&lt;br /&gt;
Das erste, was wir benötigen, ist die Library SDL2 selbst. Diese lädst du dir [https://www.libsdl.org/download-2.0.php hier] herunter. Da wir Entwickler sind, brauchen wir nur, was im Abschnitt &amp;quot;Development Libraries&amp;quot; angeboten wird. Wer [http://www.codeblocks.org/ Code::Blocks] einsetzt, verwendet in der Regel den MinGW-Compiler. Dies ist dann der Fall, wenn man den Compiler gleichzeitig mit Code::Blocks installiert hat. Ist dies der Fall, speichert man als die Datei &amp;quot;SDL2-devel-2.0.3-mingw.tar.gz&amp;quot; auf dem Computer. Die Versionsnummer kann sich natürlich schon geändert haben, wenn du dieses Tutorial liest. Solange sie mit 2.0 beginnt, sollte alles so funktionieren, wie hier beschrieben.&lt;br /&gt;
===Archiv entpacken===&lt;br /&gt;
Die heruntergeladene Datei ist ein Archiv, also eine Datei in der weitere Dateien und Ordner komprimiert gespeichert sind. Schließlich wäre es mühsam, 100 Dateien einzeln herunterzuladen, nicht wahr? ;)  Um das Archiv zu entpacken, benötigst du ein Archivprogramm auf deinem Computer. Auf den meisten Computern ist das ohnehin installiert. Falls dies bei dir nicht der Fall ist, kann ich [http://www.7-zip.org/ 7-zip] empfehlen, welches kostenlos (sogar open-source) ist und sehr viele Formate lesen und schreiben kann - insbesondere auch das Format tar.gz. Wenn du das heruntergeladene Archiv entpackt hast, befindet sich auf deiner Festplatte ein Ordner &amp;quot;SDL2-2.0.3&amp;quot; (oder eine andere Versionsnummer).&lt;br /&gt;
===Die richtigen Dateien am richtigen Ort===&lt;br /&gt;
Damit der Compiler die heruntergeladenen Code-Dateien auch findet, müssen wir ihm sagen, wo sich diese befinden. Ich rate davon ab, das lokale Downloadverzeichnis (wo sich die Dateien bei dir vermutlich jetzt befinden) als Include-Pfad zu verwenden. Suche dir ein Verzeichnis auf der Festplatte aus, der deinem Ordnungssystem entspricht - auf deinem Computer herrscht doch Ordnung, oder?! ;)&amp;lt;br&amp;gt;&lt;br /&gt;
Der Einfachheit halber werde ich im Folgenden einfach annehmen, dass das Verzeichnis ''C:\include'' heißt. Darin erstellst du nun einen Ordner namens &amp;quot;SDL2&amp;quot;. Nun wechselst du in das von dir entpackte Verzeichnis nach ''SDL2-2.0.3\include'' und kopierst alle darin enthaltenen Dateien nach ''C:\include''.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem brauchen wir noch ein zweites Verzeichnis für Linker-Dateien. Dieses nenne ich hier einfach mal ''C:\lib''. Dorthin werden alle .a-Dateien kopiert, die sich im Ordner ''SDL2-2.0.3\i686-w64-mingw32\lib'' (wenn dein Programm 32bit ist) bzw. ''SDL2-2.0.3\x86_64-w64-mingw32\lib'' (falls du ein 64bit-Programm schreibst) befinden. Falls du unsicher bist, brauchst du wahrschenlich die 32bit-Version - auch wenn dein Betriebssystem 64bittig ist!&lt;br /&gt;
&lt;br /&gt;
===Projekteinstellungen===&lt;br /&gt;
Falls noch nicht geschehen, startest du nun Code::Blocks und erstellst ein neues Projekt (Konsolenanwendung, &amp;quot;Hello World&amp;quot;-Beispiel). Um sicherzugehen, dass alles andere funktioniert, kompilierst du deine Anwendung erstmal und führst sie aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist dies erfolgreich, klickst du im Menü auf &amp;quot;Project&amp;quot; -&amp;gt; &amp;quot;Build options...&amp;quot; und wählst in dem sich öffnenden Fenster den Reiter &amp;quot;Search directories&amp;quot;. Dieser enthält wiederum zwei Unterreiter &amp;quot;Compiler&amp;quot; und &amp;quot;Linker&amp;quot;. Beim Unterreiter &amp;quot;Compiler&amp;quot; klickst du auf &amp;quot;Add&amp;quot; und wählst ''C:\include'' aus. Auf die gleiche Weise wählst du beim Unterreiter &amp;quot;Linker&amp;quot; das Verzeichnis ''C:\lib'' aus.&lt;br /&gt;
Danach wechselst du noch zum Reiter &amp;quot;Linker settings&amp;quot; (neben &amp;quot;Search directories&amp;quot;) und fügst folgende Zeile in die Box &amp;quot;other linker options&amp;quot; ein:&lt;br /&gt;
 -lmingw32 -lSDL2main -lSDL2 -lopengl32&lt;br /&gt;
Anschließend natürlich noch mit einem Klick auf OK bestätigen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte nun erfolgreich gebaut (kompiliert und gelinkt) werden können:&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL2/SDL.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* args[])&lt;br /&gt;
{&lt;br /&gt;
  if(SDL_Init(SDL_INIT_EVERYTHING) != 0)&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init failed!\n&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init was successful!\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  SDL_Quit();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DLL-Fehlermeldung===&lt;br /&gt;
Bevor du jetzt laut &amp;quot;Fehlermeldung!&amp;quot; stöhnst: Ich sagte bauen, nicht ausführen ;) Die Ausführung funktioniert in der Tat noch nicht, da Windows bei der Ausführung des Programms vergeblich nach der Datei &amp;quot;SDL2.dll&amp;quot; sucht. Diese musst du erst noch in das Verzeichnis kopieren, in dem sich die exe-Datei deines Programms befindet. Du findest sie im Ordner ''SDL2-2.0.3\lib\x86'' (32bit) bzw. in ''SDL2-2.0.3\lib\x64'' (64bit).&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|SDL2 Installation]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glGetShaderiv&amp;diff=26182</id>
		<title>glGetShaderiv</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glGetShaderiv&amp;diff=26182"/>
				<updated>2014-04-06T12:08:20Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Weiterleitung nach glGetShader erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT: [[glGetShader]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glGetShader&amp;diff=26181</id>
		<title>glGetShader</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glGetShader&amp;diff=26181"/>
				<updated>2014-04-06T12:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Delphi-Spezifikation */ glGetShader -&amp;gt; glGetShaderiv&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glGetShader =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glGetShaderiv''' - Gibt Parameter von Shaderobjekten aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
&lt;br /&gt;
 procedure '''glGetShaderiv'''(''shader'' : GLuint; ''pname'' : GLenum; ''params'' : PGLint)&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''shader'' &lt;br /&gt;
| Gibt das Shaderobjekt an, das abgefragt werden soll&lt;br /&gt;
|-&lt;br /&gt;
! ''pname'' &lt;br /&gt;
| Gibt den gewünschten Objektparameter an. Zulässig sind '''GL_SHADER_TYPE''', '''GL_DELETE_STATUS''', '''GL_COMPILE_STATUS''', '''GL_INFO_LOG_LENGTH''' und '''GL_SHADER_SOURCE_LENGTH'''&lt;br /&gt;
|-&lt;br /&gt;
! ''params''&lt;br /&gt;
| Beinhaltet den Objektparameter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glGetShader''' gibt nach ''params'' den Wert eines Parameters für einen spezifischen Shader aus. Folgende Parameter sind definiert:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===GL_SHADER_TYPE===&lt;br /&gt;
&lt;br /&gt;
''params'' gibt '''GL_VERTEX_SHADER''' aus, wenn ''shader'' ein Vertexshaderobjekt ist, und '''GL_FRAGMENT_SHADER''', wenn ''shader'' ein Fragmentshaderobjekt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===GL_DELETE_STATUS===&lt;br /&gt;
&lt;br /&gt;
''params'' gibt '''GL_TRUE''' aus, wenn der Shader zur Löschung markiert wurde, anderenfalls wird '''GL_FALSE''' ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===GL_COMPILE_STATUS===&lt;br /&gt;
&lt;br /&gt;
''params'' gibt '''GL_TRUE''' aus, wenn die letzte Kompilier-Operation mit dem Shader erfolgreich verlaufen ist, anderenfalls wird '''GL_FALSE''' ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===GL_INFO_LOG_LENGTH===&lt;br /&gt;
&lt;br /&gt;
''params'' gibt die Anzahl der Zeichen im Information-Log des Shaders (einschließlich der Null-Terminierung) aus. Die Größe des Zeichenpuffers wird zum Beispiel für das Abspeichern des Information-Log benötigt. Wenn der Shader kein Information-Log hat, wird 0 ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===GL_SHADER_SOURCE_LENGTH===&lt;br /&gt;
&lt;br /&gt;
''params'' gibt die Summe der Längen der Shader-Sourcecodes (einschließlcih der Null-Terminierung) aus. Die Größe des Zeichenpuffers wird zum Beispiel für das Abspeichern des Shader-Sourcecodes benötigt. Wenn kein Sourcecode vorhanden ist, wird 0 ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glGetShader''' ist nur verfügbar, wenn die verwendete OpenGL-Version größer gleich 2.0 ist.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Fehler generiert wird, wird der Inhalt von ''params'' nicht verändert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_VALUE''' wird generiert, wenn ''shader'' kein von OpenGL erzeugter Wert ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert, wenn ''shader'' sich nicht auf ein Shaderobjekt bezieht.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_ENUM''' wird generiert, wenn ''pname'' ein unzulässiger Wert ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird generiert wenn '''glGetShader''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGetShaderInfoLog]] mit dem Argument ''shader''&lt;br /&gt;
&lt;br /&gt;
[[glGetShaderSource]] mit dem Argument ''shader''&lt;br /&gt;
&lt;br /&gt;
[[glIsShader]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glCompileShader]], [[glCreateShader]], [[glDeleteShader]], [[glGetProgram]], [[glShaderSource]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|GetShader]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26180</id>
		<title>Tutorial SDL2 Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26180"/>
				<updated>2014-04-04T20:42:40Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* DLL-Fehlermeldung */ Kategorie hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Andere Programmiersprachen/IDEs/Betriebssysteme sollten hier nachgetragen werden.}}&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird dir gezeigt, wie du deine Entwicklungsumgebung so einrichtest, dass du SDL2-Programme entwickeln kannst. Dies ist Voraussetzung für [[Tutorial OpenGL3 Lektion 1]]. Auch wenn das Prinzip überall gleich ist, hängen die Details von der jeweils verwendeten Programmiersprache, von der Entwicklungsumgebung und vom Betriebssystem ab. Daher ist der Rest des Artikels nach Programmiersprache und IDE aufgeteilt.&lt;br /&gt;
&lt;br /&gt;
==Code::Blocks (C++) unter Windows==&lt;br /&gt;
===SDL2 herunterladen===&lt;br /&gt;
Das erste, was wir benötigen, ist die Library SDL2 selbst. Diese lädst du dir [https://www.libsdl.org/download-2.0.php hier] herunter. Da wir Entwickler sind, brauchen wir nur, was im Abschnitt &amp;quot;Development Libraries&amp;quot; angeboten wird. Wer [http://www.codeblocks.org/ Code::Blocks] einsetzt, verwendet in der Regel den MinGW-Compiler. Dies ist dann der Fall, wenn man den Compiler gleichzeitig mit Code::Blocks installiert hat. Ist dies der Fall, speichert man als die Datei &amp;quot;SDL2-devel-2.0.3-mingw.tar.gz&amp;quot; auf dem Computer. Die Versionsnummer kann sich natürlich schon geändert haben, wenn du dieses Tutorial liest. Solange sie mit 2.0 beginnt, sollte alles so funktionieren, wie hier beschrieben.&lt;br /&gt;
===Archiv entpacken===&lt;br /&gt;
Die heruntergeladene Datei ist ein Archiv, also eine Datei in der weitere Dateien und Ordner komprimiert gespeichert sind. Schließlich wäre es mühsam, 100 Dateien einzeln herunterzuladen, nicht wahr? ;)  Um das Archiv zu entpacken, benötigst du ein Archivprogramm auf deinem Computer. Auf den meisten Computern ist das ohnehin installiert. Falls dies bei dir nicht der Fall ist, kann ich [http://www.7-zip.org/ 7-zip] empfehlen, welches kostenlos (sogar open-source) ist und sehr viele Formate lesen und schreiben kann - insbesondere auch das Format tar.gz. Wenn du das heruntergeladene Archiv entpackt hast, befindet sich auf deiner Festplatte ein Ordner &amp;quot;SDL2-2.0.3&amp;quot; (oder eine andere Versionsnummer).&lt;br /&gt;
===Die richtigen Dateien am richtigen Ort===&lt;br /&gt;
Damit der Compiler die heruntergeladenen Code-Dateien auch findet, müssen wir ihm entweder sagen, wo sich diese befinden. Ich rate davon ab, das lokale Downloadverzeichnis (wo sich die Dateien bei dir vermutlich jetzt befinden) als Include-Pfad zu verwenden. Suche dir ein Verzeichnis auf der Festplatte aus, der deinem Ordnungssystem entspricht - auf deinem Computer herrscht doch Ordnung, oder?! ;)&amp;lt;br&amp;gt;&lt;br /&gt;
Der Einfachheit halber werde ich im Folgenden einfach annehmen, dass das Verzeichnis ''C:\include'' heißt. Darin erstellst du nun einen Ordner namens &amp;quot;SDL2&amp;quot;. Nun wechselst du in das von dir entpackte Verzeichnis nach ''SDL2-2.0.3\include'' und kopierst alle darin enthaltenen Dateien nach ''C:\include''.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem brauchen wir noch ein zweites Verzeichnis für Linker-Dateien. Dieses nenne ich hier einfach mal ''C:\lib''. Dorthin werden alle .a-Dateien kopiert, die sich im Ordner ''SDL2-2.0.3\i686-w64-mingw32\lib'' (wenn dein Programm 32bit ist) bzw. ''SDL2-2.0.3\x86_64-w64-mingw32\lib'' (falls du ein 64bit-Programm schreibst) befinden. Falls du unsicher bist, brauchst du wahrschenlich die 32bit-Version - auch wenn dein Betriebssystem 64bittig ist!&lt;br /&gt;
===Projekteinstellungen===&lt;br /&gt;
Falls noch nicht geschehen, startest du nun Code::Blocks und erstellst ein neues Projekt (Konsolenanwendung, &amp;quot;Hello World&amp;quot;-Beispiel). Um sicherzugehen, dass alles andere funktioniert, kompilierst du deine Anwendung erstmal und führst sie aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist dies erfolgreich, klickst du im Menü auf &amp;quot;Project&amp;quot; -&amp;gt; &amp;quot;Build options...&amp;quot; und wählst in dem sich öffnenden Fenster den Reiter &amp;quot;Search directories&amp;quot;. Dieser enthält wiederum zwei Unterreiter &amp;quot;Compiler&amp;quot; und &amp;quot;Linker&amp;quot;. Beim Unterreiter &amp;quot;Compiler&amp;quot; klickst du auf &amp;quot;Add&amp;quot; und wählst ''C:\include'' aus. Auf die gleiche Weise wählst du beim Unterreiter &amp;quot;Linker&amp;quot; das Verzeichnis ''C:\lib'' aus.&lt;br /&gt;
Danach wechselst du noch zum Reiter &amp;quot;Linker settings&amp;quot; (neben &amp;quot;Search directories&amp;quot;) und fügst folgende Zeile in die Box &amp;quot;other linker options&amp;quot; ein:&lt;br /&gt;
 -lmingw32 -lSDL2main -lSDL2 -lopengl32&lt;br /&gt;
Anschließend natürlich noch mit einem Klick auf OK bestätigen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte nun erfolgreich gebaut (kompiliert und gelinkt) werden können:&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL2/SDL.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* args[])&lt;br /&gt;
{&lt;br /&gt;
  if(SDL_Init(SDL_INIT_EVERYTHING) != 0)&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init failed!\n&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init was successful!\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  SDL_Quit();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DLL-Fehlermeldung===&lt;br /&gt;
Bevor du jetzt laut &amp;quot;Fehlermeldung!&amp;quot; stöhnst: Ich sagte bauen, nicht ausführen ;) Die Ausführung funktioniert in der Tat noch nicht, da Windows bei der Ausführung des Programms vergeblich nach der Datei &amp;quot;SDL2.dll&amp;quot; sucht. Diese musst du erst noch in das Verzeichnis kopieren, in dem sich die exe-Datei deines Programms befindet. Du findest sie im Ordner ''SDL2-2.0.3\lib\x86'' (32bit) bzw. in ''SDL2-2.0.3\lib\x64'' (64bit).&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|SDL2 Installation]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_GL3%2B&amp;diff=26179</id>
		<title>Tutorial GL3+</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_GL3%2B&amp;diff=26179"/>
				<updated>2014-04-04T20:16:07Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Sonstige */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite findet ihr alle Tutorials zum Thema OpenGL3 (und neueren OpenGL-Versionen), die DelphiGL.com zu bieten hat. Falls ihr zu einem Thema kein Tutorial findet könnte es sein, dass es bereits ein Tutorial in [[Tutorial deprecated OpenGL|deprecated GL]] gibt, das sich leicht in aktuelles OpenGL3 übersetzen lässt. Tutorials, die nicht direkt etwas mit OpenGL zu tun haben, findet ihr auf der Seite [[Tutorial Allgemeines]].&lt;br /&gt;
&lt;br /&gt;
=Hinweise=&lt;br /&gt;
Das Ganze ist noch eine Baustelle. Bitte den zugehörigen [http://www.delphigl.com/forum/viewtopic.php?f=21&amp;amp;t=11133 Foren-Thread] beachten.&lt;br /&gt;
&lt;br /&gt;
==Hinweis für alle Programmieranfänger==&lt;br /&gt;
Falls ihr OpenGL nutzen wollt aber noch keinerlei Programmiererfahrung habt, so solltet ihr zuerst eine Programmiersprache lernen. Das muss nicht unbedingt Pascal sein. Insbesondere solltet ihr sicher mit Pointern umgehen können.&lt;br /&gt;
&lt;br /&gt;
DGL kann folgende Tutorials empfehlen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Link&lt;br /&gt;
!Sprache&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphi-treff.de/tutorials/ Delphitutorials bei www.delphi-treff.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Delphi Source der Delphi Treff entstand durch den Zusammenschluss von Delphi-Source und dem Delphi-Treff und wurde mittlerweile wieder in Delphi-Treff umbenannt. Diese Community verfügt über eine ausgezeichnete Sammlung von Tutorials zum Thema &amp;quot;Delphiprogrammierung&amp;quot;. Es werden nicht nur die Grundlagen erklärt sondern nahezu alle Bereiche der Programmierung mit Delphi. Außerdem verfügt diese Community über ein Forum welches mit seiner ''Bastelecke'' auch für Anfänger geeignet ist.&lt;br /&gt;
|-&lt;br /&gt;
|[http://crashkurs.christian-stelzmann.de/ Crashkurs von Christian Stelzmann]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Der Crashkurs von Christian erklärt neben den Grundlagen zur und über die Sprache auch die IDE anhand von zahlreichen einfachen Beispielen, die den Einstieg in Delphi stark vereinfachen und so eine einfache Einführung in die Arbeit mit Delphi bieten.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Wer sehen möchte was DGLer aus dem hier Gelernten und ihrer Kreativität so machen, findet Beispiele davon in der [[DGL_Projekte]]-Ecke.''&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
{{Hinweis|Alle Tutorials sind der [[:Kategorie:Tutorial]] zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Schwierigkeitsgrad&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_1}} &lt;br /&gt;
|Jeder Schritt wird ausführlich erklärt. Absolut Einsteigertauglich.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_2}} &lt;br /&gt;
|Verständnis der Grundprinzipien wird voraus gesetzt. Die Materie bleibt aber einfach.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_3}}&lt;br /&gt;
|Ihr wisst um was es geht. Es wird erwartet, dass ihr selbst das Thema weiterdenkt.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_4}}  &lt;br /&gt;
|Das Tutorial bietet euch einen Einstieg. Es wird erwartet, dass ihr euch selbst noch eingehender mit den beschriebenen Techniken befasst. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_5}}  &lt;br /&gt;
|Um das Tutorial zu verstehen werden Kenntnisse auf dem entsprechenden Gebiet vorausgesetzt, welche über Grundwissen hinausgehen. Es wird erwartet, dass ihr euch eingehender mit dem Thema auseinandersetzt und auch andere Quellen lest/gelesen habt. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einsteiger-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Das erste Dreieck&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Ein rotierender Würfel&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 3]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Texturen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 4]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Beleuchtung&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sonstige ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial SDL2 Installation]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Installation von SDL2&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Wer mit SDL2 entwickeln will, muss erstmal ein paar Einstellungen in seiner IDE vornehmen. Welche das sind und wie man vorgeht, wird hier Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Tutorialreihe OpenGL3&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Dies sollte eine Tutorialreihe zu OpenGL3 werden, die leider nie fertig geworden ist. Nichtsdestotrotz kann man einiges daraus lernen.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Zeichenkontext]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Erstellung eines Renderkontexts&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Hier wird erklärt, wie man einen aktuellen Renderkontext erstellt, ohne zusätzliche Bibliotheken wie SDL2 einzusetzen.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26178</id>
		<title>Tutorial SDL2 Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26178"/>
				<updated>2014-04-04T20:07:37Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig|Andere Programmiersprachen/IDEs/Betriebssysteme sollten hier nachgetragen werden.}}&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird dir gezeigt, wie du deine Entwicklungsumgebung so einrichtest, dass du SDL2-Programme entwickeln kannst. Dies ist Voraussetzung für [[Tutorial OpenGL3 Lektion 1]]. Auch wenn das Prinzip überall gleich ist, hängen die Details von der jeweils verwendeten Programmiersprache, von der Entwicklungsumgebung und vom Betriebssystem ab. Daher ist der Rest des Artikels nach Programmiersprache und IDE aufgeteilt.&lt;br /&gt;
&lt;br /&gt;
==Code::Blocks (C++) unter Windows==&lt;br /&gt;
===SDL2 herunterladen===&lt;br /&gt;
Das erste, was wir benötigen, ist die Library SDL2 selbst. Diese lädst du dir [https://www.libsdl.org/download-2.0.php hier] herunter. Da wir Entwickler sind, brauchen wir nur, was im Abschnitt &amp;quot;Development Libraries&amp;quot; angeboten wird. Wer [http://www.codeblocks.org/ Code::Blocks] einsetzt, verwendet in der Regel den MinGW-Compiler. Dies ist dann der Fall, wenn man den Compiler gleichzeitig mit Code::Blocks installiert hat. Ist dies der Fall, speichert man als die Datei &amp;quot;SDL2-devel-2.0.3-mingw.tar.gz&amp;quot; auf dem Computer. Die Versionsnummer kann sich natürlich schon geändert haben, wenn du dieses Tutorial liest. Solange sie mit 2.0 beginnt, sollte alles so funktionieren, wie hier beschrieben.&lt;br /&gt;
===Archiv entpacken===&lt;br /&gt;
Die heruntergeladene Datei ist ein Archiv, also eine Datei in der weitere Dateien und Ordner komprimiert gespeichert sind. Schließlich wäre es mühsam, 100 Dateien einzeln herunterzuladen, nicht wahr? ;)  Um das Archiv zu entpacken, benötigst du ein Archivprogramm auf deinem Computer. Auf den meisten Computern ist das ohnehin installiert. Falls dies bei dir nicht der Fall ist, kann ich [http://www.7-zip.org/ 7-zip] empfehlen, welches kostenlos (sogar open-source) ist und sehr viele Formate lesen und schreiben kann - insbesondere auch das Format tar.gz. Wenn du das heruntergeladene Archiv entpackt hast, befindet sich auf deiner Festplatte ein Ordner &amp;quot;SDL2-2.0.3&amp;quot; (oder eine andere Versionsnummer).&lt;br /&gt;
===Die richtigen Dateien am richtigen Ort===&lt;br /&gt;
Damit der Compiler die heruntergeladenen Code-Dateien auch findet, müssen wir ihm entweder sagen, wo sich diese befinden. Ich rate davon ab, das lokale Downloadverzeichnis (wo sich die Dateien bei dir vermutlich jetzt befinden) als Include-Pfad zu verwenden. Suche dir ein Verzeichnis auf der Festplatte aus, der deinem Ordnungssystem entspricht - auf deinem Computer herrscht doch Ordnung, oder?! ;)&amp;lt;br&amp;gt;&lt;br /&gt;
Der Einfachheit halber werde ich im Folgenden einfach annehmen, dass das Verzeichnis ''C:\include'' heißt. Darin erstellst du nun einen Ordner namens &amp;quot;SDL2&amp;quot;. Nun wechselst du in das von dir entpackte Verzeichnis nach ''SDL2-2.0.3\include'' und kopierst alle darin enthaltenen Dateien nach ''C:\include''.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem brauchen wir noch ein zweites Verzeichnis für Linker-Dateien. Dieses nenne ich hier einfach mal ''C:\lib''. Dorthin werden alle .a-Dateien kopiert, die sich im Ordner ''SDL2-2.0.3\i686-w64-mingw32\lib'' (wenn dein Programm 32bit ist) bzw. ''SDL2-2.0.3\x86_64-w64-mingw32\lib'' (falls du ein 64bit-Programm schreibst) befinden. Falls du unsicher bist, brauchst du wahrschenlich die 32bit-Version - auch wenn dein Betriebssystem 64bittig ist!&lt;br /&gt;
===Projekteinstellungen===&lt;br /&gt;
Falls noch nicht geschehen, startest du nun Code::Blocks und erstellst ein neues Projekt (Konsolenanwendung, &amp;quot;Hello World&amp;quot;-Beispiel). Um sicherzugehen, dass alles andere funktioniert, kompilierst du deine Anwendung erstmal und führst sie aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist dies erfolgreich, klickst du im Menü auf &amp;quot;Project&amp;quot; -&amp;gt; &amp;quot;Build options...&amp;quot; und wählst in dem sich öffnenden Fenster den Reiter &amp;quot;Search directories&amp;quot;. Dieser enthält wiederum zwei Unterreiter &amp;quot;Compiler&amp;quot; und &amp;quot;Linker&amp;quot;. Beim Unterreiter &amp;quot;Compiler&amp;quot; klickst du auf &amp;quot;Add&amp;quot; und wählst ''C:\include'' aus. Auf die gleiche Weise wählst du beim Unterreiter &amp;quot;Linker&amp;quot; das Verzeichnis ''C:\lib'' aus.&lt;br /&gt;
Danach wechselst du noch zum Reiter &amp;quot;Linker settings&amp;quot; (neben &amp;quot;Search directories&amp;quot;) und fügst folgende Zeile in die Box &amp;quot;other linker options&amp;quot; ein:&lt;br /&gt;
 -lmingw32 -lSDL2main -lSDL2 -lopengl32&lt;br /&gt;
Anschließend natürlich noch mit einem Klick auf OK bestätigen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte nun erfolgreich gebaut (kompiliert und gelinkt) werden können:&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL2/SDL.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* args[])&lt;br /&gt;
{&lt;br /&gt;
  if(SDL_Init(SDL_INIT_EVERYTHING) != 0)&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init failed!\n&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init was successful!\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  SDL_Quit();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DLL-Fehlermeldung===&lt;br /&gt;
Bevor du jetzt laut &amp;quot;Fehlermeldung!&amp;quot; stöhnst: Ich sagte bauen, nicht ausführen ;) Die Ausführung funktioniert in der Tat noch nicht, da Windows bei der Ausführung des Programms vergeblich nach der Datei &amp;quot;SDL2.dll&amp;quot; sucht. Diese musst du erst noch in das Verzeichnis kopieren, in dem sich die exe-Datei deines Programms befindet. Du findest sie im Ordner ''SDL2-2.0.3\lib\x86'' (32bit) bzw. in ''SDL2-2.0.3\lib\x64'' (64bit).&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26177</id>
		<title>Tutorial SDL2 Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_SDL2_Installation&amp;diff=26177"/>
				<updated>2014-04-04T20:00:46Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Die Seite wurde neu angelegt: „In diesem Tutorial wird dir gezeigt, wie du deine Entwicklungsumgebung so einrichtest, dass du SDL2-Programme entwickeln kannst. Dies ist Voraussetzung für …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Tutorial wird dir gezeigt, wie du deine Entwicklungsumgebung so einrichtest, dass du SDL2-Programme entwickeln kannst. Dies ist Voraussetzung für [[Tutorial OpenGL3 Lektion 1]]. Auch wenn das Prinzip überall gleich ist, hängen die Details von der jeweils verwendeten Programmiersprache, von der Entwicklungsumgebung und vom Betriebssystem ab. Daher ist der Rest des Artikels nach Programmiersprache und IDE aufgeteilt.&lt;br /&gt;
&lt;br /&gt;
==Code::Blocks (C++) unter Windows==&lt;br /&gt;
===SDL2 herunterladen===&lt;br /&gt;
Das erste, was wir benötigen, ist die Library SDL2 selbst. Diese lädst du dir [https://www.libsdl.org/download-2.0.php hier] herunter. Da wir Entwickler sind, brauchen wir nur, was im Abschnitt &amp;quot;Development Libraries&amp;quot; angeboten wird. Wer [http://www.codeblocks.org/ Code::Blocks] einsetzt, verwendet in der Regel den MinGW-Compiler. Dies ist dann der Fall, wenn man den Compiler gleichzeitig mit Code::Blocks installiert hat. Ist dies der Fall, speichert man als die Datei &amp;quot;SDL2-devel-2.0.3-mingw.tar.gz&amp;quot; auf dem Computer. Die Versionsnummer kann sich natürlich schon geändert haben, wenn du dieses Tutorial liest. Solange sie mit 2.0 beginnt, sollte alles so funktionieren, wie hier beschrieben.&lt;br /&gt;
===Archiv entpacken===&lt;br /&gt;
Die heruntergeladene Datei ist ein Archiv, also eine Datei in der weitere Dateien und Ordner komprimiert gespeichert sind. Schließlich wäre es mühsam, 100 Dateien einzeln herunterzuladen, nicht wahr? ;)  Um das Archiv zu entpacken, benötigst du ein Archivprogramm auf deinem Computer. Auf den meisten Computern ist das ohnehin installiert. Falls dies bei dir nicht der Fall ist, kann ich [http://www.7-zip.org/ 7-zip] empfehlen, welches kostenlos (sogar open-source) ist und sehr viele Formate lesen und schreiben kann - insbesondere auch das Format tar.gz. Wenn du das heruntergeladene Archiv entpackt hast, befindet sich auf deiner Festplatte ein Ordner &amp;quot;SDL2-2.0.3&amp;quot; (oder eine andere Versionsnummer).&lt;br /&gt;
===Die richtigen Dateien am richtigen Ort===&lt;br /&gt;
Damit der Compiler die heruntergeladenen Code-Dateien auch findet, müssen wir ihm entweder sagen, wo sich diese befinden. Ich rate davon ab, das lokale Downloadverzeichnis (wo sich die Dateien bei dir vermutlich jetzt befinden) als Include-Pfad zu verwenden. Suche dir ein Verzeichnis auf der Festplatte aus, der deinem Ordnungssystem entspricht - auf deinem Computer herrscht doch Ordnung, oder?! ;)&amp;lt;br&amp;gt;&lt;br /&gt;
Der Einfachheit halber werde ich im Folgenden einfach annehmen, dass das Verzeichnis ''C:\include'' heißt. Darin erstellst du nun einen Ordner namens &amp;quot;SDL2&amp;quot;. Nun wechselst du in das von dir entpackte Verzeichnis nach ''SDL2-2.0.3\include'' und kopierst alle darin enthaltenen Dateien nach ''C:\include''.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem brauchen wir noch ein zweites Verzeichnis für Linker-Dateien. Dieses nenne ich hier einfach mal ''C:\lib''. Dorthin werden alle .a-Dateien kopiert, die sich im Ordner ''SDL2-2.0.3\i686-w64-mingw32\lib'' (wenn dein Programm 32bit ist) bzw. ''SDL2-2.0.3\x86_64-w64-mingw32\lib'' (falls du ein 64bit-Programm schreibst) befinden. Falls du unsicher bist, brauchst du wahrschenlich die 32bit-Version - auch wenn dein Betriebssystem 64bittig ist!&lt;br /&gt;
===Projekteinstellungen===&lt;br /&gt;
Falls noch nicht geschehen, startest du nun Code::Blocks und erstellst ein neues Projekt (Konsolenanwendung, &amp;quot;Hello World&amp;quot;-Beispiel). Um sicherzugehen, dass alles andere funktioniert, kompilierst du deine Anwendung erstmal und führst sie aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist dies erfolgreich, klickst du im Menü auf &amp;quot;Project&amp;quot; -&amp;gt; &amp;quot;Build options...&amp;quot; und wählst in dem sich öffnenden Fenster den Reiter &amp;quot;Search directories&amp;quot;. Dieser enthält wiederum zwei Unterreiter &amp;quot;Compiler&amp;quot; und &amp;quot;Linker&amp;quot;. Beim Unterreiter &amp;quot;Compiler&amp;quot; klickst du auf &amp;quot;Add&amp;quot; und wählst ''C:\include'' aus. Auf die gleiche Weise wählst du beim Unterreiter &amp;quot;Linker&amp;quot; das Verzeichnis ''C:\lib'' aus.&lt;br /&gt;
Danach wechselst du noch zum Reiter &amp;quot;Linker settings&amp;quot; (neben &amp;quot;Search directories&amp;quot;) und fügst folgende Zeile in die Box &amp;quot;other linker options&amp;quot; ein:&lt;br /&gt;
 -lmingw32 -lSDL2main -lSDL2 -lopengl32&lt;br /&gt;
Anschließend natürlich noch mit einem Klick auf OK bestätigen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Code sollte nun erfolgreich gebaut (kompiliert &amp;amp; gelinkt) werden können:&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL2/SDL.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* args[])&lt;br /&gt;
{&lt;br /&gt;
  if(SDL_Init(SDL_INIT_EVERYTHING) != 0)&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init failed!\n&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;SDL_Init was successful!\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  SDL_Quit();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DLL-Fehlermeldung===&lt;br /&gt;
Bevor du jetzt &amp;quot;Fehlermeldung!&amp;quot; schreist: Ich sagte bauen, nicht ausführen ;) Die Ausführung funktioniert in der Tat noch nicht, da Windows bei der Ausführung des Programms vergeblich nach der Datei &amp;quot;SDL2.dll&amp;quot; sucht. Diese musst du erst noch in das Verzeichnis kopieren, in dem sich die exe-Datei deines Programms befindet. Du findest sie im Ordner ''SDL2-2.0.3\lib\x86'' (32bit) bzw. in ''SDL2-2.0.3\lib\x64'' (64bit).&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_GL3%2B&amp;diff=26176</id>
		<title>Tutorial GL3+</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_GL3%2B&amp;diff=26176"/>
				<updated>2014-04-04T17:45:15Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Die Seite wurde neu angelegt: „Auf dieser Seite findet ihr alle Tutorials zum Thema OpenGL3 (und neueren OpenGL-Versionen), die DelphiGL.com zu bieten hat. Falls ihr zu einem Thema kein Tuto…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite findet ihr alle Tutorials zum Thema OpenGL3 (und neueren OpenGL-Versionen), die DelphiGL.com zu bieten hat. Falls ihr zu einem Thema kein Tutorial findet könnte es sein, dass es bereits ein Tutorial in [[Tutorial deprecated OpenGL|deprecated GL]] gibt, das sich leicht in aktuelles OpenGL3 übersetzen lässt. Tutorials, die nicht direkt etwas mit OpenGL zu tun haben, findet ihr auf der Seite [[Tutorial Allgemeines]].&lt;br /&gt;
&lt;br /&gt;
=Hinweise=&lt;br /&gt;
Das Ganze ist noch eine Baustelle. Bitte den zugehörigen [http://www.delphigl.com/forum/viewtopic.php?f=21&amp;amp;t=11133 Foren-Thread] beachten.&lt;br /&gt;
&lt;br /&gt;
==Hinweis für alle Programmieranfänger==&lt;br /&gt;
Falls ihr OpenGL nutzen wollt aber noch keinerlei Programmiererfahrung habt, so solltet ihr zuerst eine Programmiersprache lernen. Das muss nicht unbedingt Pascal sein. Insbesondere solltet ihr sicher mit Pointern umgehen können.&lt;br /&gt;
&lt;br /&gt;
DGL kann folgende Tutorials empfehlen:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Link&lt;br /&gt;
!Sprache&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.delphi-treff.de/tutorials/ Delphitutorials bei www.delphi-treff.de]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Delphi Source der Delphi Treff entstand durch den Zusammenschluss von Delphi-Source und dem Delphi-Treff und wurde mittlerweile wieder in Delphi-Treff umbenannt. Diese Community verfügt über eine ausgezeichnete Sammlung von Tutorials zum Thema &amp;quot;Delphiprogrammierung&amp;quot;. Es werden nicht nur die Grundlagen erklärt sondern nahezu alle Bereiche der Programmierung mit Delphi. Außerdem verfügt diese Community über ein Forum welches mit seiner ''Bastelecke'' auch für Anfänger geeignet ist.&lt;br /&gt;
|-&lt;br /&gt;
|[http://crashkurs.christian-stelzmann.de/ Crashkurs von Christian Stelzmann]&lt;br /&gt;
|{{Deutsch}}&lt;br /&gt;
|Der Crashkurs von Christian erklärt neben den Grundlagen zur und über die Sprache auch die IDE anhand von zahlreichen einfachen Beispielen, die den Einstieg in Delphi stark vereinfachen und so eine einfache Einführung in die Arbeit mit Delphi bieten.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Wer sehen möchte was DGLer aus dem hier Gelernten und ihrer Kreativität so machen, findet Beispiele davon in der [[DGL_Projekte]]-Ecke.''&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
{{Hinweis|Alle Tutorials sind der [[:Kategorie:Tutorial]] zugeordnet.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Schwierigkeitsgrad&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_1}} &lt;br /&gt;
|Jeder Schritt wird ausführlich erklärt. Absolut Einsteigertauglich.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_2}} &lt;br /&gt;
|Verständnis der Grundprinzipien wird voraus gesetzt. Die Materie bleibt aber einfach.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_3}}&lt;br /&gt;
|Ihr wisst um was es geht. Es wird erwartet, dass ihr selbst das Thema weiterdenkt.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_4}}  &lt;br /&gt;
|Das Tutorial bietet euch einen Einstieg. Es wird erwartet, dass ihr euch selbst noch eingehender mit den beschriebenen Techniken befasst. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
|{{Level_5}}  &lt;br /&gt;
|Um das Tutorial zu verstehen werden Kenntnisse auf dem entsprechenden Gebiet vorausgesetzt, welche über Grundwissen hinausgehen. Es wird erwartet, dass ihr euch eingehender mit dem Thema auseinandersetzt und auch andere Quellen lest/gelesen habt. Für Fragen steht unser Forum zur Verfügung.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einsteiger-Tutorials ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 1]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Das erste Dreieck&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 2]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Ein rotierender Würfel&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 3]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Texturen&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Lektion 4]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Beleuchtung&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Beschreibungstext&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sonstige ==&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}} width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Link&lt;br /&gt;
!width=&amp;quot;85%&amp;quot;|Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Tutorialreihe OpenGL3&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Dies sollte eine Tutorialreihe zu OpenGL3 werden, die leider nie fertig geworden ist. Nichtsdestotrotz kann man einiges daraus lernen.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
![[Tutorial OpenGL3 Zeichenkontext]]&lt;br /&gt;
{{Level_1}} &lt;br /&gt;
|[[Bild:Tutorial_na.jpg|right]] &amp;quot;Erstellung eines Renderkontexts&amp;quot;&amp;lt;br&amp;gt; &lt;br /&gt;
Hier wird erklärt, wie man einen aktuellen Renderkontext erstellt, ohne zusätzliche Bibliotheken wie SDL2 einzusetzen.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Performance&amp;diff=26173</id>
		<title>Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Performance&amp;diff=26173"/>
				<updated>2014-03-30T18:11:18Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel liefert einige Tipps dazu wie man eine OpenGL-Anwendung optimieren kann. Einige der hier genannten Tipps schließen sich gegenseitig aus. Welche Vorgehensweise die beste ist hängt immer davon ab wo gerade der Engpass liegt. Es bringt zum Beispiel wenig den Shader zu optimieren, wenn eigentlich die zu langsame CPU das Problem ist.&lt;br /&gt;
&lt;br /&gt;
=== Grundlagen ===&lt;br /&gt;
Die folgenden Tipps sind eigentlich Pflicht, insbesondere da sie meist leicht zu realisieren sind. Beherzigt man diese überhaupt nicht, muss man sich nicht über eine unglaublich langsame Anwendung wundern. Die Reihenfolge gibt so ungefähr die Wichtigkeit an.&lt;br /&gt;
# Schließe nicht sichtbare Polygone so schnell wie möglich vom Rendering aus.&lt;br /&gt;
#* Aktiviere [[Backface Culling]].&lt;br /&gt;
#* Benutze [[Frustum Culling]].&lt;br /&gt;
#* Vor allem bei statischer Geometrie (die sich nicht bewegt) bieten sich die etablierten [[Techniken_und_Algorithmen#Raumunterteilungstechniken|Raumunterteilungstechniken]] wie BSP-Tree, Quad-Tree, usw. an.&lt;br /&gt;
# Vermeide Kommunikation zwischen CPU und GPU.&lt;br /&gt;
#* Lade nicht deine Texturen/Vertexdaten in jedem Frame neu auf die Grafikkarte hoch. Vermeide den Immediate Mode, also [[glBegin]]() und [[glEnd]](). Sofern du aber nur ein, zwei einzelne Dreiecke rendern möchtest ist der Immediate Mode akzeptabel.&lt;br /&gt;
#* Verwende [[VBO|Vertexbuffer-Objects]] - am besten in Kombination mit [[Vertex Array Object]]s. In sehr alten OpenGL-Programmen kann man stattdessen [[Displayliste]]n verwenden.&lt;br /&gt;
# Verwende glDraw***-Aufrufe sparsam. Hiermit sind ALLE Befehle gemeint die irgendetwas rendern, z.B. [[glDrawArrays]], [[glDrawElements]], ..., aber auch [[glMultiDrawArrays]], usw...&lt;br /&gt;
#* Lieber ein paar Polygone mehr rendern, wenn du dadurch glDraw***-Aufrufe einsparen kannst.&lt;br /&gt;
#* Es spielt so gut wie keine Rolle, ob du 500 oder 1 Polygon renderst, da ein glDraw***-Aufrufe alleine schon ziemlich viel Zeit braucht.&lt;br /&gt;
# Optimiere deine Modelle. Nutze den Mesh-Optimierer in deiner 3D-Modellierungssoftware. Dies bringt zwar meist nicht viel, ist aber ja auch nicht mehr als ein Knopfdruck.&lt;br /&gt;
# Die Grafikkarte hat einen Cache für bereits vom Vertexshader verarbeitete Vertices. Dieser wird genutzt, wenn du [[Indices]] verwendest. Der Vertexshader muss also im optimalen Fall für jeden Vertex nur einmal ausgeführt werden, auch wenn der Vertex in mehreren Dreiecken verwendet wird. In jedem [[Mesh|geschlossenen]] und [[Mesh|2-mannigfaltigen]] Dreiecksnetz wird jeder Vertex im Durchschnitt von 6 Dreiecken verwendet. Hier lässt sich also so einiges an Speicher und Rechenleistung sparen.&lt;br /&gt;
# Nutze den [[Z-Buffer]] aus.&lt;br /&gt;
#* Sortiere nicht deine Polygone einzeln nach der Entfernung zur Kamera (Painters-Algorithm), sondern verwende den Z-Buffer.&lt;br /&gt;
#* Sofern du aufwendige Shader oder viele Texturen verwendest, rendere deine Objekte (nicht Polygone) von vorne nach hinten. Also grob sortieren und den Rest den Z-Buffer machen lassen.&lt;br /&gt;
#* Wenn du transparente Objekte hast, rendere zunächst von sortiert vorne nach hinten die undurchsichtigen Objekte. Die transparenten Objekte renderst du dann anschließend von hinten nach vorne.&lt;br /&gt;
# Vermeide wenn möglich häufige Shader-, Textur-, Material- und Statewechsel.&lt;br /&gt;
# Überlege ob es wirklich notwendig ist, am Anfang jedes Frames den Farbpuffer mittels [[glClear]] zu löschen. Wenn jeder Pixel garantiert mindestens einmal pro Frame überschrieben wird, kannst du so wahrscheinlich etwas Speicherbandbreite sparen.&lt;br /&gt;
&lt;br /&gt;
===Performance Killer===&lt;br /&gt;
# Die OpenGL eigene Selektion wird nur schlecht als recht unterstützt. Eine [[Tutorial_ColorPicking|Color-Picking-Selection]] kann abhilfe leisten.&lt;br /&gt;
# [[glPushAttrib]] und glPopAttrib gelten laut [http://developer.amd.com/media/gpu_assets/GDC06-OpenGL_Tutorial_Day-Hart-OpenGL_03_Performance.pdf diesem ATI Dokument] als &amp;quot;State Evils&amp;quot;, welche sich negativ auf die Performance auswirken.&lt;br /&gt;
# Sofern die Extension [http://www.opengl.org/registry/specs/ARB/texture_non_power_of_two.txt GL_ARB_texture_non_power_of_two] nicht unterstützt wird, könnte eine Grafikkarte bei Texturen deren Kantenlänge keiner 2er-Potenz entspricht (also z.B. 256, 512, 1024, ...) in den Software-Modus umschalten. Im Software-Modus wird die Grafikkarte komplett von der CPU emuliert. Das dies nicht schnell sein kann dürfte klar sein.&lt;br /&gt;
&lt;br /&gt;
=== Fortgeschrittene Techniken ===&lt;br /&gt;
Die folgenden Tipps sind nicht so einfach zu realisieren oder erfordern Kenntnisse über fortgeschrittene Features wie [[Shader]], [[Instancing]]. Die Reihenfolge der Tipps ist hier nicht von Bedeutung.&lt;br /&gt;
# Ein glDraw*** wird nicht sofort ausgeführt, d.h. die CPU erhält die Kontrolle zurück, bevor die GPU fertig mit dem Rendern ist. Erst beim Vertauschen von Front- und Backbuffer (&amp;quot;[[SwapBuffers]]&amp;quot;) oder einem expliziten [[glFinish]] wird synchronisiert. Folglich gebe zuerst der Grafikkarte was zu arbeiten, rechne dann deine Spiellogik, Physik, etc. auf der CPU und rufe dann erst [[SwapBuffers]] auf. Sowas geht natürlich nicht immer, aber man kann beispielsweise Physik und Rendern in zwei Frames aufsplitten. Also du berechnest immer die Physik für das nächste Frame, während die GraKa das aktuelle Frame rendert. Siehe auch [[glFlush]].&lt;br /&gt;
# Überlege ob du Grafikspeicher sparen kannst, indem du z.B. Texturkoordinaten oder Normalen zur Laufzeit im [[Shader]] berechnest.&amp;lt;br&amp;gt;(Beispiel: [[Shader#Beispiel:_Heightmap-Terrain|Heightmap-Terrain]])&lt;br /&gt;
# Wenn du viele identische Objekte renderst, überlege ob du [[Instancing]] einsetzen kannst. Erfordert allerdings halbwegs aktuelle Grafikhardware.&lt;br /&gt;
# Überlege ob du aufwendige Berechnungen, z.B. ein [[GLSL_Partikel_2|Partikelsystem]], nicht besser vollständig auf der Grafikkarte realisierst. Stichworte: [[FBO|Framebuffer-Objects]] und [[Transform-Feedback]].&lt;br /&gt;
# Verzichte auf einen [[Geometryshader]], wenn du ihn nicht unbedingt benötigst.&lt;br /&gt;
# Mit [[Triangulation|Triangle Strips]] lässt sich die Anzahl der notwendigen Vertices (bzw. Indices) bis auf ein Drittel reduzieren. Auch hier kommt der Vertexcache der Grafikkarte zum Einsatz.&lt;br /&gt;
# Überlege ob du deine Modelle immer in höchster Detailstufe (mit Texturierung, Beleuchtung und anderen teuren Effekten) zeichnen musst, wenn nicht, verwende [[LOD]] (''Level-Of-Detail'').&lt;br /&gt;
# Überlege ob du bei statischen Szenen komplexe Beleuchtungsberechnungen durch [[Lightmaps]] ersetzen kannst. Lightmaps benötigen zwar einiges an Grafikspeicher, jedoch müssen Berechnungen z.B. für Schatten nur einmal durchgeführt werden. Dies funktioniert sowohl bei [[GLSL_Licht_und_Schatten|Shadow Maps]] als auch bei [[Volumetrische_Stencilschatten|volumetrischen Stencilschatten]]. Auch [[Reflexion]]en oder [[Kaustik]]en stellen kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
=== Shader ===&lt;br /&gt;
Die folgenden Tipps beschäftigen sich mit der Optimierung von [[Shader]]n. Auch hier ist die Reihenfolge nicht von Bedeutung.&lt;br /&gt;
# Vermeide den Universal-Shader. Shader-Wechsel sind zwar aufwendig, aber eine gigantische if-Verzweigung die für jeden Vertex und jeden Pixel (!) ausgeführt werden muss ist noch wesentlich aufwendiger. Optimiere deinen Shader für die Aufgabe die er erfüllen muss.&lt;br /&gt;
# Vermeide aufwendige Berechnungen im Shader. Möglicherweise ist es sinnvoll komplexe Berechnungen im voraus zu berechnen und im Shader eine Lookup-Textur zu verwenden. Sofern eine komplexe Berechnung nur von Uniform-Variablen abhängig ist, ist es oft sinnvoll einfach eine weitere Uniform-Variable zu spendieren und einmal auf der CPU zu berechnen.&lt;br /&gt;
# Verwende nach Möglichkeit die in GLSL [[Tutorial_glsl#Eingebaute_Funktionen|integrierten Funktionen]]. Diese Funktionen können zum Teil wesentlich schneller sein da sie zum Teil direkt in der Hardware implementiert sind.&lt;br /&gt;
# Optimiere deine Shader so weit wie möglich. Effizienz hat hier Vorrang vor der Lesbarkeit, da die Operationen möglicherweise millionenfach pro Frame ausgeführt werden. Im Fall der Fälle dann einfach mal etwas ausführlicher kommentieren. &lt;br /&gt;
# Versuche insbesondere aufwendige Operationen wie zum Beispiel eine Wurzel zu vermeiden. Bedenke das sich solche Operationen auch in eingebauten Funktionen wie beispielsweise {{INLINE_CODE|length}}, {{INLINE_CODE|distance}} und {{INLINE_CODE|normalize}} verstecken können.&lt;br /&gt;
# Vermeide Random-Access auf Texturen. Zwei nebeneinander liegende Texel einer Textur können üblicherweise schneller aus dem Speicher geladen werden als zwei Texel an völlig unterschiedlichen Positionen in der Textur. Nutze den GPU-Cache!&lt;br /&gt;
# Versuche nicht Speicher zu sparen, indem du Variablen im Shader zusammenfasst. Beispielsweise macht eine Variable {{INLINE_CODE|vec4 positionAndSize}} wenig Sinn, wenn Position und Größe nur wenig miteinander zu tun haben und du z.B. ständig mit {{INLINE_CODE|positionAndSize.xyz}} arbeitest. Verwende lieber separate Variablen, also {{INLINE_CODE|vec3 position}} und {{INLINE_CODE|float size}}. So kann der Compiler besser optimieren.&amp;lt;br&amp;gt;Dies gilt natürlich nur für lokale Variablen im Shader. Wenn du mit dieser Methode Werte in einer Textur oder einem VBO zusammenfassen kannst, ist dies natürlich sehr sinnvoll!&lt;br /&gt;
# Es gibt diverse Tools mit denen du feststellen kannst wo genau deine Anwendung die meiste Zeit benötigt bzw. wo du optimieren solltest.&lt;br /&gt;
#* [http://developer.nvidia.com/object/nvperfkit_home.html NVIDIA PerfKit]&lt;br /&gt;
#* [http://news.developer.nvidia.com/2006/12/nvidia_perfgrap.html NVIDIA PerfGraph]&lt;br /&gt;
#* [http://developer.amd.com/gpu/shader/Pages/default.aspx AMD GPU ShaderAnalyzer]&lt;br /&gt;
#* bitte ergänzen...&lt;br /&gt;
&lt;br /&gt;
=== Quellen / Links ===&lt;br /&gt;
* [http://developer.nvidia.com/object/gpu_programming_guide.html NVIDIA GPU Programming Guide]&lt;br /&gt;
* [http://developer.amd.com/media/gpu_assets/GDC06-OpenGL_Tutorial_Day-Hart-OpenGL_03_Performance.pdf OpenGL Performance Tuning, GDC 2006]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenGL3.x_API&amp;diff=26172</id>
		<title>OpenGL3.x API</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenGL3.x_API&amp;diff=26172"/>
				<updated>2014-03-21T11:11:15Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* API Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=OpenGL3.1=&lt;br /&gt;
Hier folgend werden alle Funktionen aufgelistet, die mit OpenGL3.1 verfügbar sind.&lt;br /&gt;
==API Übersicht==&lt;br /&gt;
===Windows OpenGL Funktionen===&lt;br /&gt;
*[[wglCreateContextAttribsARB]] (Anmerkung:Diese Funktion kann nur mit einem gültigen OpenGL Context abgefragt werden und wird benötigt um ein gültigen OpenGL3 Context zu erstellen.)&lt;br /&gt;
===Error===&lt;br /&gt;
*[[glGetError]]&lt;br /&gt;
===Vertex Arrays===&lt;br /&gt;
*[[glVertexAttrib]]&lt;br /&gt;
*[[glVertexAttribPointer]]&lt;br /&gt;
*[[glEnableVertexAttribArray]]&lt;br /&gt;
*[[glDisableVertexAttribArray]]&lt;br /&gt;
*[[glEnable]]&lt;br /&gt;
*[[glDisable]]&lt;br /&gt;
*[[glPrimitiveRestartIndex]]&lt;br /&gt;
*[[glDrawArrays]]&lt;br /&gt;
*[[glMultiDrawArrays]]&lt;br /&gt;
*[[glDrawElements]]&lt;br /&gt;
*[[glMultiDrawElements]]&lt;br /&gt;
*[[glDrawRangeElements]]&lt;br /&gt;
*[[glDrawArraysInstanced]]&lt;br /&gt;
*[[glDrawElementsInstanced]]&lt;br /&gt;
===Buffer Object===&lt;br /&gt;
*[[glGenBuffers]]&lt;br /&gt;
*[[glDeleteBuffers]]&lt;br /&gt;
*[[glBindBuffer]]&lt;br /&gt;
*[[glBufferData]]&lt;br /&gt;
*[[glBufferSubData]]&lt;br /&gt;
*[[glMapBufferRange]]&lt;br /&gt;
*[[glMapBuffer]]&lt;br /&gt;
*[[glUnmapBuffer]]&lt;br /&gt;
*[[glFlushMappedBufferRange]]&lt;br /&gt;
*[[glCopyBufferSubData]]&lt;br /&gt;
===Vertex Array Object===&lt;br /&gt;
*[[glGenVertexArrays]]&lt;br /&gt;
*[[glDeleteVertexArrays]]&lt;br /&gt;
*[[glBindVertexArray]]&lt;br /&gt;
===Shader===&lt;br /&gt;
*[[glCreateShader]]&lt;br /&gt;
*[[glShaderSource]]&lt;br /&gt;
*[[glCompileShader]]&lt;br /&gt;
*[[glDeleteShader]]&lt;br /&gt;
*[[glCreateProgram]]&lt;br /&gt;
*[[glAttachShader]]&lt;br /&gt;
*[[glDetachShader]]&lt;br /&gt;
*[[glLinkProgram]]&lt;br /&gt;
*[[glUseProgram]]&lt;br /&gt;
*[[glDeleteProgram]]&lt;br /&gt;
*[[glGetActiveAttrib]]&lt;br /&gt;
*[[glGetAttribLocation]]&lt;br /&gt;
*[[glBindAttribLocation]]&lt;br /&gt;
*[[glGetUniformLocation]]&lt;br /&gt;
*[[glGetUniformBlockIndex]]&lt;br /&gt;
*[[glGetActiveUniformBlockName]]&lt;br /&gt;
*[[glGetActiveUniformBlock]]&lt;br /&gt;
*[[glGetUniformIndices]]&lt;br /&gt;
*[[glGetActiveUniformName]]&lt;br /&gt;
*[[glGetActiveUniform]]&lt;br /&gt;
*[[glUniform]]&lt;br /&gt;
*[[glUniformMatrix]]&lt;br /&gt;
*[[glBindBufferRange]]&lt;br /&gt;
*[[glBindBufferBase]]&lt;br /&gt;
*[[glUniformBlockBinding]]&lt;br /&gt;
*[[glTransformFeedbackVarings]]&lt;br /&gt;
*[[glGetTransformFeedbackVaying]]&lt;br /&gt;
*[[glValidateProgram]]&lt;br /&gt;
===Fragment Shaders===&lt;br /&gt;
*[[glBindFragDataLocation]]&lt;br /&gt;
*[[glGetFragDataLocation]]&lt;br /&gt;
===Coordinate Transformations===&lt;br /&gt;
*[[glDepthRange]]&lt;br /&gt;
*[[glViewport]]&lt;br /&gt;
===Asynchronous Queries===&lt;br /&gt;
*[[glBeginQuery]]&lt;br /&gt;
*[[glEndQuery]]&lt;br /&gt;
*[[glGenQueries]]&lt;br /&gt;
*[[glDeleteQueries]]&lt;br /&gt;
===Bedingungsabhängiges Rendern===&lt;br /&gt;
*[[glBeginConditionalRender]]&lt;br /&gt;
*[[glEndConditionalRender]]&lt;br /&gt;
===Transform Feedback===&lt;br /&gt;
*[[glBeginTransformFeedback]]&lt;br /&gt;
*[[glEndTransformFeedback]]&lt;br /&gt;
===Points===&lt;br /&gt;
*[[glPointSize]]&lt;br /&gt;
*[[glPointParameter]]&lt;br /&gt;
===Line Segments===&lt;br /&gt;
*[[glLineWidth]]&lt;br /&gt;
===Polygons===&lt;br /&gt;
*[[glFrontFace]]&lt;br /&gt;
*[[glCullFace]]&lt;br /&gt;
*[[glPolygonMode]]&lt;br /&gt;
*[[glPolygonOffset]]&lt;br /&gt;
===Pixel Rectangles===&lt;br /&gt;
*[[glPixelStore]]&lt;br /&gt;
===Texturierung===&lt;br /&gt;
*[[glActiveTexture]]&lt;br /&gt;
*[[glTexImage3D]]&lt;br /&gt;
*[[glTexImage2D]]&lt;br /&gt;
*[[glTexImage1D]]&lt;br /&gt;
*[[glCopyTexImage2D]]&lt;br /&gt;
*[[glCopyTexImage1D]]&lt;br /&gt;
*[[glTexSubImage3D]]&lt;br /&gt;
*[[glTexSubImage2D]]&lt;br /&gt;
*[[glTexSubImage1D]]&lt;br /&gt;
*[[glCopyTexSubImage3D]]&lt;br /&gt;
*[[glCopyTexSubImage2D]]&lt;br /&gt;
*[[glCopyTexSubImage1D]]&lt;br /&gt;
*[[glCompressedTexImage1D]]&lt;br /&gt;
*[[glCompressedTexImage2D]]&lt;br /&gt;
*[[glCompressedTexImage3D]]&lt;br /&gt;
*[[glCompressedTexSubImage1D]]&lt;br /&gt;
*[[glCompressedTexSubImage2D]]&lt;br /&gt;
*[[glCompressedTexSubImage3D]]&lt;br /&gt;
*[[glTexBuffer]]&lt;br /&gt;
*[[glTexParameter]]&lt;br /&gt;
*[[glGenerateMipmap]]&lt;br /&gt;
*[[glBindTexture]]&lt;br /&gt;
*[[glDeleteTextures]]&lt;br /&gt;
*[[glGenTextures]]&lt;br /&gt;
===Per-Fragment Operations===&lt;br /&gt;
*[[glScissor]]&lt;br /&gt;
*[[glSampleCoverage]]&lt;br /&gt;
*[[glStencilFunc]]&lt;br /&gt;
*[[glStencilFuncSeparate]]&lt;br /&gt;
*[[glStencilOp]]&lt;br /&gt;
*[[glStencilOpSeparate]]&lt;br /&gt;
*[[glDepthFunc]]&lt;br /&gt;
*[[glBlendEquation]]&lt;br /&gt;
*[[glBlendEquationSeparate]]&lt;br /&gt;
*[[glBlendFuncSeparate]]&lt;br /&gt;
*[[glBlendFunc]]&lt;br /&gt;
*[[glBlendColor]]&lt;br /&gt;
*[[glLogicOp]]&lt;br /&gt;
===Framebuffer Operationen===&lt;br /&gt;
*[[glDrawBuffer]]&lt;br /&gt;
*[[glDrawBuffers]]&lt;br /&gt;
*[[glColorMask]]&lt;br /&gt;
*[[glDepthMask]]&lt;br /&gt;
*[[glStencilMask]]&lt;br /&gt;
*[[glStencilMaskSeparate]]&lt;br /&gt;
*[[glClear]]&lt;br /&gt;
*[[glClearColor]]&lt;br /&gt;
*[[glClearDepth]]&lt;br /&gt;
*[[glClearStencil]]&lt;br /&gt;
*[[glClearBuffer]]&lt;br /&gt;
===Reading and Copying Pixels===&lt;br /&gt;
*[[glReadPixels]]&lt;br /&gt;
*[[glReadBuffer]]&lt;br /&gt;
*[[glClampColor]]&lt;br /&gt;
*[[glBlitFramebuffer]]&lt;br /&gt;
===Framebuffer Object===&lt;br /&gt;
*[[glBindFramebuffer]]&lt;br /&gt;
*[[glDeleteFramebuffers]]&lt;br /&gt;
*[[glGenFramebuffers]]&lt;br /&gt;
*[[glBindRenderbuffer]]&lt;br /&gt;
*[[glDeleteRenderbuffers]]&lt;br /&gt;
*[[glGenRenderbuffers]]&lt;br /&gt;
*[[glRenderbufferStorageMultisamlpe]]&lt;br /&gt;
*[[glRenderbufferStorage]]&lt;br /&gt;
*[[glFramebufferRenderbuffer]]&lt;br /&gt;
*[[glFramebufferTexture1D]]&lt;br /&gt;
*[[glFramebufferTexture2D]]&lt;br /&gt;
*[[glFramebufferTexture3D]]&lt;br /&gt;
*[[glFramebufferTextureLayer]]&lt;br /&gt;
*[[glCheckFramebufferStatus]]&lt;br /&gt;
===Spezielle Funktionen===&lt;br /&gt;
*[[glFlush]]&lt;br /&gt;
*[[glFinish]]&lt;br /&gt;
*[[glHint]]&lt;br /&gt;
===Zustand und Zustandsabfrage===&lt;br /&gt;
*[[glGetBooleanv]]&lt;br /&gt;
*[[glGetIntegerv]]&lt;br /&gt;
*[[glGetFloatv]]&lt;br /&gt;
*[[glGetDoublev]]&lt;br /&gt;
*[[glGetBooleani_v]]&lt;br /&gt;
*[[glGetIntegeri_v]]&lt;br /&gt;
*[[glIsEnabled]]&lt;br /&gt;
*[[glIsEnabledi]]&lt;br /&gt;
*[[glGetTexParameter]]&lt;br /&gt;
*[[glGetTexLevelParameter]]&lt;br /&gt;
*[[glGetTexImage]]&lt;br /&gt;
*[[glGetCompressedTexImage]]&lt;br /&gt;
*[[glIsTexture]]&lt;br /&gt;
*[[glGetString]]&lt;br /&gt;
*[[glIsQuery]]&lt;br /&gt;
*[[glGetQueryObject]]&lt;br /&gt;
*[[glIsBuffer]]&lt;br /&gt;
*[[glGetBufferParameter]]&lt;br /&gt;
*[[glGetBufferSubData]]&lt;br /&gt;
*[[glGetBufferPointer]]&lt;br /&gt;
*[[glIsVertexArray]]&lt;br /&gt;
*[[glIsShader]]&lt;br /&gt;
*[[glGetShader]]&lt;br /&gt;
*[[glIsProgram]]&lt;br /&gt;
*[[glGetProgram]]&lt;br /&gt;
*[[glGetAttachedShaders]]&lt;br /&gt;
*[[glGetShaderInfoLog]]&lt;br /&gt;
*[[glGetProgramInfoLog]]&lt;br /&gt;
*[[glGetShaderSource]]&lt;br /&gt;
*[[glGetVertexAttrib]]&lt;br /&gt;
*[[glGetVertexAttribPointer]]&lt;br /&gt;
*[[glGetUniform]]&lt;br /&gt;
*[[glIsFramebuffer]]&lt;br /&gt;
*[[glGetFramebufferAttachmentParameter]]&lt;br /&gt;
*[[glIsRenderbuffer]]&lt;br /&gt;
*[[glGetRenderbufferParameter]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Renderkontext&amp;diff=26171</id>
		<title>Renderkontext</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Renderkontext&amp;diff=26171"/>
				<updated>2014-03-19T15:24:23Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Unvollständig|Hier fehlen noch einige Angaben zur Erzeugung (v.A. unter Linux!) und Verwendung. Zudem sollte noch mal jemand drüberschauen, ob die angegebenen Informationen zu den enthaltenen Info's korrekt sind.}}&lt;br /&gt;
&lt;br /&gt;
Der [[Renderkontext]] enthält alle nötigen Informationen, die eine Zeichenfläche und die zu dieser zugeordneten Ressourcen beschreiben. Diese Informationen enthalten dabei Angaben zum verwendeten [[Pixelformat]], den Abmessungen der Zeichenfläche (Höhe, Breite, Aspekt-Ratio), sowie Angaben zur Lage der Datenpuffer für [[Farbpuffer|Farb-]], [[Schablonenpuffer|Stencil-]], [[Tiefenpuffer|Tiefen-]] und Transparenz-Informationen. Zudem enthält der Render-Kontext allgemeine Statusinformationen wie die Art und Dicke zu zeichnender Linien, die zum Zeichnen zu verwendenden Texturen sowie andere Angaben, die für das Zeichnen notwendig sind.&lt;br /&gt;
&lt;br /&gt;
== Anlegen eines Renderkontext ==&lt;br /&gt;
{{Template:Hinweis|Dieser Abschnitt beschreibt das Vorgehen unter Windows. Unter Linux können Details abweichen (Wenn jemand mit Linux mehr Erfahrung hat, wäre eine Teilung und differenziertere Beschreibung erwünscht)}}&lt;br /&gt;
&lt;br /&gt;
Um überhaupt mit OpenGL arbeiten zu können, muss zuerst einmal ein Renderkontext angelegt werden. Dabei muss man einen vorhandenen [[Gerätekontext]] (DC) zugrunde legen. Ein Renderkontext spannt sich dabei immer über den gesamten Gerätekontext und damit über den gesamten Clientbereich des Fensters oder das gesamte Speicher-Bitmap, zu dem der Gerätekontext gehört.&lt;br /&gt;
&lt;br /&gt;
Beim Anlegen werden sowohl auf der Grafikkarte als auch im RAM abhängig von den Einstellungen des Gerätekontextes ([[Pixelformat]], Höhe, Breite...) diverse Speicherbereiche reserviert, in denen später dann [[Farbpuffer|Farb-]] oder [[Tiefenpuffer]], die Informationen der Statemachine, [[Textur]]en, [[Displayliste]]n oder [[VBO]]s abgelegt werden (natürlich werden auch einige Bereiche erst später dynamisch reserviert).&lt;br /&gt;
===Beispiel===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;var&lt;br /&gt;
  DC, RC:HDC;&lt;br /&gt;
procedure TfrmMain.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  DC:=GetDC(Handle);&lt;br /&gt;
  RC:=CreateRenderingContext(DC,          //Device Contest&lt;br /&gt;
                             [opDoubleBuffered], //Optionen&lt;br /&gt;
                             32,          //ColorBits&lt;br /&gt;
                             24,          //ZBits&lt;br /&gt;
                             0,           //StencilBits&lt;br /&gt;
                             0,           //AccumBits&lt;br /&gt;
                             0,           //AuxBuffers&lt;br /&gt;
                             0);          //Layer&lt;br /&gt;
  ActivateRenderingContext(DC, RC);&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''DC''' ist der Gerätekontext an dem der Rendercontext hängt. Zum Beispiel der Kontext eines Formulars oder aber der eines Panels. Je nachdem wo später drauf gezeichnet werden soll.&lt;br /&gt;
*'''Optionen''' sind hinweise wie z.B: opDoubleBuffered. Diese Option gibt an, dass [[Doppelpufferung]] genutzt werden soll. TODO Bitte weitere Optionen bzw. Link wo man nachlesen kann.&lt;br /&gt;
*'''ColorBits''', hier 32, gibt die Farbtiefe an. 32 bedeutet, dass für die 4 Farbkanäle (Rot, Grün, Blau, Alpha(Transparenz)) jeweils 1Byte=8Bit zur Verfügung stehen. Das bedeutet für jeden Kanal können 256 Abstufungen genutzt werden. Das macht insgesamt 256^4 = ... verdammt viele!&lt;br /&gt;
*'''ZBits''', hier 24, gibt an wie viele Bits für den [[Tiefenpuffer]] reserviert werden. 24Bits bedeutet, dass Einträge von 0 bis 2^24=16,7Mio möglich sind. Je höher der Wert, desto feiner/genauer der [[Tiefentest]]. (Mehr dazu im Tiefetest-Artikel)&lt;br /&gt;
*'''StencilBits''' werden für den [[Feste_Funktionspipeline#Stencil_Test|Stencil Test]] benötigt. (Maskieren von Bildschirmteilen)&lt;br /&gt;
*'''AccumBits''' geben an, wie viele Bits im [[Akkumulationspuffer]] gespeichert werden können.&lt;br /&gt;
*'''AuxBuffer''' gibt an, wie viele Bits im Hilfspuffer gespeichert werden können.&lt;br /&gt;
*'''Layer''' gibt die Anzahl ebenen an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Problem mit erweiterungsabhängigen Pixelformaten ===&lt;br /&gt;
Ein bekanntes Problem bei der Tatsache, dass ein Renderkontext an einen Gerätekontext gebunden ist und dass man das Pixelformat eines Gerätekontextes nur ein einziges Mal festlegen kann, ist, dass man für einige Einstellungen im Pixelformat erst wissen muss, ob die passenden Erweiterungen zur Verfügung stehen. Um das zu ermitteln muss man allerdings wiederum einen Renderkontext erstellt haben.&lt;br /&gt;
&lt;br /&gt;
Um dieses Problem zu umgehen, wird häufig ein Testgerätekontext auf einem versteckten Fenster erstellt, auf dem dann ein Testrenderkontext erstellt wird, wo man die Erweiterungen abfragt.&lt;br /&gt;
&lt;br /&gt;
Diese Problematik tritt häufig bei [[Multisampling]] ([[Antialiasing]]) auf, da dies eine entsprechende Erweiterung beziehungsweise die Fähigkeit der Hardware benötigt und im Pixelformat festgelegt sein muss.&lt;br /&gt;
&lt;br /&gt;
== Einflussnahme auf den Renderkontext ==&lt;br /&gt;
Bei jedem Aufruf einer Funktion von OpenGL, die an der Art und Weise, wie etwas gezeichnet werden soll, oder die selbst etwas zeichnet, nimmt OpenGL Veränderungen an den im Renderkontext hinterlegten Angaben vor. Diese Veränderungen spiegeln dabei die auszuführende Operation (z.B. Ändern der Linienstärke beim Zeichnen mit GL_LINES) in Form einer Status-Änderung wieder (Ändern des Wertes, der die zu verwendende Linien-Breite angibt).&lt;br /&gt;
&lt;br /&gt;
=== Renderkontextübergreifende Daten ===&lt;br /&gt;
OpenGL bietet (zumindest unter Windows) mittels [[wglShareLists]] die Möglichkeit, kontextspezifische Objekte wie Texturen oder Displaylisten übergreifend über zwei Renderkontexte zu verwenden. Dies ist zum Beispiel im Falle einer Editoranwendung hilfreich, die mehrere Viewports hat, die aus technischen Gründen nicht in einem Renderkontext liegen können. Für jeden Viewport alle Texturen und VBOs beziehungsweise Displaylisten zu laden, wäre natürlich viel zu großer Aufwand. Statt dessen benutzt man etwas wie wglShareLists, um die Objekte nur einmal laden zu müssen.&lt;br /&gt;
&lt;br /&gt;
=== Das Thread-Problem ===&lt;br /&gt;
Ein Problem, auf das man im Zusammenhang mit dem Laden von Daten in den Renderkontext später eventuell treffen kann ist, dass man einen Renderkontext nur so lange verändern kann, wie man sich in demjenigen Thread befindet, in dem der Kontext erstellt wurde. Das heißt, dass man Texturen oder andere OpenGL-Objekte nicht aus einem nebenläufigen Lade-Thread heraus erstellen kann. Wohl aber kann man die Daten erstmal in den RAM laden und dann an den Hauptthread weiterreichen, der sie dann an die Grafikkarte schickt.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Tutorial_Quickstart]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Tutorial OpenGL3 Zeichenkontext]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=MipMaps&amp;diff=26170</id>
		<title>MipMaps</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=MipMaps&amp;diff=26170"/>
				<updated>2014-03-19T15:19:29Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: Rechtschreibung, Kommasetzung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mip Mapping (MIP = ''multum in parvo'' = vieles im Kleinen) ist eine Technik, welche die Darstellungsqualität von Bildern ([[Texturen]]) verbessert, wenn diese kleiner als in der ursprünglichen Größe dargestellt werden (bezogen auf die Auflösung des Bildes in Pixeln). Als angenehmer Nebeneffekt wird normalerweise auch weniger Rechenzeit benötigt, wenn ein Bild mit Hilfe von MipMaps verkleinert dargestellt wird. Dies wird jedoch durch einen vergrößerten Speicherplatzverbrauch zum Ablegen der MipMaps im Speicher (entweder Hauptspeicher oder Grafikkartenspeicher) ''erkauft''.&lt;br /&gt;
&lt;br /&gt;
Wird ein Bild ohne MipMaps verkleinert dargestellt, dann erscheint dieses Bild (besonders bei einer [[Animation]]) oft unruhig, da sich die einzelnen Pixel oft verändern. Den Effekt kann man mit Rauschen oder Krisseln beschreiben und ist in der Regel unerwünscht. Es rührt daher, dass durch die Verkleinerung ausgehend vom Originalbild die Frequenzen  der Zeilen und Spalten nicht korrekt behandelt werden.&lt;br /&gt;
&lt;br /&gt;
Soll aus den [[Texel|Texeln]] der Textur das Zielpixel berechnet werden, so wird man in der Regel mehrere Texel zur Berechnung verwenden (siehe [[bilinear|bilineares Filtern]]). Benutzt man dabei statt der original Textur eine Mipmap, so spricht man auch von [[trilinear|trilinearer Filterung]]. Man kann die Ergebnisse des trinilearen Filterns sogar noch verbessern, indem man den [[Anisotropes Filtern|anisotropen Filteralgorithmus]] verwendet.&lt;br /&gt;
Das Gegenteil zum Mipmapping ist die [[Interpolation]] bei der Vergößerung von Bildern.&lt;br /&gt;
&lt;br /&gt;
==Beispiel==&lt;br /&gt;
&lt;br /&gt;
Dies ist das Bild in der originalen Größe von 256x256 Pixeln: [[Bild:Sf256.jpg|San Francisco Skyline]]&lt;br /&gt;
&lt;br /&gt;
Soll nun dieses Bild in 64x64 Pixeln dargestellt werden, so wird normalerweise einfach nur jede vierte horizontale Zeile und jede vierte vertikale Spalte angezeigt: [[Bild:Sf64u.jpg]] Man kann erkennen, dass das Resultat sehr ''pixelig'' aussieht (Für Menschen ohne 200% Sehschärfe vielleicht mit einer Bildschirm Lupe etwas nachhelfen :-). Technisch gesprochen wurden die ''hohen Frequenzen'' des originalen Bildes nicht vor dem Verkleinern gefiltert, wodurch das Ergebnis durch [[Aliasing]] verfälscht wird.&lt;br /&gt;
&lt;br /&gt;
Beim Mipmapping werden nun verschiedene Versionen des originalen Bildes im Speicher abgelegt, welche in der Regel jeweils um den Faktor 2 verkleinert sind. Die kleineren Bilder werden dabei jeweils korrekt ''Frequenz gefiltert'' verkleinert. Die einzelnen Verkleinerungsstufen nennt man dann '''MipMaps'''. Bei unserem Beispielbild würden folgende Bilder im Speicher abgelegt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sf256.jpg]] 256x256&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sf128.jpg]] 128x128&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sf64.jpg]] 64x64&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sf32.jpg]] 32x32&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sf16.jpg]] 16x16&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sf8.jpg]] 8x8&lt;br /&gt;
&lt;br /&gt;
(sowie die Größen 4x4, 2x2 und 1x1 Pixel)&lt;br /&gt;
&lt;br /&gt;
Vergleicht man nun das Bild mit 64x64 Pixeln mit dem obigen (nicht korrekt) verkleinertem, so fällt auf, dass die zweite Version wesentlich ''glatter'' aussieht. Dies sind, wie oben erwähnt, die nicht mehr vorhandenen zu hohen Frequenzen.&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|[[Bild:Sf64u.jpg|framed|Verkleinert auf 64x64 ohne Mipmapping]] &lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|[[Bild:Sf64.jpg|framed|64x64 Mipmap]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|Man beachte die unsymetrischen Spitzen der Türme. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==OpenGL-Funktionen==&lt;br /&gt;
===Bis OpenGL 2.1 (deprecated)===&lt;br /&gt;
MipMaps können mit Hilfe der Funktion [[gluBuild1DMipmaps]] und [[gluBuild2DMipmaps]] einfach erzeugt werden, allerdings sind diese Funktionen recht langsam und man hat keinen Einfluss auf die Erstellung (und damit Qualität der MipMaps). Die MipMaps werden von der Funktion automatisch erzeugt und im Kontext der aktuellen mit [[glBindTexture]] gebundenen [[Textur]] aktiviert. Man kann die einzelnen ''Stufen'' der MipMap auch manuell erzeugen und an [[OpenGL]] übergeben, dazu ist der zweite Parameter (level) von [[glTexImage1D]], [[glTexImage2D]], [[glTexImage3D]] zu benutzen. Will man Mipmaps aus einer normalen Textur von OpenGL erzeugen lassen, kann dies durch das Setzen des &amp;quot;GENERATE_MIPMAP&amp;quot;-Flag in den Texture-Parameter vor dem Laden des Bildes mit '''glTexImage''' in den Mipmap-Level 0 geschehen. Die Veränderung des &amp;quot;Level 0&amp;quot;-Bildes, veranlasst OpenGL dann die anderen Mipmap-Level zu erzeugen/erneuern.&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);&lt;br /&gt;
glTexImage2D(GL_TEXTURE_2D, 0, ...); // Laden der Textur in den Level 0&amp;lt;/source&amp;gt;&lt;br /&gt;
Eine Generierung mittels '''[[glTexParameter]]''' und '''glTexImage''' ist '''gluBuildMipmaps''' aus Performanzgründen vorzuziehen. glTexParameter bietet weitere interessante Optionen für die Verwendung/Beeinflussung von Mipmaps.&lt;br /&gt;
&lt;br /&gt;
===OpenGL 3.0 und neuer===&lt;br /&gt;
In OpenGL3 ruft man, nachdem man die &amp;quot;Level 0&amp;quot;-Texturdaten mittels [[glTexImage]] hochgeladen hat, die Funktion [[glGenerateMipmap]] auf. Wichtig ist außerdem, die Nutzung der damit generierten MipMaps zu aktivieren:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // letzter Parameter für trilineare Filterung&amp;lt;/source&amp;gt;&lt;br /&gt;
Für den letzten Parameter kann man dabei auch jede andere Konstante nehmen, die den String &amp;quot;MIPMAP&amp;quot; im Namen trägt.&lt;br /&gt;
&lt;br /&gt;
===Vorberechnete MipMaps===&lt;br /&gt;
Eine performante Alternative ist es, ein Texturformat zu verwenden, das MipMaps direkt mitspeichert, wie es z.B. bei [[DDS]] der Fall ist. Dort werden die MipMaps beim Export aus dem Bildbearbeitungsprogramm in der Datei abgelegt (sofern man das wünscht) und man kann Einfluss auf deren Generation nehmen (wie sie gefiltert werden, wie viele Stufen abgelegt werden, alternativ kann man die MipMap-Stufen sogar selbst erstellen). Die MipMaps werden dann in der eigenen Anwendung direkt aus der Datei mitgeladen. Diese Methode ist flexibler und vor allem beim Laden sehr viel schneller.&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Texturesynthesis&amp;diff=26169</id>
		<title>Texturesynthesis</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Texturesynthesis&amp;diff=26169"/>
				<updated>2014-03-19T15:12:21Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Was ist Texturesynthesis? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was ist Texturesynthesis? ==&lt;br /&gt;
Häufig steht man vor dem Problem, dass man zwar in Textursammlung XY eine vom Prinzip her schöne [[Textur]] gefunden hat, diese jedoch aus diversen Gründen nicht sinnvoll nutzbar ist. Ein paar Beispiele:&lt;br /&gt;
* Die Textur ist zu klein. Würde man die Textur kacheln, sähe man dies sofort.&lt;br /&gt;
* Die Textur ist ein Foto und daher gar nicht kachelbar.&lt;br /&gt;
* Die Textur hat einige kleinere Stellen die &amp;quot;doof&amp;quot; aussehen. Beispielsweise größere Schatten in einer Fototextur können merkwürdig aussehen, wenn das Licht in der Szene nicht aus der entsprechenden Richtung kommt. Gleiches gilt für besonders auffällige Elemente deren Wiederholung man sofort sehen würde.&lt;br /&gt;
Sofern es sich um eine Textur mit nur lokaler Struktur handelt und man etwas Rechenleistung investiert, kann man diese Mängel ohne Verlust an Qualität beheben!&lt;br /&gt;
&lt;br /&gt;
Texturesynthesis ist die Wissenschaft, die sich damit beschäftigt die grundlegende Struktur einer Textur weiterzuführen, OHNE Wiederholungen zu erzeugen. Der Standardalgorithmus beginnt mit einer Zufallstextur mit RGB-rauschen. Nun wird die Textur Pixel für Pixel durchlaufen und jeweils der Pixel aus der Inputtextur gewählt, dessen lokale Nachbarschaft best-möglich zum aktuellen Pixel passt.&lt;br /&gt;
&lt;br /&gt;
Das ganze klappt nicht bei jeder Textur, erfordert etwas Rechenleistung, aber prinzipiell kann man aus einer kleinen Quelltextur beliebig große, kachelbare Texturen erzeugen! Ebenfalls ist es möglich, nur Teilbereiche einer Textur neu zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
{{Hinweis|Dank freundlicher Genehmigung von [http://www.cgtextures.com/ cgtextures.com] kann ich hier einige Beispiele präsentieren. Die folgenden Beispiel-Texturen unterliegen wie das gesamte Wiki der [http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License 1.2]. Dies gilt jedoch '''ausschließlich''' für die Texturen in diesem Artikel. Texturen die von [http://www.cgtextures.com/ cgtextures.com] heruntergeladen werden sind urheberrechtlich geschützt und unterliegen '''nicht''' dieser Lizenz!}}&lt;br /&gt;
&lt;br /&gt;
Das erste Beispiel wurde mit dem Programm [[#MRFsynthesis|MRFsynthesis]] erstellt. Die Input-Textur ist links zu sehen. In der Masken-Textur rechts sind unerwünschte Bereiche mit schwarz (RGB: 0,0,0) übermalt. Die Textur hatte eine Originalgröße von 1600x1200 und wurde vor Anwendung des Tools auf 683x512 herunter skaliert.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Rock-input.jpg]] [[Bild:Rock-mask.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
Als Output bekommt man diese kachelbare Textur. Sie hat im Original eine Auflösung von 1300x1300.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Rock-output.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel mit einer anderen Texturart. Auch dieses Beispiel wurde mit MRFsynthesis erzeugt. Die Schwierigkeit liegt hier darin, dass der Algorithmus nicht weiß was eine Pflanze ist, geschweige denn, wie eine Pflanze auszusehen hat. Die Masken Textur wurde etwas aufgehellt, da die Risse in der Erde sehr dunkel sind und sonst möglicherweise ausgeschlossen würden.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Earth-input.jpg]] [[Bild:Earth-mask.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Qualität der Erd-Risse in der Outputtextur ist sehr gut. Insbesondere in der Originalauflösung (roter Kasten) sieht man den hohen Detailgrad. Die Pflanzen sehen allerdings leicht abgewetzt aus, da sie zum Teil nur aus einem einzigen Blatt bestehen.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Earth-output.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel demostriert die Fähigkeiten des Algorithmus auch &amp;quot;doofe&amp;quot; Stellen aus einem Bild zu entfernen ohne das Bild vollständig neu zu konstruieren. Wen blöde Stromleitungen auf Urlaubsbildern nerven, dem kann geholfen werden. Das Bild wurde mit dem [http://de.wikipedia.org/wiki/GIMP GIMP]-Plugin [[#Resynthesizer|Resynthesizer]] bearbeitet.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Gardasee-in.jpg]] [[Bild:Gardasee-mask.jpg]] [[Bild:Gardasee-out.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tools == &lt;br /&gt;
Es gibt viele verschiedene Tools die diese Technik beherrschen. Im folgenden werden einige davon vorgestellt. Es gibt aber sicher noch mehr, einfach mal googlen.&lt;br /&gt;
&lt;br /&gt;
=== MRFsynthesis ===&lt;br /&gt;
Das Tool hat den klangvollen Namen ''&amp;quot;Semi Causal Nonparametric Markov Random Field Texture Synthesis&amp;quot;'', oder kurz ''&amp;quot;MRFsynthesis&amp;quot;''. Es gibt kein Binary, aber der [http://www.texturesynthesis.com/texture.htm Quellcode ist hier verfügbar]. In den einzelnen Quellcodedateien findet sich ein Lizenztext als Kommentar. Die mit MRFsynthesis erzeugten Texturen dürfen für beliebige Zwecke eingesetzt werden, also insbesondere auch kommerziell. Das Tool selbst ist kostenlos verfügbar und darf auch verändert werden. Es darf jedoch nicht kommerziell verbreitet werden.&lt;br /&gt;
&lt;br /&gt;
Vermutlich, da der Code aus dem Jahr 2002 stammt, muss man leider etwas am Quellcode fummeln bis aktuelle Compiler den Code akzeptieren. Sollte aber ziemlich offensichtlich sein, in ''Option.h'' musste ich ein ''using namespace std;'' hinzufügen und in ''nr.h'' zweimal eine ungenutzte Funktion ''fmin'' auskommentieren. Ich nutze Fedora 10 Linux mit gcc 4.3.2 und kann daher nichts darüber sagen, ob es möglich ist das ganze unter Windows zum laufen zu bringen.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist leider nicht für Mehrkern-CPUs geschrieben, man kann aber einfach für jeden Kern das Programm einmal starten. Man muss sowieso immer etwas an den Parametern spielen, bis man ein sinnvolles Ergebnis erhält. Je nach verwendetem Algorithmus und Größe der Textur kann das ganze durchaus ein paar Stunden dauern. Die Texturgröße geht stark in die Laufzeit ein, im Vergleich zum [[#Resynthesizer|Resynthesizer]] ist das Programm ziemlich langsam.&lt;br /&gt;
&lt;br /&gt;
Als Inputdatei sollte man ein PNG wählen. Zum einen geht so keine Qualität verloren, zum anderen produziert das Programm aus irgendeinem Grund beim speichern von JPG Dateien einen schwarzen Balken am oberen Bildrand. Wenn man Probleme mit Rauschen im Ergebnis hat, kann man die Ausgabeauflösung etwas höher wählen und nachher das Bild herunter skalieren.&lt;br /&gt;
&lt;br /&gt;
====Algorithmen====&lt;br /&gt;
MRFsynthesis implementiert verschiedene Variationen des Algorithmus. Die Unterschiede sind in der beiliegenden Readme beschrieben, verstehen tut man diese vermutlich aber nur nach der Lektüre des Papers, welches ich nicht gelesen habe. &lt;br /&gt;
*'''nonparaMRF''' : der Standardalgorithmus?&lt;br /&gt;
*'''nonparaMRF_fast''' : eine schnellere Version die einen QuadTree (?) verwendet&lt;br /&gt;
*'''nonparaMRF_fast_k''' : eine 2D-Variante von ''nonparaMRF_fast'', was immer das bedeutet...&lt;br /&gt;
*'''nonparaMRF_gaussian_k''' : verwendet eine &amp;quot;Gaussian pyramid&amp;quot; als Suchalgorithmus&lt;br /&gt;
Es hängt wahrscheinlich von der Quelltextur ab welcher Algorithmus sich am besten eignet. Einfach ausprobieren...&lt;br /&gt;
&lt;br /&gt;
====Parameter====&lt;br /&gt;
Ein Beispielaufruf sieht so aus:&lt;br /&gt;
 nonparaMRF_fast -n 2 -square -cyclic -x 1300 -y 1300 texinput1.png&lt;br /&gt;
&lt;br /&gt;
Der Parameter '''-n''' ist der wichtigste, er gibt den Radius an in dem die Pixel verglichen werden. Möglich sind 1,2,3 und 4. Ein größerer Wert erfordert mehr Rechenleistung. Es hängt aber von der Struktur der Textur ab, ob man auch ein schöneres Ergebnis erhält. Man sollte mal 2 und 3 probieren. Der Parameter '''-square''' bewirkt das statt der üblichen 2-norm die Maximumdistanz verwendet wird. Was das heißt sieht man am besten auf dem folgenden Bild:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:neighbourhood.png]]&lt;br /&gt;
&lt;br /&gt;
Der Parameter '''-cyclic''' bewirkt das die Textur kachelbar wird. Mit '''-x''' und '''-y''' gibt man die Größe der Outputtextur an.&lt;br /&gt;
&lt;br /&gt;
Praktisch ist ebenfalls der '''-m''' Parameter. Damit kann man &amp;quot;doofe&amp;quot; Stellen in der Inputtextur ausblenden. Einfach die Quelltextur nehmen und mit schwarzer Farbe alles ausradieren was nicht gefällt. Alle Pixel die Farbe RGB 0,0,0 haben werden ignoriert. Sollten sich erwünschte Pixel mit dieser Farbe in der Textur befinden, sollte man vorher die Helligkeit der Masken-Textur erhöhen, z.B. indem man einen dunklen Grauwert aufaddiert. Auf das Ergebnis hat dies keinen Einfluss, da die eigentlichen Farbwerte aus der Inputtextur kommen.&lt;br /&gt;
&lt;br /&gt;
Weitere Parameter sind in der beliegenden Readme beschrieben.&lt;br /&gt;
&lt;br /&gt;
Für das erste Beispiel (siehe oben) habe ich die folgenden Parameter benutzt:&lt;br /&gt;
 nonparaMRF_fast -n 2 -square -cyclic -x 1300 -y 1300 -m rock_mask.png rock_input.png&lt;br /&gt;
Das zweite Beispiel wurde mit folgender Befehlszeile berechnet:&lt;br /&gt;
 nonparaMRF_fast -n 3 -square -cyclic -x 1300 -y 1300 -m earth_mask.png earth_input.png&lt;br /&gt;
Die Rechenzeit betrug auf meinem Intel Core 2 Quad Q9300 jeweils etwa 2-3 Stunden. Allerdings wurde natürlich nur ein Core genutzt und die CPU läuft bei mir zudem auf 2.0 GHz statt 2.5 GHz.&lt;br /&gt;
&lt;br /&gt;
=== Resynthesizer ===&lt;br /&gt;
Der [http://www.logarithmic.net/pfh/resynthesizer Resynthesizer] ist ein Plugin für das beliebte Grafikprogramm [http://de.wikipedia.org/wiki/GIMP GIMP]. Sowohl GIMP als auch das Plugin sind freie Software, also insbesondere kostenlos und auch kommerziell nutzbar.&lt;br /&gt;
&lt;br /&gt;
Von der Qualität her ist das Plugin mit [[#MRFsynthesis|MRFsynthesis]] vergleichbar. Durch die Integration in GIMP ist die Bedienung deutlich einfacher als über die Kommandozeile. Zudem hat Resynthesizer mehr Features und ist darüberhinaus wesentlich schneller. Da die Laufzeit weniger abhängig von der Texturgröße ist kann man mit wesentlich höheren Auflösungen arbeiten.&lt;br /&gt;
&lt;br /&gt;
Auch der Resynthesizer setzt nur einen CPU-core ein und bei entsprechend hohen Auflösungen lohnt es sich mehrere Texturen gleichzeitig zu generieren. Wenn man es geschickt anstellt kann es auch sinnvoll sein mehrere Texturen zu generieren und dann nachträglich zusammenzufügen. Dies dürfte sich aber erst bei richtig hohen Auflösungen jenseits von 4096x4096 lohnen.&lt;br /&gt;
&lt;br /&gt;
Die Bedienung ist recht simpel. Zunächst lädt man die gewünschte Quelltextur in GIMP und markiert dort alle Bereiche die man nicht für die Textur Generierung verwenden möchte. Man sollte daran denken, dass man die Kantenglättung der Markierung ausschaltet. Dann erstellt man ein neues Bild mit der gewünschten Auflösung und wählt im Menü &lt;br /&gt;
:&amp;lt;tt&amp;gt;Filter -&amp;gt; Abbilden -&amp;gt; Resynthesize...&amp;lt;/tt&amp;gt;&lt;br /&gt;
Daraufhin öffnet sich das folgende Fenster. &lt;br /&gt;
&lt;br /&gt;
[[Bild:resyn-options.jpg]]&lt;br /&gt;
&lt;br /&gt;
Oben kann man die Texturquelle angeben, wir können aus den gerade mit GIMP geöffneten Bilddateien auswählen. Insbesondere kann auch die Quelle mit dem Ziel identisch sein. Die Haken bezüglich horizontalem und vertikalem Tiling sollten klar sein. Ist in der Zieltextur ein Bereich markiert, so bewirkt ein Haken bei ''&amp;quot;Fit output to bordering pixels&amp;quot;'', dass die neu erzeugte Textur nahtlos in den bereits bestehenden Bereich übergeht. Auch hier sollte man daran denken, dass man die Kantenglättung der Markierung ausschaltet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:resyn-tweaks.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier kann man einige Parameter des Algorithmus beeinflussen. Es hängt von der Quelltextur ab welche Einstellung hier gut ist. Die Standardeinstellung erzeugt aber meistens bereits gute Resultate.&lt;br /&gt;
&lt;br /&gt;
Das Plugin fügt auch noch ein paar Skripte zu GIMP hinzu die man mal austesten sollte:&lt;br /&gt;
:&amp;lt;tt&amp;gt;Script-Fu -&amp;gt; Enhance -&amp;gt; Smart enlarge&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Bild skalieren ohne Schärfe zu verlieren&lt;br /&gt;
:&amp;lt;tt&amp;gt;Script-Fu -&amp;gt; Enhance -&amp;gt; Smart sharpen&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Bild schärfen unter Einsatz von Textursynthese&lt;br /&gt;
:&amp;lt;tt&amp;gt;Script-Fu -&amp;gt; Enhance -&amp;gt; Smart remove selection&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: ersetzt den markierten Bereich durch eine synthetische Textur&lt;br /&gt;
&lt;br /&gt;
== Perspektivenkorrektur ==&lt;br /&gt;
Als Abschluss möchte ich noch erwähnen, dass es mittlerweile auch eine stark verbesserte Implementierung des [http://www.graphics.rwth-aachen.de/ Lehrstuhls Informatik 8] der [http://www.rwth-aachen.de/ RWTH Aachen] die unter anderem eine Perspektivenkorrektur einsetzt. Dies ermöglicht es zu einem gewissen Grad auch die globale Struktur zu erhalten bzw. fortzusetzen. Zum Beispiel kann man das Colosseum in Rom virtuell wieder aufbauen. [http://www.graphics.rwth-aachen.de/index.php?id=33 Bilder und ein Video gibts hier]. Insbesondere das Bild des Aachener Rathauses ist heftig!&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_OpenGL3&amp;diff=26167</id>
		<title>Tutorial OpenGL3</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_OpenGL3&amp;diff=26167"/>
				<updated>2014-03-09T11:06:48Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Übersichten */ Kategorie hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Vorwort=&lt;br /&gt;
Willkommen zur Einführung in OpenGL3.x.&lt;br /&gt;
Im Rahmen dieses Artikels werde ich versuchen, die Grundlagen für die Nutzung von OpenGL3 zu legen und durch Pseudocode die Verwendung von der [[OpenGL3.x_API|API]] aufzeigen. Mit OpenGL Version 3 hat sich vieles im Vergleich zu den Vorversionen verändert und entsprechend ist der Umstieg von OpenGL1-2 auf 3 sehr zeitaufwändig. Diese Artikelreihe richtet sich mehr an Anfänger als an Programmierer, die von der Vorversion umsteigen wollen.&lt;br /&gt;
&lt;br /&gt;
==OpenGL3 und die Vorgeschichte==&lt;br /&gt;
OpenGL ist viele Jahre alt und entsprechend gab es immer wieder neue Versionen und Änderungen. Doch entfernte sich OpenGL mit der Zeit vom aktuellen Stand der Technik und veraltete immer mehr. Die API wurde größer und größer, alte nicht mehr gebrauchte Funktionen wurden aus Kompatibilitätsgründen nicht entfernt und die Treiber wuchsen zu riesigen und komplexen Codewerken. Darunter hat entsprechend die Leistung und Qualität stark gelitten. Es musste ein radikaler Schnitt gemacht werden und man beschloss, dies mit OpenGL Version 3 zu tun. So hat man sämtlichen Ballast von früher rausgestrichen und eine Hand voll neuer Funktionen hinzugefügt. &lt;br /&gt;
&lt;br /&gt;
Um die Umstellung für Software leichter zu machen, beschloss man, zwei verschiedene Profile zu unterstützen. Das erste Profil ist ein OpenGL3-fähiger Grafikkontext, welcher auch die alten Befehle ausführen kann und somit die Umstellung schrittweise ermöglicht. Das zweite Profil ist ein OpenGL3-fähiger Grafikkontext, welcher nur die als nicht veraltet (deprecated) makierten Funktionen ausführen kann und für neue Software gedacht ist. Sollte man mit dem zweiten Profil arbeiten und ruft dennoch eine alte Funktion auf, dann wirft diese ein Fehler und wird nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Mit den neuen Fähigkeiten der Grafikkarten entstanden parallel zu den OpenGL-Versionen auch Updates der Shadersprache GLSL. OpenGL verwendet Shader, um die Darstellung von 3D Modellen manipulieren zu können. So hat man anfangs mit Assembler ähnlichen Code und später mit C ähnlichen Code Mini-Programme geschrieben, welche auf dem Grafikprozessor lauffähig waren. Man hatte zwischen Vertex- und Fragment-Shadern/Programmen unterschieden. Mit dem Shader Model 4 kam eine weitere Shader-Kategorie hinzu, und zwar der Geometry-Shader. Während der Vertexshader einzelne Punkte eines Drahtgitters manipulieren konnte, hat der Fragment-Shader das Ausfüllen des Drahtgitters übernommen (shading) und die Geometry-Shader erlauben die Manipulation des Drahtgitters. Während Shader in OpenGL1-2 nicht notwendig waren, kann man in OpenGL3 nicht ohne auskommen, da ein Vertex-/Fragment-Shader zum Zeichnen benötigt wird. &lt;br /&gt;
&lt;br /&gt;
Ein sehr beliebtes Werkzeug in OpenGL1-2, war der Immediate Mode, welcher das sehr einfache Zeichnen von 3D Daten erlaubte. Dieser wurde durch ein [[glBegin]] eingeleitet, ein glEnd beendet und alles was dazwischen stand wurde gezeichnet. Dies hatte allerdings auch seinen Preis: So war der Treibercode dadurch enorm komplexer geworden und es mussten aufgrund der vielen möglichen Variationen(gesetzte Flags) viele Prüfungen durchgeführt werden, um einen gültigen Rendercode zu erzeugen. Dieser wurde ebenfalls in OpenGL3 gestrichen und man muss nun sogenannte Vertex Buffer Objects (untermenge von Buffer Objects) verwenden. Diese haben den Vorteil, dass sie wesentlich schneller und ebenfalls recht einfach zu bedienen sind.&lt;br /&gt;
&lt;br /&gt;
In OpenGL1-2 war es möglich, die Modelview- und Projection-Matrizen durch bestimmte API-Befehle zu manipulieren. Die Modelview-Matrix hat die Position eines Objektes so manipuliert, dass es den gewollten Platz in der 3D Welt eingenommen hat und die Projection-Matrix hat dann die 3D Weltkoordinaten auf 2D Bildschirmkoordinaten transformiert. Mit OpenGL3 sind ist diese Möglichkeit entfernt worden, da nun der Vertexshader diese Arbeit übernommen hat und diese Funktionalität mehr in den Anwendercode als in die Bibliothek gehört.&lt;br /&gt;
&lt;br /&gt;
Die letzten 3 angesprochenen Punkte (Shader, Immediate Mode und Matrizen) haben großen Einfluss auf den Basis-Quellcode einer OpenGL3-Anwendung. Dieser fällt größer und umfangreicher aus, als ein Basis-Code für OpenGL1-2, wird aber später kaum größer aufgrund der Schlankheit der neuen API.&lt;br /&gt;
&lt;br /&gt;
==Inhaltsverzeichnis==&lt;br /&gt;
===Grundlagen===&lt;br /&gt;
Artikel in diesem Bereich sind für OpenGL wichtig aber haben nicht direkt mit OpenGL zu tun.&lt;br /&gt;
&lt;br /&gt;
Man kann diese Artikel überspringen und später bei aufkommenden Fragen in diese hinein lesen.&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_Lineare_Algebra|Lineare Algebra]]&lt;br /&gt;
===Artikelreihe===&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Vorschau auf das kommende]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_Zeichenkontext|Erstellen eines Grafik Kontext]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_Das_Objekt_System_von_OpenGL3|Das Objekt System von OpenGL3]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Vertex Buffer Object]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Verfügbare Geometrie]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|GLSLang]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Geometryshader]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Transform Feedback]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Texturen]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Frame Buffer Object]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_Scissor_Clipping_DepthTest|Clipping/Scissor/Tiefen-Test]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Instancing]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Oclussion Query]]&lt;br /&gt;
&lt;br /&gt;
[[Tutorial_OpenGL3_dead|Conditional Rendering]]&lt;br /&gt;
&lt;br /&gt;
===Übersichten===&lt;br /&gt;
[[OpenGL3.x_API|OpenGL3-Funktionen nacht Kategorie sortiert]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[OpenGL3-Funktionsübersicht|OpenGL3-Funktionen alphabetisch sortiert]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|OpenGL3]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_OpenGL3_Zeichenkontext&amp;diff=26166</id>
		<title>Tutorial OpenGL3 Zeichenkontext</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_OpenGL3_Zeichenkontext&amp;diff=26166"/>
				<updated>2014-03-09T11:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Erstellung eines OpenGL3.x GC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Der Grafikcontext==&lt;br /&gt;
Der Grafikcontext (GC) ist die Basis von OpenGL, man kann mehrere GCs in einem Prozess haben, was aber selten Sinn macht.&lt;br /&gt;
Im GC werden alle notwendigen Informationen gehalten, um mit der GPU zu arbeiten. Dabei werden Identifier (ID) verwendet, um Resourcen nach außen verfügbar zu machen. Zu solchen Ressourcen gehören z.B. Texturen, Shader, diverse Buffer Objects und alle werden durch IDs zur Verfügung gestellt.&lt;br /&gt;
Neben den ID-Listen werden noch sogenannte States, Informationen für die Bildausgabe und diverse unbekannte treiberspezifische Daten gespeichert.&lt;br /&gt;
&lt;br /&gt;
===Profil===&lt;br /&gt;
Um die einzelnen Befehlssätze zu verwalten, hat man sogenannte Profile eingeführt.&lt;br /&gt;
OpenGL3 ist z.B. ein Profil, es gibt noch weitere wie z.B. OpenGL3.1 oder OpenGL3.1 Debug.&lt;br /&gt;
Die Profile werden vom ARB festgelegt und es gibt in der Regel 2 Versionen: Einmal mit Funktionen, die als &amp;quot;deprecated&amp;quot; eingestuft wurden, und einmal ohne diese.&lt;br /&gt;
&lt;br /&gt;
===Forward compatible context und Full context===&lt;br /&gt;
Es gibt 2 Varianten eines Context, der ''Full context'' enthält alle Funktionen, auch die als deprecated markierten. Der ''Forward compatible context'' enthält nur die nicht als deprecated markierten Funktionen des OpenGL-Kerns. Bis zur Version 3.1 gab es immer eine Abwärtskompatibilität und der Treiber hatte entschieden, welche OpenGL-Version verwendet werden darf. Mit OpenGL 3.1 gibt es keine Abwärtskompatibilität mehr und man kann festlegen, was für einen GC man haben möchte.&lt;br /&gt;
&lt;br /&gt;
===Verwaltung der veralteten und neuen Funktionen===&lt;br /&gt;
Das Hinzukommen und das Entfernen von OpenGL-Funktionen unterliegt dem Deprecation- und Extension-Mechanismus.&lt;br /&gt;
Diese funktionieren wie folgt.&lt;br /&gt;
&lt;br /&gt;
'''Deprecation Path''': Core-&amp;gt;ARB-&amp;gt;Vendor/Extension&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird erst aus den Bereich der Kernfunktionen entfernt und als ARB zur Verfügung gestellt.&lt;br /&gt;
Dann wird sie aus dem ARB entfernt und als Vendor oder Extension weiter geführt.&lt;br /&gt;
Der Kern wird von der Khronos Group verwaltet, das ARB wird von einer Gruppe bestehend aus AMD/ATI, Nvidia, SGI, Sun, Intel, IBM, Apple, 3DLabs und einigen weiteren zusammen verwaltet und Vendor sowie Extension werden von Firmen wie AMD, Nvidia, SIS und so weiter einzeln verwaltet.&lt;br /&gt;
&lt;br /&gt;
'''Extension Path''': Vendor/Extension-&amp;gt;ARB-&amp;gt;Core&lt;br /&gt;
&lt;br /&gt;
Wenn eine Extension von einer Firma, vom ARB als sinnvoll angesehen wird, dann wird diese mit aufgenommen.&lt;br /&gt;
Funktionen, die vom ARB aufgenommen wurden, werden in der Regel mit der kommenden OpenGL-Version in den Kern aufgenommen.&lt;br /&gt;
&lt;br /&gt;
OpenGL3 macht regen Gebrauch von diesen Mechanismen, da viele Kernfunktionen als deprecated markiert wurden und nun über die einzelnen Updates aus dem Kern verschwinden. Da sich der Stand der Technik weiterentwickelt kommen natürlich auch neue Funktionalitäten hinzu, so z.B. [[Transform-Feedback]], [[Instancing]] oder GLSlang 1.4.&lt;br /&gt;
&lt;br /&gt;
=Der erste Schritt (OpenGL Context)=&lt;br /&gt;
Als erstes wird ein Fenster benötigt, um an dieses unseren GC zu binden. Ich will nicht näher auf die Erstellung eines Fensters eingehen, da dies nicht das Thema dieses Artikels ist und verweise auf den Democode am Ende des Artikels. Sobald das Fenster erstellt ist, können wir uns darum kümmern, einen passenden GC zu erstellen. Hierzu brauchen wir erstmal Informationen vom Desktop Manager, welche Möglichkeiten wir überhaupt zur Auswahl haben. Es wird ein [[Doppelpufferung|Double Buffer]] benötigt und man muss die Farbtiefe sowie Genauigkeit des [[Tiefenpuffer]]s festlegen. Dies wird von den Desktop Managern unterschiedlich gehandhabt, so hat Windows z.B. ein DeviceContext und ein Pixelformat und X11 nennt dies VisualInfo bzw. GLXFBConfig.&lt;br /&gt;
Ist dieser Schritt getan, kann man nun einen alten OpenGL Context erstellen, prüfen ob die ARB Funktion vorhanden ist und dann versuchen einen OpenGL3.x Context zu erstellen.&lt;br /&gt;
&lt;br /&gt;
==Erstellung eines OpenGL3.x GC==&lt;br /&gt;
Um einen GC ertellen zu können, wird eine weitere API benötigt, welche plattformabhängig und durch wgl[Funktionsname]/glX[Funktionsname] erkennbar ist. Mit diesen Befehlen kann man mit dem Windows und X11 Desktop Manager zusammenarbeiten. So werden Funktionen für das Erstellen, Wechseln, Zerstören eines GC, Laden von Extensions, Wechseln des Fensterpuffers und Synchronisieren von CPU und GPU ermöglicht. Bisher gibt es noch keine Möglichkeit, einen OpenGL3-fähigen GC zu erstellen, ohne dafür eine Funktion vom ARB zu verwenden. Der Nachteil von ARB-Funktionen ist, dass man einen gültigen GC benötigt, um den Zeiger auf diese zu erhalten. Um einen OpenGL 3.0 oder 3.1 GC zu erstellen, benötigt man einen OpenGL1-2 GC und die Kernfunktion [[wglGetProcAddress]]/[[glxGetProcAddress]]. Einen gültigen OpenGL1 bzw. OpenGL2 GC bekommt man über den Befehl [[wglCreateContext]]/[[glxCreateContext]] und zwischen mehreren GC kann man mit dem Befehl [[wglMakeCurrent]]/[[glxMakeCurrent]] wechseln.&lt;br /&gt;
Der Befehl für die Erstellung eines OpenGL3-fähigen GC heißt [[wglCreateContextAttribsARB]]/[[glxCreateContextAttribsARB]].&lt;br /&gt;
Mit OpenGL3.2 soll eine Funktion in den OpenGL-Kern kommen, welcher es erlaubt einen OpenGL3 und aufwärts fähigen GC zu erstellen, ohne einen älteren GC vorher zu erstellen. Dies wird erreicht, indem man die noch jetzige ARB Funktion in den OpenGL-Kern mit aufnimmt und somit das Erfragen der ARB Funktion, über ein OpenGL1-2GC, unnötig macht.&lt;br /&gt;
&lt;br /&gt;
'''Windows'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void CreateOpenGL3Context()&lt;br /&gt;
{&lt;br /&gt;
  HGLRC TempContext=wglCreateContext(DeviceContext);//erstellt ein alten OpenGL Context&lt;br /&gt;
  if (TempContext==NULL)&lt;br /&gt;
  {&lt;br /&gt;
    cerr&amp;lt;&amp;lt;&amp;quot;Error: Could not create an OpenGL rendering context&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
    return;//beenden&lt;br /&gt;
  }&lt;br /&gt;
  wglMakeCurrent(DeviceContext,TempContext);//setzt den erstellten GC als aktuellen GC&lt;br /&gt;
&lt;br /&gt;
  //Typdefinition von wglCreateContextAttribsARB&lt;br /&gt;
  typedef HGLRC (APIENTRY * PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int *attribList);&lt;br /&gt;
&lt;br /&gt;
  PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL;&lt;br /&gt;
&lt;br /&gt;
  //abfragen, ob die Funktion existiert&lt;br /&gt;
  wglCreateContextAttribsARB=(PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress(&amp;quot;wglCreateContextAttribsARB&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if(wglCreateContextAttribsARB == NULL)//wenn es diese Funktion nicht gibt, dann hat der --&amp;gt;Treiber&amp;lt;-- keinen OpenGL3 support&lt;br /&gt;
  {&lt;br /&gt;
    wglDeleteContext(TempContext);&lt;br /&gt;
    cerr&amp;lt;&amp;lt;&amp;quot;Error: There is no OpenGL3 context support.&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int attribs[]={WGL_CONTEXT_MAJOR_VERSION_ARB,3,WGL_CONTEXT_MINOR_VERSION_ARB,1,WGL_CONTEXT_FLAGS_ARB,WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,0};&lt;br /&gt;
&lt;br /&gt;
  if (!(Context=wglCreateContextAttribsARB(DeviceContext,0, attribs)))//versuche ein OpenGL3.1 fähigen Context zu erstellen&lt;br /&gt;
  {&lt;br /&gt;
    //Entweder hat der Treiber noch keinen OpenGL3.1 support oder die Grafikkarte beherrscht kein OpenGL3.1.&lt;br /&gt;
    cerr&amp;lt;&amp;lt;&amp;quot;Error: Couldn't create OpenGL3.1 context. Try now OpenGL3.0 context&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
    return;&lt;br /&gt;
  &lt;br /&gt;
    attribs[3]=0;//Setze minor version auf 0 um ein OpenGL3.0 context zu erstellen.&lt;br /&gt;
    if (!(Context=wglCreateContextAttribsARB(Win-&amp;gt;GetDeviceContext(),0, attribs)))&lt;br /&gt;
    {&lt;br /&gt;
      //Die --&amp;gt;Grafikkarte&amp;lt;-- beherrscht kein OpenGL3.&lt;br /&gt;
      wglDeleteContext(TempContext);//aufräumen und beenden&lt;br /&gt;
      cerr&amp;lt;&amp;lt;&amp;quot;Error: Couldn't create OpenGL3 context.&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  wglMakeCurrent(DeviceContext,Context);//wechsel auf den OpenGL3.x context&lt;br /&gt;
  wglDeleteContext(TempContext);//Zerstöre den temporären Context, denn er wird nicht länger benötigt.&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mac OS erlaubt die nachträgliche Installation von X11 und kann somit über den folgenden Code ebenfalls einen OpenGL Context erstellen. Alternativ bietet Mac OS mehrere OpenGL Schnittstellen, welche sich in der Einfachheit der API unterscheiden. Wenn man nicht den Nutzer zwingen will X11 zu installieren, dann sollte man zu den entsprechenden Schnittstellen AGL, CGL oder NSOpenGL greifen.&lt;br /&gt;
&lt;br /&gt;
'''X11(Linux/Mac OS)'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;  bool OpenGLWindow::CreateOpenGL3Context()&lt;br /&gt;
  {&lt;br /&gt;
    GLXContext TempContext=glXCreateContext(m_Display,m_VisualInfo,0,GL_TRUE);//erstellt ein alten OpenGL Context&lt;br /&gt;
    if(TempContext==0)&lt;br /&gt;
    {&lt;br /&gt;
      cerr&amp;lt;&amp;lt;&amp;quot;Error: Could not create an OpenGL rendering context.&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    glXMakeCurrent(m_Display,m_Window,TempContext);&lt;br /&gt;
&lt;br /&gt;
    //Typdefinition von wglCreateContextAttribsARB&lt;br /&gt;
    typedef GLXContext (* GLXCREATECONTEXTATTRIBSARBPROC)(Display *dpy,GLXFBConfig config,GLXContext share_context,Bool direct,const int *attrib_list);&lt;br /&gt;
    //abfragen, ob die Funktion existiert&lt;br /&gt;
    GLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = (GLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddress((const GLubyte*)&amp;quot;glXCreateContextAttribsARB&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if(glXCreateContextAttribsARB == NULL)//wenn es diese Funktion nicht gibt, dann hat der --&amp;gt;Treiber&amp;lt;-- keinen OpenGL3 support&lt;br /&gt;
    {&lt;br /&gt;
      cerr&amp;lt;&amp;lt;&amp;quot;Error: There is no OpenGL3 context support.&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    int minor=0;&lt;br /&gt;
    int major=0;&lt;br /&gt;
    glGetIntegerv(GL_MAJOR_VERSION,&amp;amp;major);&lt;br /&gt;
    glGetIntegerv(GL_MINOR_VERSION,&amp;amp;minor);&lt;br /&gt;
    int attribs[]={GLX_CONTEXT_MAJOR_VERSION_ARB,major,GLX_CONTEXT_MINOR_VERSION_ARB,minor,GLX_CONTEXT_FLAGS_ARB,GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,0};&lt;br /&gt;
    for (int i=minor; i&amp;gt;=0;i--)&lt;br /&gt;
    {&lt;br /&gt;
      attribs[3]=i;//Setze minor version auf 0 um ein OpenGL3.0 context zu erstellen.&lt;br /&gt;
      m_Context=glXCreateContextAttribsARB(m_Display, m_FBConfig[0], NULL, true, attribs);&lt;br /&gt;
      if (!m_Context)//versuche ein OpenGL3.i fähigen Context zu erstellen&lt;br /&gt;
      {&lt;br /&gt;
        if (i&amp;gt;0)&lt;br /&gt;
        {&lt;br /&gt;
          //Entweder hat der Treiber noch keinen OpenGL3.i support oder die Grafikkarte beherrscht kein OpenGL3.i.&lt;br /&gt;
          cerr&amp;lt;&amp;lt;&amp;quot;Error: Couldn't create OpenGL3.&amp;quot;&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; context. Try now OpenGL3.&amp;quot;&amp;lt;&amp;lt;i-1&amp;lt;&amp;lt;&amp;quot; context&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          //Die --&amp;gt;Grafikkarte&amp;lt;-- beherrscht kein OpenGL3.&lt;br /&gt;
          glXDestroyContext(m_Display,TempContext);//aufräumen und beenden&lt;br /&gt;
          cerr&amp;lt;&amp;lt;&amp;quot;Error: Couldn't create OpenGL3 context.&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
          return false;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    glXMakeCurrent(m_Display,m_Window,m_Context);//wechsel auf den OpenGL3.x context&lt;br /&gt;
    glXDestroyContext(m_Display,TempContext);&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|OpenGL3 Zeichenkontext]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Raytracing_-_Grundlagen_I&amp;diff=26165</id>
		<title>Tutorial Raytracing - Grundlagen I</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Raytracing_-_Grundlagen_I&amp;diff=26165"/>
				<updated>2014-03-09T11:01:09Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Vorschau */ Kategorie hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tutorial Raytracing - Grundlagen I =&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_teaser.jpg|center]]&lt;br /&gt;
== Einführung ==&lt;br /&gt;
Da melde ich mich mal wieder zurück mit einem kleinen Tutorial bezüglich Raytracing. Ihr sollt ja gelegentlich was neues lernen. Es ist zwar etwas schade, dass nur noch selten Tutorials aus der Community kommen - ich hoffe immer noch, dass sich das irgendwann wieder ändern wird. Und alle die bislang Tutorials geschrieben haben, mussten ja irgendwann ihr erstes schreiben - also nur Mut (mein allererstes war im Übrigen das 1. Tutorial aus der Terrain-Reihe). Nunja. Was hat es also mit dem Raytracing auf sich? Und warum heißt dieses Tutorial Grundlagen I? Ich will es euch erklären. Beim Raytracing verfolgt man im Gegensatz zum Rastern wie es etwa OpenGL oder Direct3D machen, einen anderen Ansatz. Statt Objekte oberflächlich in Polygone zu zerschneiden und sie dann auf den Bildschirm per Z-Buffer zu projizieren, wirft die Kamera Strahlen in die Szenerie und auf jedem Strahl prüft man, ob sich ein Objekt mit dem Strahl schneidet. Man verliert dadurch sehr deutlich Geschwindigkeit: die wenigsten Raytracer sind so schnell, dass man interaktiv damit arbeiten kann. Wozu also ist dann Raytracing gut? Man kann im Raytracer hoch realistisch wirkende Bilder erzeugen und auch Verfahren verwenden, die im Rasterizer nicht oder kaum nachzubauen sind - die gute alte Grafikkarte muss dabei nicht völlig unnütz werden: Diese besitzen sehr flotte und massiv parallele Geometrie-Einheiten, die auch im Raytracer Verwendung finden können - dies ist aber etwas zu speziell für unser kleines Tutorial und vielleicht auch nicht das, was man in seinem ersten Raytracer implementieren würde. Was sich im Bereich interaktiver Grafik allerdings anbietet, ist den Raytracer ein wenig umzumodeln und mit ihm statische Lightmaps erzeugen oder ihn zur Selection missbrauchen. Das einzige Problem welches wir dabei haben: Wir müssen alles von Grund auf zusammenbasteln - nicht so schön, wie bei OpenGL, wo man nach ein paar Stunden recht ansehnliche Bilder samt Beleuchtung zeichnen kann. Wir werden da wohl etwas länger brauchen, aber ewig wird es auch nicht dauern - und schliesslich musste OpenGL ja auch erst einmal designed werden. Andere Dinge werden sich dagegen deutlich leichter implementieren lassen als mit OpenGL, so sind etwa Schatten im Raytracer ein Kinderspiel - im Rasterizer können sie richtig arbeitsintensiv werden.&lt;br /&gt;
&lt;br /&gt;
== Die griechische Vorstellung ==&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_griechisch.jpg|right]]&lt;br /&gt;
Die Griechen hatten eine etwas sonderbare Vorstellung vom Sehen: Sie stellten sich vor, dass aus ihren Augen Strahlen kommen, die dann auf die Umgebung treffen und quasi Nachricht an das Auge geben, was sie getroffen haben, wie weit weg es ist und welche Farbe es hat. Das ist in etwa das was auch ein Raytracer macht. Wir wollen das erst einmal im Hinterkopf behalten und uns zunächst mit Strahlen genauer auseinandersetzen. Danach werden wir Kugeln mit diesen Strahlen schneiden und eine passende perspektivische Kamera entwerfen. Schließlich werden wir einen sehr einfachen Raytracer schreiben, und ihm anschließend noch Ebenen als Objekte näherbringen, weil Kugeln alleine doch etwas langweilig sind.&lt;br /&gt;
&lt;br /&gt;
== Strahlen ==&lt;br /&gt;
Was ist also ein Strahl? Ein Strahl hat einen Ursprung, an dem er beginnt, und eine Richung, in die er verläuft. Wer in der Schule in Geometrie aufgepasst hat, kennt dieses Objekt sicher auch noch als Halbgerade. Da wir später damit rechnen werden, müssen wir den Strahl in eine schöne Formel packen:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_strahlgleichung.png|center]]&lt;br /&gt;
Die Punkte auf unserem Strahl r sind also parametrisiert durch t, welches die&lt;br /&gt;
Zahlen von 0 bis unendlich durchläuft. Der Ursprung des Strahles ist o und seine&lt;br /&gt;
Richung d. Somit kennen wir alle Punkte auf dem Strahl. &lt;br /&gt;
&lt;br /&gt;
Um nun zu prüfen, ob ein Strahl nun ein Objekt trifft, beginnen wir bei t = 0 und laufen alle Punkte ab, bis wir bei t = unendlich angekommen ... ... ... Nein so machen wir das natürlich nicht - funktionieren würde es zwar, würde aber unendlich lange dauern: Nicht gerade das, was wir uns unter schnell vorstellen. &lt;br /&gt;
&lt;br /&gt;
Bevor wir weitermachen, sollten wir unseren Strahl gleich in&lt;br /&gt;
etwas Code verpacken, schließlich wollen wir uns ja einen Raytracer schreiben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;public struct Ray&lt;br /&gt;
{&lt;br /&gt;
    public Vertex3 Origin;&lt;br /&gt;
    public Vertex3 Direction;&lt;br /&gt;
&lt;br /&gt;
    public Vertex3 Evaluate (double t)&lt;br /&gt;
    {&lt;br /&gt;
        return Origin + t * Direction;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zurück zu unserem Problem: Wir müssten also unendlich lange darauf warten, bis unser Raytracer das Objekt gefunden hat, mit dem sich der momentan betrachtete Strahl schneidet. Viel schneller geht die Sache, wenn wir vorher beschließen, welche Objekte wir anzeigen können wollen. Für den Anfang wollen wir uns mit sehr einfachen Objekten begnügen: Kugeln. Sie sind schnell berechnet und werden für erste Experimente ausreichen.&lt;br /&gt;
&lt;br /&gt;
== Kugeln ==&lt;br /&gt;
Erinnerung: Eine Kugel ist definiert durch ihren Mittelpunkt und ihren Radius r. Setzt man den Mittelpunkt auf den Ursprung des Koordinatensystems, dann sind die Punkte auf der Oberfläche O unserer Kugel gerade die Punkte, die vom Ursprung den Abstand r haben. Die uns interessierende Bedingung wird so zu ||p|| = r für Punkte p auf O. Die Gleichung kann man schadlos quadrieren und statt der Vektorlänge ||p|| bekommt man das ohne Wurzel ziehen zu berechnende [[Standard Skalarprodukt|Skalarprodukt]] von p mit sich selbst:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_skalprodpp.png|center]]&lt;br /&gt;
Setzt man hierein die obige Gleichung für den Strahl, ergibt sich:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_radsqr.png|center]]&lt;br /&gt;
Und damit:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_radsqr2.png|center]]&lt;br /&gt;
Da die Richtung o und d unseres Strahls bekannt sind, haben wir eine quadratische Gleichung vor der Nase, die wir mittels Mitternachtsformel lösen können:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_mitternacht.png|center]]&lt;br /&gt;
Anhand der Diskriminante D, also dem Teil des obigen Ausdrucks, der unter der Wurzel steht, können wir entscheiden, ob der Strahl die Kugel trift. Ist nämlich D &amp;lt; 0, so kann man in den reelen Zahlen die Wurzel nicht berechnen. Ist D = 0, so gibt es genau eine Lösung der Schnittgleichung und für D &amp;gt; 0 schneidet der Strahl die Kugel genau 2 mal. Da wir unseren Strahl nur für positive Parameter t definiert haben, sollten wir die errechneten Schnittpunkte t&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; noch daraufhin untersuchen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;public double RayIntersect ( Ray ray )&lt;br /&gt;
{&lt;br /&gt;
    double boundingSquare = sphereRadius * sphereRadius ;&lt;br /&gt;
    ray.Origin -= Position;&lt;br /&gt;
    double a, b, c;&lt;br /&gt;
    a = ray.Direction.DotDot ;&lt;br /&gt;
    // DotDot ^= Skalarprod mit sichselbst : &amp;lt;d, d&amp;gt;&lt;br /&gt;
    b = 2 * ( ray.Origin * ray.Direction );&lt;br /&gt;
    // * ^= normales Skalarprod&lt;br /&gt;
    c = ray.Origin.DotDot - boundingSquare;&lt;br /&gt;
&lt;br /&gt;
    double t1 , t2 ;&lt;br /&gt;
    int roots = CalcQuadricRoots (a, b, c, out t1, out t2) ;&lt;br /&gt;
&lt;br /&gt;
    if (roots &amp;gt; 0)&lt;br /&gt;
        return t1 &amp;gt;= 0 ? t1 : t2 ;&lt;br /&gt;
        // kleinsterpositiver pos. Wert aus t1, t2&lt;br /&gt;
    else&lt;br /&gt;
        return -1; // Kein Schnittpunkt&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Einen kleinen Haken hat die Sache jedoch: Analytisch, d.h. per Stift und Papier, lässt sich mit der Mitternachtsformel wunderbar rechnen. Am Computer neigt sie zu Fehlern, was ganz allein an dem &amp;amp;plusmn; liegt. So führt man verlässlich eine Subtraktion durch, wenn D &amp;gt; 0 ist - und Subtraktionen sind reines Gift für die Genauigkeit bei numerischen Rechnungen. Durch kleine Umformungen und das Bestimmen eines Vorzeichens, können wir das Problem umgehen:&lt;br /&gt;
&lt;br /&gt;
== Quadratische Gleichungen ==&lt;br /&gt;
Hat man also eine Quadratische Gleichung in der allgemeinen Form:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_quadratisch.png|center]]&lt;br /&gt;
dann bestimmt man die Nullstellen am besten durch:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_quadratisch_numerisch.png|center]]&lt;br /&gt;
Bei der Auswertung von q wird so sicherlich echt addiert, weil zu b eine Zahl gleichen Vorzeichens summiert wird. Dass der Wert für t&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; stimmt, hat man dann auch sehr leicht nachgerechnet, wohingegen t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; in wildes Rumgeschiebe der Formel ausartet und sich erst recht spät sign(b) herauswerfen lässt. Ich erspare euch nähere Erläuterungen ;-) Ein bisschen Quellcode hierzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;public static int CalcQuadricRoots(double a, double b, double c, out double x1, out double x2)&lt;br /&gt;
{&lt;br /&gt;
    double determinant = b * b - 4 * a * c;&lt;br /&gt;
    if (determinant &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        x1 = 0.0;&lt;br /&gt;
        x2 = 0.0;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    determinant = Math.Sqrt(determinant);&lt;br /&gt;
    double q = -0.5 * (b + PSgn(b) * determinant);&lt;br /&gt;
    // Psgn: gives - 1 if b &amp;lt; 0 and 1 if b &amp;gt;= 0. &lt;br /&gt;
    // so no zero as normal sgn would give us.&lt;br /&gt;
    x1 = q / a;&lt;br /&gt;
    x2 = c / q;&lt;br /&gt;
    // Sort by value&lt;br /&gt;
    if (x1 &amp;gt; x2)&lt;br /&gt;
    {&lt;br /&gt;
        q = x2; x2 = x1; x1 = q;&lt;br /&gt;
    }&lt;br /&gt;
    return x1 == x2 ? 1 : 2;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Funktion speichert die Nullstellen in den Variablen x1, x2 dem Wert nach sortiert ab und gibt die Anzahl der Nullstellen zurück.&lt;br /&gt;
Da wir jetzt bereits bestimmen können, wo und wie oft unser Strahl die Kugel trift, können wir, nachdem wir uns noch einen Strahlenwerfer, (also eine Kamera) konstruiert haben, unseren ersten Raytracer bauen.&lt;br /&gt;
&lt;br /&gt;
== Perspektivische Kamera ==&lt;br /&gt;
Jeder, der sich mit OpenGL auskennt, wird bei der Konstruktion einer perspektivischen Kamera gleich schreien, dass man dazu doch einfach nur eine Projektionsmatrix braucht, die man sich ganz einfach aus der OpenGL Spezifikation stibitzen kann. Falsch gedacht: Ein Raytracer ist kein Rasterizer: Wir brauchen keine Projektionsmatrizen, noch nicht einmal Matrizen. Die perspektivische Kamera eines Ray-Tracers lässt sich direkt nach vorn heraus entwerfen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_perspektivisch.png|center]]&lt;br /&gt;
&lt;br /&gt;
Unrotiert und unverschoben soll unsere Kamera in die Tiefenrichtung z blicken. Dabei wird unser Bildschirm durch die Parameter links, rechts, oben und unten beschrieben. Ist die Auflösung des Bildschirms in X wie in Y-Richtung bekannt, so kann man leicht die Richtung d des Vektors bestimmen, der vom Betrachter auf den Bildschirm zeigt. Sofort bekommt man so einen Strahl, wenn man als Anfangspunkt o die Position des Betrachters wählt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;public Ray ShootRay ( int x , int y )&lt;br /&gt;
{&lt;br /&gt;
    Ray result = new Ray();&lt;br /&gt;
    result.Origin = Position;&lt;br /&gt;
&lt;br /&gt;
    double xpart , ypart ;&lt;br /&gt;
    xpart = ( ( double ) x ) / (double ) widthpixels;&lt;br /&gt;
    ypart = ( ( double ) y ) / (double ) heightpixels;&lt;br /&gt;
 &lt;br /&gt;
    xpart = left + xpart * ( right - left ) ;&lt;br /&gt;
    ypart = top + ypart * ( bottom - top ) ;&lt;br /&gt;
 &lt;br /&gt;
    result.Direction.x = xpart;&lt;br /&gt;
    result.Direction.y = ypart;&lt;br /&gt;
    result.Direction.z = 1.0;&lt;br /&gt;
&lt;br /&gt;
    /* if ( Transformation != null )&lt;br /&gt;
    {&lt;br /&gt;
        result.Direction =&lt;br /&gt;
        Transformation.Apply( result.Direction );&lt;br /&gt;
    } */&lt;br /&gt;
    result.Direction.Normalize();&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Die auskommentierte if-Abfrage soll vorerst nicht stören. Ihr wird später leben eingehaucht, wenn wir dem Raytracer Verschiebungen,&lt;br /&gt;
Rotationen, Skalierungen, Scheerungen, u.s.w. einbauen.&lt;br /&gt;
&lt;br /&gt;
== Einfacher Raycaster ==&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_depthcasting.jpg|right]]&lt;br /&gt;
Damit sind wir dann auch schon soweit, dass wir unsere ersten Gehversuche in Sachen Raytracing wagen können. Für jedes Pixel im Bild werfen wir mittels ShootRay einen Strahl und prüfen, ob dieser die Kugeln in unserer Szene schneidet. Wenn ja, merken wir uns den nähestes dieser Schnittpunkte und weisen ihm einen Farbwert zu. So erhalten wir ein Bild, das in etwa die Informationen wieder gibt, die OpenGl in seinem Tiefenpuffer speichern würde. Ich gebe zu, das ist nicht hochgradig spannend, aber solange wir uns noch nicht eingehender mit Licht und Shading beschäftigt haben, können wir auch nicht mehr erwarten - und wir haben beim Raytracing ja leider das Problem, dass wir ganz von vorne anfangen müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;public RaytraceImage ( int width , int height )&lt;br /&gt;
{&lt;br /&gt;
    // near und far sind die Werte fuer den Bereich ,&lt;br /&gt;
    // von dem Tiefeninformationen abgebildet werden&lt;br /&gt;
    for ( int x = 0; x &amp;lt; width; x++) {&lt;br /&gt;
        for ( int y = 0 ; y &amp;lt; height; y++) {&lt;br /&gt;
            Ray shoot = ShootRay (x , y);&lt;br /&gt;
            double maxdist = double.Infinity;&lt;br /&gt;
            &lt;br /&gt;
            foreach (Kugel obj in SichtbareKugeln) {&lt;br /&gt;
                double hitdist = obj.RayIntersect(shoot) ;&lt;br /&gt;
                if (hitdist &amp;gt; 0 &amp;amp;&amp;amp; maxdist &amp;gt; hitdist)&lt;br /&gt;
                    maxdist = hitdist;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if (maxdist &amp;lt; double.Infinity) {&lt;br /&gt;
                SetColor(x, y, Colors.Gray (Math.Min(Math .Max(0,&lt;br /&gt;
                    (maxdist - near) / ( near - far ))), 1.0)) ;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                SetColor(x, y, BackgroundColor);   &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Eine kleine Anmerkung noch: Da wir uns noch nicht über Transformationen Gedanken gemacht haben, und unsere Kugeln bislang am Nullpunkt aufgehäng sind, können wir diese noch nicht positionieren - sprich es wird höchstens die größte Kugel sichtbar, weil alle weiteren verdeckt sind. Das lässt sich beheben, indem man vor dem Test auf Schnitt vom Ursprung des entsprechenden Strahles, die Position der Kugel abzieht.&lt;br /&gt;
&lt;br /&gt;
== Ebenen ==&lt;br /&gt;
Mit Kugeln kann man zwar so einiges darstellen, aber nur Kugeln sind vielleicht doch etwas langweilig. Wir wollen deshalb noch Ebenen implementieren. Am besten betrachten wir diese dazu in der Normalform, d.h. die Ebene wird allein durch ihre Flächennormale angegeben. Für Punkte auf der Ebene gilt dann:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_ebenengleichung.png|center]]&lt;br /&gt;
Setzt man nun in x unseren Strahl ein, ergibt sich:&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_ebenenrechnung.png|center]]&lt;br /&gt;
Ist &amp;lt;d,n&amp;gt;=0, dann gibt es keine Lösung, sonst genau eine. &lt;br /&gt;
&lt;br /&gt;
Welche Objekte eignen sich sonst gut zum Raytracing? ... Alle Objekte, die sich in kartesischen Koordinaten durch eine Gleichung der Form [[Bild:Tutorial_RaytracingI_kartesisch.png|center]] darstellen lassen. In (x,y,z) setzt man seinen Strahl r(t) ein und versucht nach t aufzulösen. In einigen Fällen wird dieses Problem leider kaum zu lösen sein: man kommt dann um den Einsatz von numerischen Verfahren nicht herum. Ich werde versuchen, in Folgetutorials noch ein paar weitere, interessante Objekte vorzustellen, die sich direkt lösen lassen und wenn ich viel Geduld habe, vielleicht auch einmal einen eigenen Artikel bezüglich numerischer Verfahren.&lt;br /&gt;
&lt;br /&gt;
== Vorschau ==&lt;br /&gt;
Damit sind wir auch schon wieder soweit. Die ersten Grundlagen sind abgehandelt, aber wirklich überzeugt sind wir vom Raytracing noch nicht. Damit sich das ändert, sind weitere Tutorials in Planung: Wir wollen uns dann mit Licht und Normalen beschäftigen. Außerdem sind Reflektionen und Transparenz spannende Dinge, denen wir uns widmen können. Wir wollen außerdem unsere Objekte transformieren, scheeren, rotieren, ... Es bleibt also noch einiges im Bereich Raytracing zu tun, was hier nicht behandelt wurde.&lt;br /&gt;
&lt;br /&gt;
Bis es soweit ist, könnt ihr euch ja selbst schonmal ein paar Gedanken zum Thema machen oder euch doch lieber in die Weiten von OpenGl flüchten.&lt;br /&gt;
&lt;br /&gt;
'''Delphic'''&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Raytracing - Grundlagen I]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Raytracing_-_Grundlagen_II&amp;diff=26164</id>
		<title>Tutorial Raytracing - Grundlagen II</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Raytracing_-_Grundlagen_II&amp;diff=26164"/>
				<updated>2014-03-09T11:00:20Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Abschluss */ Kategorie hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raytracing Grundlagen II =&lt;br /&gt;
[[Bild:Tutorial_RaytracingI_teaser.jpg|center]]&lt;br /&gt;
== Einführung ==&lt;br /&gt;
Und weiter geht es mit unsem Raytracing Tutorial. Wir wollen unseren Raytracer nun langsam aber sicher soweit bekommen, dass sich damit etwas ansehnlichere Bilder erzeugen lassen. Wer das [[Tutorial_Raytracing_-_Grundlagen_I|vorangehende Tutorial]] nicht gelesen hat, sollte dies am besten gleich tun - ich will ja nicht alles neu erklären. Womit werden wir uns denn heute beschäftigen? Zuerst werden wir ein erweiterbares Objektmodell für alle Objekte planen und überlegen. Dann wollen wir uns ein wenig mit Phong-Lighting beschäftigen und einige Gedanken in Richtung Transformationen verschwenden. Mit diesem Plan sind wir, so denke ich, erstmal gut beschäftigt.&lt;br /&gt;
&lt;br /&gt;
== Ein schönes Basisobjekt ==&lt;br /&gt;
Wir wollen die Objekte in unsem Raytracer möglichst gleich behandeln können, so dass der eigentliche Raytracing Algorithmus ohne jegliches wissen über die Struktur der Objekte arbeiten kann. Sprich: Wir definieren ein Basisobjekt, von dem anschließend alle weiteren Objekte abgeleitet werden. Was also soll dieses Objekt an Methoden und Eigenschaften zur Verfügung stellen? Jedes Objekt hat sicherlich eine Position, sowie gewissen Materialeigenschaften, die dem Objekt zugewiesen werden. Auch soll das Objekt sauber mit Transformationen umgehen können. Und was natürlich ganz wichtig ist: Wir brauchen eine Methode die prüft, ob sich das Objekt mit dem Strahl schneidet. Über einige dieser Dinge haben wir uns noch keine Gedanken gemacht, entsprechend sollen hierfür nur leere Dummyklassen und Methoden zum Einsatz kommen, die wir erst später realisieren. Damit es nicht vergessen wird: Es ist auch sinnvoll Vater-Kindbeziehungen zu haben um später zusammengesetzte Objekte definieren zu können. Das klingt alles etwas wild, artet in einer großen Menge Code aus, ist aber eigentlich gar nicht so schlimm, wei es sich anhört:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;    /// General Raytracing object in a tracer. All traceable objects must be derivates&lt;br /&gt;
    public abstract class ObjectBase&lt;br /&gt;
    {&lt;br /&gt;
        #region Positioning Variables&lt;br /&gt;
        &lt;br /&gt;
        private Vertex3 pos = new Vertex3();&lt;br /&gt;
        /// The Position of the Object in parental Space&lt;br /&gt;
        public Vertex3 Position&lt;br /&gt;
        {&lt;br /&gt;
            get { return pos; }&lt;br /&gt;
            set { pos = value; /*InvalidateBoundings(true);*/ }&lt;br /&gt;
            // Anm.: InvalidateBoundings brauchen wir jetzt noch &lt;br /&gt;
            // nicht. Wenn man allerdings mit Bounding-Volumes&lt;br /&gt;
            // zu arbeiten beginnt, wird man entsprechende&lt;br /&gt;
            // Funktionalität benötigen. Vorerst gilt: Forget it.&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private ILinearTransformation ptransformation;&lt;br /&gt;
        /// The Transformation applied to the object&lt;br /&gt;
        public ILinearTransformation Transformation&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return ptransformation;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                ptransformation = value;&lt;br /&gt;
                //InvalidateBoundigs(true);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
&lt;br /&gt;
        #region Material&lt;br /&gt;
        private Material objMaterial = new StandardMaterial();&lt;br /&gt;
        /// Material assigned to object&lt;br /&gt;
        public Material ObjectMaterial&lt;br /&gt;
        {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
&lt;br /&gt;
        #region Parenting&lt;br /&gt;
        // The parental object&lt;br /&gt;
        private ObjectBase fParent;&lt;br /&gt;
&lt;br /&gt;
        /// The Parent of the object&lt;br /&gt;
        public ObjectBase Parent&lt;br /&gt;
        {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
&lt;br /&gt;
        #region Trans Space Functions&lt;br /&gt;
        public virtual Vertex3 TransSpaceWorldToObject(Vertex3 v) {...}&lt;br /&gt;
        public virtual Ray TransSpaceWorldToObject(Ray r) {...}&lt;br /&gt;
        public virtual Vertex3 TransSpacePointWorldToObject(Vertex3 v) {...}&lt;br /&gt;
        public virtual Vertex3 TransSpacePointParentToObject(Vertex3 v) {...}&lt;br /&gt;
        public virtual Ray TransSpaceParentToObject(Ray r) &lt;br /&gt;
        {&lt;br /&gt;
            Ray ray = r;&lt;br /&gt;
            ray.o -= pos;&lt;br /&gt;
            return ray;&lt;br /&gt;
        }&lt;br /&gt;
        public virtual Vertex3 TransSpaceParentToObject(Vertex3 v) {...}&lt;br /&gt;
        public virtual Vertex3 TransSpaceObjectToWorld(Vertex3 v) {...}&lt;br /&gt;
        public virtual Vertex3 TransSpacePointObjectToWorld(Vertex3 v) {...}&lt;br /&gt;
        #endregion&lt;br /&gt;
        &lt;br /&gt;
        #region Intersection Tests&lt;br /&gt;
        /// Calculates the first visible intersection. Returns values smaller&lt;br /&gt;
        /// equal zero if there is no intersection. &lt;br /&gt;
        /// param name=&amp;quot;rs&amp;quot;: Global rendersettings&lt;br /&gt;
        /// param name=&amp;quot;ray&amp;quot;: the ray to test for intersection&lt;br /&gt;
        /// param name=&amp;quot;raymindist&amp;quot;:&lt;br /&gt;
        /// param name=&amp;quot;raymaxdist&amp;quot;:&lt;br /&gt;
        /// param name=&amp;quot;calcNormals&amp;quot;:&lt;br /&gt;
        /// param name=&amp;quot;calcTextureCoordinates&amp;quot;:&lt;br /&gt;
        /// param name=&amp;quot;info&amp;quot;:&lt;br /&gt;
        public abstract int Intersect(RenderSettings rs, Ray ray, double raymindist, double raymaxdist,&lt;br /&gt;
            bool calcNormals, bool calcTextureCoordinates, ref IntersectionInfo info);&lt;br /&gt;
        #endregion&lt;br /&gt;
    }        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das schaut jetzt tatsächlich etwas wild aus, aber keine Angst. Wir werden das alles der Reihe nach mit Leben füllen. Die Trans-Space-Funktionen werden wir anschließend mit Leben füllen - nur TransSpaceParentToObject kann gleich bestückt werden (wir werden das aber später erweitern müssen). Sie soll Strahlen aus dem Eltern-Raum in den lokalen Raum überführen - für die meisten Objekte bedeutet dies: Die globalen Koordinaten werden in lokale übersetzt, so dass sich unser Objekt genau im Zentrum des Geschehens, d.h. bei (0,0,0), befindet und wir uns dann nie wieder über die Position des Objektes Gedanken machen müssen.&lt;br /&gt;
&lt;br /&gt;
Einen Blick sind auch die Parameter von Intersect wert. rs beschreibt globale Einstellungen des Renderers. Darin könnte man z.B. festlegen, ob Schatten berechnet werden sollen oder nicht. Ihr könnt hier im wesentlichen spazieren führen was ihr wollt, aber diese Option zu haben ist jedenfalls nicht verkehrt. ray dürfte klar sein.&lt;br /&gt;
Dies wird ein Strahl sein, der jeweils in elterlichen Koordinaten gegeben ist, also mithilfe von TransSpaceParentToObject in lokale Koordinaten umgerechnet werden kann. raymindist und raymaxdist beschreiben jeweils Bereich des Strahles, in dem wir nach Überschneidungen suchen sollen - haben wir es mit einem numerisch zu berechnenden Objekt zu tun, kann diese Information bereits sehr viel Geschwindigkeit ausmachen. Beim Schnitt mit Kugeln ist die Sache dagegen weniger wichtig. Essenziell ist, dass beim Aufruf von Intersect sichergestellt sein muss, dass nur dann positive Rückmeldung gemacht wird, wenn die Überschneidung an einer Stelle des Strahles zu finden ist, die größer gleich raymindist ist: Darauf sollte man sich verlassen können. calcNormals und calcTextureCoordinates beschreibt, ob beim Überschneidungstest Informationen über Flächennormalen bzw. Texturkoordinaten erzeugt werden sollen: Bei manchen Objekten ist auch diese Information nur kostspielig zu bekommen und wir wollen es deshalb optional halten. Es bleibt noch der Call by Reference Parameter info. Darin sollen genauere Informationen bezüglich des Schnittes gespeichert werden - etwa lokale Farben, Material, Texturkoordinaten, Schnittposition, etc. (Die Schnittposition könnte man auch direkt zurückgeben, also den Rückgabewert durch einen Float-Typ wie double ersetzen. Seis drum)&lt;br /&gt;
&lt;br /&gt;
Noch schnell ein kleiner Blick in eine mögliche Definition der IntersectionInfo. Darin befindet sich nichts anderes, als wie das, was ich gerade beschrieben habe. Also keine Überraschungen ;-)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;    public struct IntersectionInfo&lt;br /&gt;
    {&lt;br /&gt;
        /// Position on ray where the cut occured&lt;br /&gt;
        public double rayPosition;&lt;br /&gt;
        /// Normal of surface at cut position&lt;br /&gt;
        public Vertex3 normal;&lt;br /&gt;
        /// Texture coordinates&lt;br /&gt;
        public Vertex3 texture;&lt;br /&gt;
        /// Material of surface at intersection position&lt;br /&gt;
        public Material material;&lt;br /&gt;
        /// The local color of the intersection. This must be optional&lt;br /&gt;
        /// for all materials!!! Some Objects may always return black here.&lt;br /&gt;
        public Color localColor;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Transformationen ==&lt;br /&gt;
Wir wollen uns nun um Transformationen kümmern. Was also sind Transformationen? Wer mit OpenGl vertraut ist, kennt sie sie ganz gut: Es handelt sich um genau das, was man mit den Funktionen [[glTranslate]], [[glRotate]], [[glScale]], usw. bewirken kann. Verschiebungen haben wir bereits durch die Position des Objektes abgehakt, wir können uns hier also auf Dinge wie Scheerungen, Rotationen usw. beschränken. Wer Nachholbedarf in diesen Themen hat, der sollte sich jetzt hier darum kümmern, dieses Defizit etwas zu mildern. Da DelphiGl aber schon eine Weile existiert, finden sich fast alle nötigen Informationen in Tutorias oder Wiki-Artikeln: [[Matrix]],&lt;br /&gt;
[[Tutorial_Nachsitzen|Nachsitzen]], [[Tutorial_Matrix2|Matrix 2]], [[Quaternion]]. Auch die Wikipedia ist hier in der [http://de.wikipedia.org/wiki/Kategorie:Lineare_Algebra Kategorie Lineare Algebra] gut ausgestattet, um weitere Informationen einzuholen.&lt;br /&gt;
Wer hoch in den Code des Basis-Objektes schaut, dem wird auffallen, dass Transformationen durch das Interface ILinearTransformation definiert sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    /// Defines a linear Trafo&lt;br /&gt;
    public interface ILinearTransformation&lt;br /&gt;
    {&lt;br /&gt;
        /// Applys the Trafo to v&lt;br /&gt;
        Vertex3 Apply(Vertex3 v);&lt;br /&gt;
        /// Applys the inverse Trafo to v&lt;br /&gt;
        Vertex3 ApplyInverse(Vertex3 v);&lt;br /&gt;
&lt;br /&gt;
        /// Conversion of the Trafo to Matrix3x3&lt;br /&gt;
        Matrix3x3 ConvertTo3x3();&lt;br /&gt;
        /// Conversion of the Inverse Trafo to Matrix3x3 &lt;br /&gt;
        Matrix3x3 ConvertInverseTo3x3();&lt;br /&gt;
&lt;br /&gt;
        /// Right Mulltiplication of factor with this to a new, returned ILinearTransformation.&lt;br /&gt;
        /// Probably the trafos are converted to a LinearTransformationMatrix, but if both&lt;br /&gt;
        /// trafos are of the same type, its a good idea to multiply them together.&lt;br /&gt;
        ILinearTransformation MultiplyWithLinear(ILinearTransformation factor);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man ohne weiteres Quaternionen und Matrizen wild nebeneinander verwenden. Mit der Methode MultiplyWithLinear kann man dann auch verschiedene Multiplikationen miteinander verknüpfen. So kann man Quaternionen einfach mit Quaternionen multiplizieren und gemischtes, wenn etwa Quaternionen mit Matrizen multipliziert werden, in Matrizen umwandeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
        #region ILinearTransformation Members&lt;br /&gt;
&lt;br /&gt;
        /// Rotates a Vertex3 through the Quaternion - this should be normalized!&lt;br /&gt;
        public Vertex3 Apply(Vertex3 v) {...}&lt;br /&gt;
        /// Rotates a Vertex3 against the Quaternion. A normalized Quaternion is assumed!&lt;br /&gt;
        public Vertex3 ApplyInverse(Vertex3 v) {...}&lt;br /&gt;
&lt;br /&gt;
        /// Converts the Quaternion to a 3x3 Matrix&lt;br /&gt;
        public Matrix3x3 ConvertTo3x3()&lt;br /&gt;
        {&lt;br /&gt;
            Matrix3x3 result = new Matrix3x3();&lt;br /&gt;
            result.sp0 = Apply(new Vertex3(1.0, 0.0, 0.0));&lt;br /&gt;
            result.sp1 = Apply(new Vertex3(0.0, 1.0, 0.0));&lt;br /&gt;
            result.sp2 = Apply(new Vertex3(0.0, 0.0, 1.0));&lt;br /&gt;
            return result;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// Converts the Inverse Quaternion to a 3x3 Matrix&lt;br /&gt;
        public Matrix3x3 ConvertInverseTo3x3()&lt;br /&gt;
        {&lt;br /&gt;
            Matrix3x3 result = new Matrix3x3();&lt;br /&gt;
            result.sp0 = ApplyInverse(new Vertex3(1.0, 0.0, 0.0));&lt;br /&gt;
            result.sp1 = ApplyInverse(new Vertex3(0.0, 1.0, 0.0));&lt;br /&gt;
            result.sp2 = ApplyInverse(new Vertex3(0.0, 0.0, 1.0));&lt;br /&gt;
            return result;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// Multiply the Quaternion with another trafo. If its a Quaternion, this and factor&lt;br /&gt;
        /// will be multiplied together, otherwise a LinearTransformationMatrix is generated.&lt;br /&gt;
        public ILinearTransformation MultiplyWithLinear(ILinearTransformation factor)&lt;br /&gt;
        {&lt;br /&gt;
            if (factor == null) return this;&lt;br /&gt;
            Quaternion fac = factor as Quaternion;&lt;br /&gt;
            if (fac != null)&lt;br /&gt;
            {&lt;br /&gt;
                return Multiply(fac);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                // factor is not wenn known to us, we need a new LinearTransformationMatrix&lt;br /&gt;
                Matrix3x3 lin = ConvertTo3x3() * factor.ConvertTo3x3();&lt;br /&gt;
                Matrix3x3 inv = factor.ConvertInverseTo3x3() * ConvertInverseTo3x3();&lt;br /&gt;
                return new LinearTransformationMatrix(lin, inv, factor.Operator2Norm() * Operator2Norm());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        #endregion&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
An diesem Beispiel aus meinem Quaternioncode kann man folgendes sehen: Die Funktionen ConvertTo3x3 und ConvertInverseTo3x3 berechnen jeweils die zum Quaternion gehörenden, äquivalenten Matrizen ( Man erinnere sich an den Satz, den ich bereits im Nachhilfe Tutorial zitiert habe: Die Spalten sp&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; der Matrix sind die Bilder der Einheitsvektoren. Dann dürfte sofort klar sein, was hier passiert ). In MultiplyWithLinear wird dann einfach geprüft, ob die Transformation mit der rechts multipliziert wird, ein Quaternion ist. Dann wird einfach Quaternion-Multiplikation durchgeführt, ansonsten werden sowohl der Faktor als auch das betrachtete Quaternion in 3x3 Matrizen umgewandelt und in einer LinearTransformationMatrix abgelegt - welches natürlich ILinearTransformation implementiert und immer die Transformationsmatrix und ihr Inverses bereithält.&lt;br /&gt;
&lt;br /&gt;
Damit ihr nicht ewig rumrechnen müsst (es handelt sich nämlich um eine schrecklich langwierige und ekelige Rechnerei: Ich habe etwa 2 Stunden gebraucht, bis das Ergebnis endlich fehlerfrei und brauchbar auf 2 DIN-A4 Blättern verteilt da stand), wenn ihr Quaternionen implementiert noch ein paar kleine Methoden des Quaternions. Den Rest werdet ihr dann wohl aus dem [[Quaternion|Quaternionen-Artikel]] selbst in kurzer Zeit zusammenstöpseln können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;        // &amp;quot;Coordinates&amp;quot; of the Quaternion. &lt;br /&gt;
        // coords[0] is the real component, coords[1] the i comp., ...&lt;br /&gt;
        private double[] coords = new double[4];&lt;br /&gt;
&lt;br /&gt;
        /// Creates a rotation Quaternion&lt;br /&gt;
        public Quaternion(double alpha, Vertex3 rotAxis)&lt;br /&gt;
        {&lt;br /&gt;
            alpha = (2.0*Math.PI/(360.0*2.0))* alpha;&lt;br /&gt;
&lt;br /&gt;
            coords[0] = 1.0;&lt;br /&gt;
            if (rotAxis.Magnitude &amp;lt; double.Epsilon)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            rotAxis.Normalize();&lt;br /&gt;
            double c, s;&lt;br /&gt;
            c = Math.Cos(alpha); s = Math.Sin(alpha);&lt;br /&gt;
            coords[0] = c; coords[1] = rotAxis[0] * s; &lt;br /&gt;
            coords[2] = rotAxis[1] * s; coords[3] = rotAxis[2] * s;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// Rotates a Vertex3 through the Quaternion - this should be normalized!&lt;br /&gt;
        public Vertex3 Apply(Vertex3 v)&lt;br /&gt;
        {&lt;br /&gt;
            Vertex3 result = new Vertex3();&lt;br /&gt;
            double v0 = v[0]; double v1 = v[1]; double v2 = v[2];&lt;br /&gt;
            double a00 = coords[0] * coords[0];&lt;br /&gt;
            double a01 = coords[0] * coords[1];&lt;br /&gt;
            double a02 = coords[0] * coords[2];&lt;br /&gt;
            double a03 = coords[0] * coords[3];&lt;br /&gt;
            double a11 = coords[1] * coords[1];&lt;br /&gt;
            double a12 = coords[1] * coords[2];&lt;br /&gt;
            double a13 = coords[1] * coords[3];&lt;br /&gt;
            double a22 = coords[2] * coords[2];&lt;br /&gt;
            double a23 = coords[2] * coords[3];&lt;br /&gt;
            double a33 = coords[3] * coords[3];&lt;br /&gt;
            result[0] = v0 * (+a00 + a11 - a22 - a33)&lt;br /&gt;
                + 2 * (a12 * v1 + a13 * v2 + a02 * v2 - a03 * v1);&lt;br /&gt;
            result[1] = v1 * (+a00 - a11 + a22 - a33)&lt;br /&gt;
                + 2 * (a12 * v0 + a23 * v2 + a03 * v0 - a01 * v2);&lt;br /&gt;
            result[2] = v2 * (+a00 - a11 - a22 + a33)&lt;br /&gt;
                + 2 * (a13 * v0 + a23 * v1 - a02 * v0 + a01 * v1);&lt;br /&gt;
            return result;&lt;br /&gt;
        }&lt;br /&gt;
        /// Rotates a Vertex3 against the Quaternion. A normalized Quaternion is assumed!&lt;br /&gt;
        public Vertex3 ApplyInverse(Vertex3 v)&lt;br /&gt;
        {&lt;br /&gt;
            Vertex3 result = new Vertex3();&lt;br /&gt;
            double v0 = v[0];&lt;br /&gt;
            double v1 = v[1];&lt;br /&gt;
            double v2 = v[2];&lt;br /&gt;
            // Like Apply. We only konjugate the im. factors&lt;br /&gt;
            double a00 = coords[0] * coords[0];&lt;br /&gt;
            double a01 = -coords[0] * coords[1];&lt;br /&gt;
            double a02 = -coords[0] * coords[2];&lt;br /&gt;
            double a03 = -coords[0] * coords[3];&lt;br /&gt;
            double a11 = +coords[1] * coords[1];&lt;br /&gt;
            double a12 = +coords[1] * coords[2];&lt;br /&gt;
            double a13 = +coords[1] * coords[3];&lt;br /&gt;
            double a22 = +coords[2] * coords[2];&lt;br /&gt;
            double a23 = +coords[2] * coords[3];&lt;br /&gt;
            double a33 = +coords[3] * coords[3];&lt;br /&gt;
            result[0] = v0 * (+a00 + a11 - a22 - a33)&lt;br /&gt;
                + 2 * (a12 * v1 + a13 * v2 + a02 * v2 - a03 * v1);&lt;br /&gt;
            result[1] = v1 * (+a00 - a11 + a22 - a33) &lt;br /&gt;
                + 2 * (a12 * v0 + a23 * v2 + a03 * v0 - a01 * v2);&lt;br /&gt;
            result[2] = v2 * (+a00 - a11 - a22 + a33) &lt;br /&gt;
                + 2 * (a13 * v0 + a23 * v1 - a02 * v0 + a01 * v1);&lt;br /&gt;
            return result;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wer ein Quaternion mithilfe des angegebenen Konstruktors erstellt, erhält ein Rotationsquaternion der Norm 1. Genau das, was für die Funktionen Apply und ApplyInverse notwendig ist, damit sie das tun, was sie sollen. Damit soll ersteinmal der Faulheit beim Rechnen und dem Copy&amp;amp;Paste genüge getan sein. Und wehe ich entdecke irgendwann Raytracer, die Objekte nur rotieren können statt beliebige [[Matrix|Matrizen]] zu vertragen ;-) Am Ende bleibt es natürlich euch überlassen. Wenn ihr wollt, könnt ihr all das auch allein durch Matrizen implementieren und euch den Umweg über das Quaternion ersparen - allerdings sieht man einem Quaternion schneller an was es bewirkt, als einer Matrix.&lt;br /&gt;
&lt;br /&gt;
Nachdem wir einen kleinen Ausflug in Richtung Quaternionen und Transformationen hinter uns gebracht haben, könnte man hoffen, dass wir jetzt endlich mit dem abstrakten Kram aufhören und wir bald mal wieder ein paar neue Bilder zu Gesicht bekommen. Soweit ist es leider noch nicht. Ich möchte zwischendrin den Schlachtplan für die nächsten Minuten bekannt geben: Wir werden jetzt die Punkte in den Trans-Space-Funktionen der Basisklasse füllen, um uns dann dem Licht durch Phong-Lighting über den Umweg der Normalen zu widmen. Beginnen wir also mit der Funktion TransSpaceParentToObject, welche Strahlen des elterlichen Raumes in den lokalen Raum transformieren soll. Wenn man nun an die Kameraanalogie denkt, wie sie etwa im [[Tutorial_Kamera1|Kamera Tutorial]] beschrieben ist, dann wissen wir, dass wir die auf das Objekt angewendete Transformation einfach nur umkehren müssen. Denkt man dann noch daran, dass wir erreichen wollen, dass das Objekt im lokalen Raum am Ursprung befinden soll, ist die Implementation schnell naheliegend: Den Ursprung des Strahles müssen wir erst um die Position verschieben und dann invers transformieren. Bei der Richtung genügt es, diese invers zu transformieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
        public virtual Ray TransSpaceParentToObject(Ray r)&lt;br /&gt;
        {&lt;br /&gt;
            Ray ray = r;&lt;br /&gt;
            ray.Origin -= pos;&lt;br /&gt;
            if (ptransformation != null)&lt;br /&gt;
            {&lt;br /&gt;
                ray.Origin = ptransformation.ApplyInverse(ray.Origin);&lt;br /&gt;
                ray.Direction = ptransformation.ApplyInverse(ray.Direction);&lt;br /&gt;
            }&lt;br /&gt;
            return ray;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bei dieser Überlegung fallen auch gleich die Funktionen TransSpacePointParentToObject, welche einen Punkt in die lokalen Koordinaten überträgt und die Entsprechende Funktion TransSpaceParentToObject für Richtungen ab. Das ganze können wir natürlich auch in die andere Richtung machen: Bislang ist mir aber noch kein Grund eingefallen, dies zu tun. Wichtig dagegen ist es, Richtungen in Weltkoordinaten umzurechnen, da wir dies für die Normalen später benötigen werden. Dies erreichen wir leicht, wenn wir ausnutzen, dass Objekte immer ihre Eltern kennen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;        public virtual Vertex3 TransSpaceObjectToWorld(Vertex3 v)&lt;br /&gt;
        {&lt;br /&gt;
            if (ptransformation != null)&lt;br /&gt;
            {&lt;br /&gt;
                v = ptransformation.Apply(v);&lt;br /&gt;
            }&lt;br /&gt;
            if (fParent != null)&lt;br /&gt;
            {&lt;br /&gt;
                v = fParent.TransSpaceObjectToWorld(v);&lt;br /&gt;
            }&lt;br /&gt;
            return v;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die entsprechende Funktion für Punkte solltet ihr der Übung halber selbst schreiben. Mit den genannten Zweien kommen wir auf jeden Fall erst einmal aus - ich bin mir gar nicht sicher, ob in meinem eigenen Raytracer je die Anderen zum Einsatz gekommen sind. Naja, es schadet jedenfalls nicht, wenn sie da sind.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tutorial_RaytracingII_spherenormals.jpg|right|framed|Visualisierung der Normalen]]&lt;br /&gt;
Um nun mit dem Licht weiter machen zu können, müssen wir die Intersect-Funktionen für Kugeln und Ebenen um Normalenerzeugung erweitern. Wir dürfen nicht vergessen, diese dann in den World-Space zu transformieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;        /// Calculates the World-Space normal for a surface point&lt;br /&gt;
        protected Vertex3 CalcNormal(Vertex3 v)&lt;br /&gt;
        {&lt;br /&gt;
            Vertex3 normal = TransSpaceObjectToWorld(v);&lt;br /&gt;
            normal.Normalize();&lt;br /&gt;
            return normal;&lt;br /&gt;
        }&lt;br /&gt;
        ...&lt;br /&gt;
        public override int Intersect(RenderSettings rs, Ray ray, &lt;br /&gt;
            double raymindist, double raymaxdist, bool calcNormals, &lt;br /&gt;
            bool calcTextureCoordinates, ref IntersectionInfo info)&lt;br /&gt;
        {&lt;br /&gt;
            Ray osray = TransSpaceParentToObject(ray);&lt;br /&gt;
&lt;br /&gt;
            double a, b, c;&lt;br /&gt;
            a = osray.d.DotDot; b = 2 * (osray.o * osray.d);&lt;br /&gt;
            c = osray.o.DotDot - sphereRadius * sphereRadius;&lt;br /&gt;
&lt;br /&gt;
            double t1, t2;&lt;br /&gt;
            int roots = GeoMath.CalcQuadricRoots(a, b, c, out t1, out t2);&lt;br /&gt;
&lt;br /&gt;
            // roots are sorted so check only for tr2&lt;br /&gt;
            if (roots &amp;gt; 0 &amp;amp;&amp;amp; t2 &amp;gt;= raymindist &amp;amp;&amp;amp; t1 &amp;lt;= raymaxdist)&lt;br /&gt;
            {&lt;br /&gt;
                info = new IntersectionInfo();&lt;br /&gt;
                Vertex3 v; info.material = ObjectMaterial;&lt;br /&gt;
&lt;br /&gt;
                info.rayPosition = t1;&lt;br /&gt;
                if (t1 &amp;gt;= raymindist)&lt;br /&gt;
                {&lt;br /&gt;
                    v = osray.Evaluate(t1);&lt;br /&gt;
                    if (calcNormals) info.normal = CalcNormal(v);&lt;br /&gt;
                    if (calcTextureCoordinates) &lt;br /&gt;
                        info.texture = GeoMath.SphereCoordinates(v);&lt;br /&gt;
                    return 1;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                v = osray.Evaluate(t2);&lt;br /&gt;
                if (calcNormals) info.normal = CalcNormal(v);&lt;br /&gt;
                if (calcTextureCoordinates) &lt;br /&gt;
                    info.texture = GeoMath.SphereCoordinates(v);&lt;br /&gt;
                info.rayPosition = t2;&lt;br /&gt;
                return 1;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                return -1;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Phong Licht ==&lt;br /&gt;
[[Bild:Tutorial_RaytracingII_phong.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Wir sind soweit. Die ersten hübscheren Bilder aus unserem Raytracer sind greifbar nahe. Wir müssen uns im wesentlichen nur noch mit Phong Licht beschäftigen, um aus unserem Raytracer mehr herauszuquetschen. Das Phong-Beleuchtungsmodell ist ein sehr einfaches Modell, um Licht zu simulieren. Es ist physikalisch ziemlich falsch: Durch Hinzufügen von Objekten in einen physikalischen Raum, die sich lichttechnisch nach dem Phong Modell verhalten, wird i.A. die vorhandene Lichtenergie erhöht. Das ist sehr tragisch, wenn man globale Beleuchtungsmethoden verwendet, aber fürs erste ist es ein sehr gut aussehendes und leicht zu  berechnendes Modell. Wir wollen uns also von dieser Anomalität nicht beunruhigen lassen und uns nur daran erinnern, wenn wir einmal globale Beleuchtungsmethoden einführen wollen. Jedem sollte das Phong Modell wohl vertraut sein, da es das Standard-Modell in OpenGl ist. Wer hier noch Nachholbedarf hat, schaue doch einmal im [[Beleuchtung|Beleuchtungs-Artikel]] oder [http://www.delphi3d.net/articles/viewarticle.php?article=phong.htm in Tom Nuydens': Phong For Dummies]. &lt;br /&gt;
&lt;br /&gt;
Jedenfalls, wenn wir jedem Objekt ein Material mit den Koeffizienten aus dem Phong-Modell zugeordnet haben, dann können wir mithilfe einer IntersectionInfo für Strahl/Objekt-Schnittpunkte und aller Lichtquellen leicht die zugehörige Farbe bestimmen. An der Stelle, wo wir also im Tiefentracer den Grauwert bestimmten, bestimmen wir&lt;br /&gt;
jetzt den zugehörigen Farbwert über unser Material: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;public RaytraceImage ( int width , int height )&lt;br /&gt;
{&lt;br /&gt;
    for ( int x = 0; x &amp;lt; width; x++) {&lt;br /&gt;
        for ( int y = 0 ; y &amp;lt; height; y++) {&lt;br /&gt;
            Ray shoot = ShootRay (x , y);&lt;br /&gt;
            double maxdist = double.Infinity;&lt;br /&gt;
            &lt;br /&gt;
            IntersectionInfo cinfo = new IntersectionInfo();;&lt;br /&gt;
            IntersectionInfo iinfo = new IntersectionInfo();&lt;br /&gt;
            &lt;br /&gt;
            foreach (ObjectBase obj in SichtbareObjekte) {&lt;br /&gt;
                if (obj.Intersect(rs, shoot, 0, maxdist, true, true, ref cinfo) &amp;gt; 0 &lt;br /&gt;
                  &amp;amp;&amp;amp; cinfo.rayPosition &amp;lt; maxdist) iinfo = cinfo;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if (maxdist &amp;lt; double.Infinity &amp;amp;&amp;amp; iinfo.material != null) {&lt;br /&gt;
                SetColor(x, y, iinfo.Material.GetColor(iinfo));&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                SetColor(x, y, BackgroundColor);   &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Abschluss ==&lt;br /&gt;
Da habt ihr euch ja durch ein dickes Ding gequält ( besonders wenn ihr im Bereich Transformationen oder Phong noch Nachholbedarf hattet, hats sicher eine Weile gedauert ). Gratulation. Langsam wird das Raytracing ja interessant und die Szenen sind nicht mehr ganz so langweilig. Es bleibt aber immer noch genügend Stoff für ein weiteres Grundlagen Tutorial: In Planung sind hier ein paar Worte bezüglich Reflexionen, Schatten und ein paar weiteren Objekten wie Dreiecken (das impliziert eine Lehrstunde in Sachen Phong Shading), Boxen und Zylinder. Dazu sollten wir außerdem unseren Raytracer umbauen: Er wird in eine eigene Tracer-Klasse ausgelagert werden, um so schnell die Wahl zwischen verschiedenen Raytracern zu haben. Stay tuned.&lt;br /&gt;
&lt;br /&gt;
'''Delphic'''&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Raytracing - Grundlagen II]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tutorial_Wassereffekt&amp;diff=26163</id>
		<title>Tutorial Wassereffekt</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tutorial_Wassereffekt&amp;diff=26163"/>
				<updated>2014-03-09T10:58:29Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* In the end... */ Kategorie hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Einleitung =&lt;br /&gt;
Erstmal willkommen zu meinem zweiten Tutorial. Ich möchte Euch hier einen Einblick in die „hohe Kunst“ der Wassereffekte geben. Hierbei wird erst einmal nur ein relativ stehendes Gewässer, also keines, welches in einer Rinne fließt beschrieben. Auch werde ich hier nicht auf die  Technik für Wasser an Abhängen (abwärts fließende Flüsse) oder Wasserfälle eingehen. Hier geht es schlicht und einfach um eine Wasserebene, wie man sie zum Beispiel für ein Meer verwenden könnte.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung für dieses Tutorial ist eigentlich nur ein Delphi/FP-Kompiler, einige grundlegende Kenntnisse in OpenGL und in GLSL. Falls letztere fehlen, kann ich nur die beiden Tutorials zum Thema GLSL hier im Wiki empfehlen: [[Tutorial_glsl|Tutorial GLSL]] und [[Tutorial_glsl2|Tutorial GLSL 2]].&lt;br /&gt;
&lt;br /&gt;
Noch etwas, dass man wissen sollte ist, dass die Kamera in die GL_PROJECTION_MATRIX geschrieben wird. Dies wird später für die Shader wichtig. Das ist kaum mehr Arbeit mit großer Wirkung, da sich dieses Tutorial an fortgeschrittene Benutzer richtet, werde ich hier allerdings nicht näher drauf eingehen. Durch diese Trennung haben wir dann den Vorteil, dass die eigene Rotation der Modelle von den Operationen der Kamera getrennt ist. Das wird wie erwähnt bei den Shadern wichtig.&lt;br /&gt;
&lt;br /&gt;
In dem Sinne: glBegin(GL_WATER_TUTORIAL) ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Die Wasserebene =&lt;br /&gt;
Das Erste, das  wir brauchen ist eine Ebene - am besten Quads - von mir aus auch zwei Triangles. Wichtig ist, dass es eine [[Ebene]] ist. Es darf keine Höhenunterschiede geben. Die Z-Achse sollte hierbei die Höhe darstellen, X und Y dienen als... als X und Y eben ;) Natürlich fehlt noch so ziemlich alles. Diese Ebene allein macht nicht einen Wassereffekt aus. Jetzt brauchen wir erst einmal ein paar Texturen. Diese sollten der &amp;quot;Power of Two&amp;quot;-Regel gemäß und quadratisch sein. Dabei muss man beachten, dass sie keinesfalls größer als der maximal beschreibbare Viewport sein sollten, weil die Texturen komplett gefüllt werden müssen. Der Grund dafür ist, dass man nicht über den Rand des Framebuffers (des Fensters) zeichnen kann, zuminest nicht ohne Erweiterungen, also muss die Textur kleiner oder genauso groß wie der Framebuffer sein. Diese Texturen sollten bereits zu Anfang des Programms erstellt und initialisiert werden. Genau genommen brauchen wir zwei Stück. Jeweils eine für die Reflexions- und Refraktionsmap. Wenn wir ohne Shader arbeiten, sollten sie nur als RGB initialisiert werden. Wenn wir später den Shader zuschalten, brauchen wir auch den Alphakanal. Die Größe sollte sich am originalen Viewport ausrichten. Die Texturen lassen sich übrigens am Besten mit glCopyTexImage2D initialisieren, da man dort keinen Puffer mit Pixeldaten braucht, den man übergeben muss.&lt;br /&gt;
&lt;br /&gt;
= Texturen füllen =&lt;br /&gt;
Jetzt geht es darum, wie wir die Szene in die Texturen und dann auf die Wasserebene bekommen. Hier kann ich einen Trick empfehlen, den ich aus einer Demo von Delphi3d.net habe- aber dazu gleich noch mehr.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist vor allem, das wir uns erst einmal Gedanken machen, was die Texturen eigentlich beinhalten sollen. Refract sollte - wie der Name bereits sagt - die Refraktionsinformationen, also alles, was unter dem Wasser ist, darstellen, Reflect, daher das, was über dem Wasser ist. Damit keine Darstellungsfehler entstehen, wenn die Kamera über dem Wasser ist, müssen wir beim Erstellen der Texturen die Parameter {{INLINE_CODE|GL_TEXTURE_WRAP_S}} und {{INLINE_CODE|GL_TEXTURE_WRAP_T}} auf {{INLINE_CODE|GL_CLAMP_TO_EDGE}} setzen.&lt;br /&gt;
Wer schon etwas häufiger mit OpenGL gearbeitet hat, der kann sich vielleicht schon denken, wie man die Texturen am Besten füllen kann: natürlich mit ClipPlanes. Diese praktischen Dinger sorgen dafür, dass alles, was über bzw. unter ihnen liegt, abgeschnitten und nicht gezeichnet wird. Am besten für die Performance wäre es natürlich, wenn wir in der Anwendung noch einmal prüfen, ob das Objekt nicht vielleicht ganz unter/über Wasser ist und man es deshalb in diesem Renderpass weglassen könnte, aber das würde den Rahmen des Tutorials sprengen. Außerdem müssen wir dann noch entsprechend der aktuell zu füllenden Textur die Z-Achse invertieren je nachdem , ob wir den Teil über oder den Teil unter der Wasseroberfläche rendern wollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure DoRenderPass(InvertZ: Boolean);&lt;br /&gt;
const&lt;br /&gt;
  // Deklaration der ClipPlane&lt;br /&gt;
  CP: array [0..3] of Double = (0.0, 0.0, 1.0, 0.0);&lt;br /&gt;
begin&lt;br /&gt;
  glEnable(GL_CLIP_PLANE0);&lt;br /&gt;
  glDisable(GL_CULL_FACE);&lt;br /&gt;
&lt;br /&gt;
  glLoadIdentity;&lt;br /&gt;
  glClipPlane(GL_CLIP_PLANE0, @CP);&lt;br /&gt;
  &lt;br /&gt;
  if InvertZ then&lt;br /&gt;
    glScalef(1, 1, -1);&lt;br /&gt;
  RenderGameScene;&lt;br /&gt;
  &lt;br /&gt;
  glDisable(GL_CLIP_PLANE0);&lt;br /&gt;
  glEnable(GL_CULL_FACE);&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
Das sollte soweit klar sein. Jetzt zu dem eigentlichen Inhalt von RenderWaterMap.&lt;br /&gt;
&lt;br /&gt;
Dort muss zunächst einmal der komplette Viewport geleert werden. Danach sollte der Viewport auf die Größe von WaterTexSize verkleinert werden, damit das Gerenderte letztendlich auch auf die Texturen passt. Jetzt kommen wir langsam zu dem Trick, den ich weiter oben erwähnte: Erst einmal muss die Texturmatrix auf die Identitätsmatrix zurückgesetzt werden. Weiter geht es mit dem ersten Renderpass für die Reflexion. Das Ergebnis sollte in die Reflect-Textur gespeichert werden. Danach die Szene noch einmal rendern (nicht vergessen, vorher die Textur wieder zu unbinden), diesmal jedoch ohne Invertierung der Z-Achse. Das kommt dann logischerweise in die Refract-Textur, weil die ClipPlane hier alles unter der Wasseroberfläche da lässt und den Rest abschneidet. Zu guter Vorletzt den Viewport wieder auf den Zustand zurücksetzen, auf dem er vor dem Rendern war und nochmal den Framebuffer leeren.&lt;br /&gt;
&lt;br /&gt;
Jetzt wird es interessant: In der Texturmatrix müssen folgende Operationen durchgeführt werden: Verschieben um (0.5, 0.5, 0.0) und skalieren um (0.5, 0.5, 0.0). Dann eine Perspektive mit dem Seitenverhältnis, welches wir auch in unserer „echten“ Szene haben erzeugen und danach die Kameraoperationen durchführen.&lt;br /&gt;
&lt;br /&gt;
Und jetzt der Code dazu:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glViewport(0, 0, WaterTexSize, WaterTexSize);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_TEXTURE);&lt;br /&gt;
    glLoadIdentity;&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
&lt;br /&gt;
  DoRenderPass(True);&lt;br /&gt;
&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, Reflect);&lt;br /&gt;
  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, WaterTexSize, WaterTexSize);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, 0);&lt;br /&gt;
&lt;br /&gt;
  if UseWaterShader then&lt;br /&gt;
    glClearColor(0.0, 0.0, 0.0, 0.0);&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  DoRenderPass(False);&lt;br /&gt;
&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, Refract);&lt;br /&gt;
  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, WaterTexSize, WaterTexSize);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, 0);&lt;br /&gt;
&lt;br /&gt;
  // Hier bitte die eigenen Werte einsetzen&lt;br /&gt;
  glViewport(0, 0, Settings.ScreenWidth, Settings.ScreenHeight); &lt;br /&gt;
  &lt;br /&gt;
  glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_TEXTURE);&lt;br /&gt;
    glLoadIdentity;&lt;br /&gt;
    glTranslatef(0.5, 0.5, 0);&lt;br /&gt;
    glScalef(0.5, 0.5, 0);&lt;br /&gt;
    &lt;br /&gt;
    gluPerspective(PERSPECTIVE_FOV, Settings.ScreenWidth/Settings.ScreenHeight, 0.01, 100000);&lt;br /&gt;
    DoCamTranslate;&lt;br /&gt;
    DoCamRotate;&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  &lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, 0);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wasser marsch =&lt;br /&gt;
Jetzt zu der Wasserebene. Sicher kann man sich denken, dass aus dem Weiß noch mehr wird. Jetzt kommen wir zu der Sache mit der Texturmatrix. Die ist dank unserer Routine jetzt so aufgebaut, dass die übergebenen Texturkoordinaten wie in der normalen Projektionsmatrix verarbeitet werden. Das ermöglicht es als Texturkoordinaten genau die Werte zu übergeben, die auch glVertex3f bekommt. Das ist eine große Erleichterung, was vor allem nerviges hin- und hergerechne erspart. Da wir uns erst einmal mit dem non-shader-way befassen wollen, sieht unser Code für die Wasserebene jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;glEnable(GL_TEXTURE_2D);&lt;br /&gt;
&lt;br /&gt;
glColor4f(1.0, 1.0, 1.0, 1.0);&lt;br /&gt;
glBindTexture(GL_TEXTURE_2D, Reflect);&lt;br /&gt;
&lt;br /&gt;
glDepthMask(GL_FALSE);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
  glTexCoord3f(-100.0, -100.0, 0.0);&lt;br /&gt;
  glVertex3f(-100.0, -100.0, 0.0);&lt;br /&gt;
  glTexCoord3f(-100.0, 100.0, 0.0);&lt;br /&gt;
  glVertex3f(-100.0, 100.0, 0.0);&lt;br /&gt;
  glTexCoord3f(100.0, 100.0, 0.0);&lt;br /&gt;
  glVertex3f(100.0, 100.0, 0.0);&lt;br /&gt;
  glTexCoord3f(100.0, -100.0, 0.0);&lt;br /&gt;
  glVertex3f(100.0, -100.0, 0.0);&lt;br /&gt;
glEnd;&lt;br /&gt;
&lt;br /&gt;
glEnable(GL_BLEND);&lt;br /&gt;
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);&lt;br /&gt;
&lt;br /&gt;
glDepthMask(GL_TRUE);&lt;br /&gt;
glBindTexture(GL_TEXTURE_2D, Refract);&lt;br /&gt;
glColor4f(1.0, 1.0, 1.0, RefractAlpha);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
  glTexCoord3f(-100.0, -100.0, 0.0);&lt;br /&gt;
  glVertex3f(-100.0, -100.0, 0.0);&lt;br /&gt;
  glTexCoord3f(-100.0, 100.0, 0.0);&lt;br /&gt;
  glVertex3f(-100.0, 100.0, 0.0);&lt;br /&gt;
  glTexCoord3f(100.0, 100.0, 0.0);&lt;br /&gt;
  glVertex3f(100.0, 100.0, 0.0);&lt;br /&gt;
  glTexCoord3f(100.0, -100.0, 0.0);&lt;br /&gt;
  glVertex3f(100.0, -100.0, 0.0);&lt;br /&gt;
glEnd;&lt;br /&gt;
&lt;br /&gt;
glBindTexture(GL_TEXTURE_2D, 0);&lt;br /&gt;
&lt;br /&gt;
glDisable(GL_TEXTURE_2D);&lt;br /&gt;
glDisable(GL_BLEND);&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Texturkoordinaten sollten ja jetzt klar sein. Zuerst wird die Reflexionstextur gerendert, danach folgt die Refraktionstextur. Dabei wird erstere mit vollem Alpha gerendert und die andere darüber geblendet. Bei den Shadern werden beide Texturen gebunden und an den Shadern übergeben, dazu jedoch gleich mehr. [[Bild:Ld_watertutorial_step1.jpg|thumb|right|Die einfache Wasserebene ohne Wellen (von littleDave)]] Rechts könnt ihr euch von eurem Ergebnis überzeugen.&lt;br /&gt;
&lt;br /&gt;
= Auf zu den Shadern =&lt;br /&gt;
Für die Shader müssen wir eigentlich kaum Änderungen vornehmen, zumindest solange wir beim simplen Einbauen von Wellen bleiben. Gleich werde ich noch auf eine Technik eingehen, die nervige Kanten an Grenzen zu Objekten vermeidet. Die Änderungen betreffen zunächst allein den Code, der die Ebenen selber rendert. Außerdem brauchen wir noch eine weitere Textur, die die Bumpmap der Wasseroberfläche darstellt und für die Wellen verwendet wird. Jetzt werden im Rendercode für die Wasserebene noch einige Änderungen durchgeführt. Zunächst brauchen wir nur noch ein Quad, da der Shader das Überblenden übernimmt. Vor dem Rendern des Quads sollte der Shader gebunden werden, sowie die drei Texturen in drei Textureinheiten geschoben werden, in der Reihenfolge Reflect-Refract-WaterBumpmap. Dann muss noch ein Haufen Parameter an den Shader übergeben werden. Erstmal der Standardkram, die Zuweisung der Texturen. Der Uniform-Integer refractTex wird 1, reflectTex wird 0 und bumpMap wird 2. Dann gibt es noch einige Variablen, die die Darstellung und die Stärke des Wassereffektes beeinflussen: reflectRatio und refractRatio sind ein Faktor, mit dem die Bumpmap multipliziert wird und der die Stärke des Effektes beeinflusst. Ich empfehle für beides einen Wert um 1/20.0. Dann gibt es noch mappingRatio und extendedBlending, die erkläre ich später beim Shader selbst.&lt;br /&gt;
&lt;br /&gt;
Da wir jetzt zwei verschiedene Texturarten verwenden, einmal die projizierten Reflect- und Refracttexturen und die BumpMaptexturen, sollten wir auch noch eine zweite Texturkoordinate übergeben, und zwar für die Bumpmaps. Welchen Wert Ihr hier einsetzt, ist Eure Sache. &lt;br /&gt;
&lt;br /&gt;
Jetzt zu dem Shader, dem wir die Werte übergeben wollen. Erst einmal ein kurzes Brainstorming. Was brauchen wir? Zunächst müssen die Texturen entsprechend der Matrizen transformiert werden. Danach müssen sie wiederum entsprechend der Bumpmaps verschoben werden, so dass ein Welleneffekt entsteht. Dies alles passiert im Fragmentshader. Der Vertexshader dagegen sieht recht harmlos aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;varying mat4 texMat;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;&lt;br /&gt;
  gl_TexCoord[0]  = gl_MultiTexCoord0;&lt;br /&gt;
  texMat = gl_TextureMatrix[0];&lt;br /&gt;
  gl_TexCoord[1]  = gl_MultiTexCoord1;&lt;br /&gt;
  gl_FrontColor   = gl_Color;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Was im Vertexshader passiert, sollte wohl ziemlich klar sein. In Zeile 5 wird erst einmal der Vertex anhand der normalen Matrizen projiziert, so dass es die gleiche Wirkung hat, als wenn man es durch die normale Renderpipe jagen würde. Zeilen Sechs und Acht sind dafür zuständig, dass die Texturkoordinaten auch im Fragmentshader verwendet werden können. Zeile Sieben speichert die Texturmatrix in einer Varying, so dass wir sie ebenfalls im Fragmentshader verwenden können. Die neunte Zeile speichert noch die Farbe - eher unwichtig und man könnte es auch weglassen, aber ich fand es schön ;). Genug der Scherze, weiter mit dem Fragmentshader:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;uniform sampler2D refractTex;&lt;br /&gt;
uniform sampler2D reflectTex;&lt;br /&gt;
uniform sampler2D bumpMap;&lt;br /&gt;
&lt;br /&gt;
uniform float refractRatio;&lt;br /&gt;
uniform float reflectRatio;&lt;br /&gt;
&lt;br /&gt;
uniform float mappingRatio;&lt;br /&gt;
&lt;br /&gt;
uniform int extendedBlending;&lt;br /&gt;
&lt;br /&gt;
varying mat4 texMat;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  vec4 refractcoord;&lt;br /&gt;
  vec4 reflectcoord;&lt;br /&gt;
  vec4 offsetColor = (texture2D(bumpMap, vec2(gl_TexCoord[1])) + &lt;br /&gt;
    texture2D(bumpMap, vec2(gl_TexCoord[1]) * 4.0)) / 2.0;&lt;br /&gt;
  vec4 origOffset = offsetColor;&lt;br /&gt;
  vec4 color;&lt;br /&gt;
  vec4 reflectColor = vec4(1.0, 1.0, 1.0, 1.0);&lt;br /&gt;
  vec4 refractColor = vec4(1.0, 1.0, 1.0, 1.0);&lt;br /&gt;
  vec4 blendedColor;&lt;br /&gt;
  &lt;br /&gt;
  offsetColor -= 0.5;&lt;br /&gt;
  offsetColor *= 2.0;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  refractcoord = gl_TexCoord[0];&lt;br /&gt;
  refractcoord.x += offsetColor[0] * refractRatio;&lt;br /&gt;
  refractcoord.z += offsetColor[1] * refractRatio;&lt;br /&gt;
  refractcoord = texMat * refractcoord;&lt;br /&gt;
  refractColor = texture2DProj(refractTex, refractcoord); &lt;br /&gt;
&lt;br /&gt;
  reflectcoord = gl_TexCoord[0];&lt;br /&gt;
  reflectcoord.x += offsetColor[0] * reflectRatio;&lt;br /&gt;
  reflectcoord.z += offsetColor[1] * reflectRatio;&lt;br /&gt;
  reflectcoord = texMat * reflectcoord;&lt;br /&gt;
  reflectColor = texture2DProj(reflectTex, reflectcoord); &lt;br /&gt;
&lt;br /&gt;
  reflectColor[3] = 1.0;&lt;br /&gt;
  refractColor[3] = 1.0;&lt;br /&gt;
  &lt;br /&gt;
  if (extendedBlending == 0)&lt;br /&gt;
  {&lt;br /&gt;
    float mappingRefract, mappingReflect;&lt;br /&gt;
    mappingRefract = mappingRatio * 255.0;&lt;br /&gt;
    mappingReflect = 255.0 - mappingRefract;&lt;br /&gt;
    mappingRefract /= 255.0;&lt;br /&gt;
    mappingReflect /= 255.0;&lt;br /&gt;
    blendedColor = refractColor * mappingRefract + reflectColor * mappingReflect;&lt;br /&gt;
    blendedColor.a = 1.0;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    float Alpha, reflectAlpha, refractAlpha;&lt;br /&gt;
    Alpha = (refractColor.r + refractColor.g + refractColor.b) / 3.0;&lt;br /&gt;
    if (Alpha &amp;gt; 1.0)&lt;br /&gt;
      Alpha = 1.0;&lt;br /&gt;
    if (Alpha &amp;lt; 0.0)&lt;br /&gt;
      Alpha = 0.0;&lt;br /&gt;
      &lt;br /&gt;
    refractAlpha = Alpha * 255.0;&lt;br /&gt;
    reflectAlpha = 255.0 - refractAlpha;&lt;br /&gt;
    refractAlpha /= 255.0;&lt;br /&gt;
    reflectAlpha /= 255.0;&lt;br /&gt;
    blendedColor = reflectColor * reflectAlpha + refractColor * refractAlpha;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  gl_FragColor = blendedColor;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Das ist recht viel Quelltext auf einmal. Aber wir schauen ihn uns nun  stückchenweise an. Die ersten Zeilen deklarieren die verwendeten Uniforms.  Dann wird noch das texMat-Varying aus dem Vertexshader übernommen. Wie wir bereits vorhin gelernt haben, ist die Texturmatrix unerlässlich, um die Textur einfacher auf die Ebene zu projizieren. Im Hauptcode haben wir dann einen ganzen Haufen Variablendeklarationen. Hervor sticht offsetColor, für das zwei Texturzugriffe verwendet werden, um die Farbe aus der Bumpmap zu lesen. Zwei Zugriffe deshalb, um das Wasser ein wenig detaillierter zu machen. Danach wird offsetColor skaliert: Eine normale Bitmap hat nun einmal nicht die Möglichkeit, negative Werte zu speichern, aber es würde ohne diese sehr eintönig aussehen. Danach wird das Offset für Reflexion und Refraktion berechnet. Das läuft bei beiden ähnlich ab: Die Texturkoordinate wird mit der Matrix multipliziert und erst einmal in einer Variable gespeichert, dann wird der Wert aus der Map gelesen und das Alpha auf 1.0 gesetzt. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ld_watertutorial_step2.jpg|thumb|right|Der zweite Schritt: Die Shader-Wellen sind deutlich sichtbar (von littleDave)]]Weiter geht es mit dem Schalter zwischen erweitertem Blending und normalem Blending. Das erweiterte Blending versucht eine Wasseroberfläche von der Lichtdurchlässigkeit möglichst realistisch darzustellen, indem die Sichtbarkeit der Objekte unterhalb der Oberfläche, also dem Teil in der Refraktionsmap, der Helligkeit der Reflexion angepasst: Wenn man mit einer Lampe auf eine Wasseroberfläche leuchtet, kann man schlechter durch die von der Lampe getroffene Stelle blicken, weil die Reflexion der Lampe das, was darunter liegt, überstrahlt. Zu guter Letzt wird im Shader noch die berechnete Farbe an OpenGL zurückgegeben, sodass sie dann in den Framebuffer geschrieben werden kann. mappingRatio legt übrigens das Verhältnis zwischen Reflexion und Refraktion fest, falls erweitertes Blending deaktiviert ist (also extendedBlending = 0). Ein Wert von 1.0 würde bedeuten, dass nur die Refraktionsmap gerendert wird, ein Blending von 0.0 bedeutet, dass nur die Reflexionsmap durchkommt. Diese Multiplikationen da oben mache ich übrigens, um ein Problem mit der Genauigkeit des Floats im Shader zu umgehen. Rechts nochmal ein Bild zum aktuellen Status. Da erkennt man schon deutlich die Wellen und, wenn man genauer hinschaut, erkennt man auch eine unschöne Linie beim Übergang von der Wasserebene zum Objekt.&lt;br /&gt;
&lt;br /&gt;
= Feintuning =&lt;br /&gt;
Wenn man jetzt einfach einen Würfel in die Wasserfläche setzt, der auf der Vorder- und der Rückseite verschiedene Farben hat, dann wird sichtbar, dass durch die Wellen unschöne Kanten entstehen, weil die Refraktions-/Reflexionsmap keine Objektgrenzen kennt. Doch dafür gibt es eine simple aber dennoch wirkungsvolle Methode, die ich jetzt beschreibe. Hierzu müssen wir den Code für das Rendern der Texturen leicht anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
  glViewport(0, 0, WaterTexSize, WaterTexSize);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_TEXTURE);&lt;br /&gt;
    glLoadIdentity;&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
&lt;br /&gt;
  DoRenderPass(True);&lt;br /&gt;
&lt;br /&gt;
  if UseDepthShader then&lt;br /&gt;
  begin&lt;br /&gt;
    glColorMask(False, False, False, True);&lt;br /&gt;
    glClear(GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
    glUseProgramObjectARB(DepthShader);&lt;br /&gt;
    glUniform1fARB(glGetUniformLocationARB(DepthShader, 'waterplaneZ'), 0.0);&lt;br /&gt;
    DoRenderPass(True);&lt;br /&gt;
    glUseProgramObjectARB(0);&lt;br /&gt;
    glColorMask(True, True, True, True);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, Reflect);&lt;br /&gt;
  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, WaterTexSize, WaterTexSize);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, 0);&lt;br /&gt;
&lt;br /&gt;
  if UseWaterShader then&lt;br /&gt;
    glClearColor(0.0, 0.0, 0.0, 0.0);&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  if UseDepthShader then&lt;br /&gt;
  begin&lt;br /&gt;
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
    glColorMask(True, True, True, True);&lt;br /&gt;
&lt;br /&gt;
    glUseProgramObjectARB(DepthShader);&lt;br /&gt;
    DoRenderPass(False);&lt;br /&gt;
    glUseProgramObjectARB(0);&lt;br /&gt;
    &lt;br /&gt;
    glColorMask(True, True, True, False);&lt;br /&gt;
    glClear(GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  DoRenderPass(False);&lt;br /&gt;
&lt;br /&gt;
  glColorMask(True, True, True, True);   &lt;br /&gt;
&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, Refract);&lt;br /&gt;
  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, WaterTexSize, WaterTexSize);&lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, 0);&lt;br /&gt;
&lt;br /&gt;
  // Hier bitte die eigenen Werte einsetzen&lt;br /&gt;
  glViewport(0, 0, Settings.ScreenWidth, Settings.ScreenHeight); &lt;br /&gt;
  &lt;br /&gt;
  glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
  glMatrixMode(GL_TEXTURE);&lt;br /&gt;
    glLoadIdentity;&lt;br /&gt;
    glTranslatef(0.5, 0.5, 0);&lt;br /&gt;
    glScalef(0.5, 0.5, 0);&lt;br /&gt;
    &lt;br /&gt;
    gluPerspective(PERSPECTIVE_FOV, Settings.ScreenWidth/Settings.ScreenHeight, 0.01, 100000);&lt;br /&gt;
    DoCamTranslate;&lt;br /&gt;
    DoCamRotate;&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  &lt;br /&gt;
  glBindTexture(GL_TEXTURE_2D, 0);&amp;lt;/source&amp;gt;&lt;br /&gt;
Wieder ein riesiger Codeblock, aber das meiste kennen wir ja bereits. Das einzige, was dazugekommen ist, sind die if UseDepthShader-Blöcke. UseDepthShader ist mal wieder eine Variable, die Ihr ruhig deklarieren solltet, um die Verwendung des DepthShaders einzuschränken. DepthShader sollte wieder mal eine Variable für den Namen des Shaderprogramms sein. Ich missbrauche hier den Alpha-Kanal der Texturen für Tiefeninformationen. Dies ist insofern sinnvoll, dass man nicht extra eine Textur braucht und daher auch die Shader relativ einfach zu erweitern sind. Aber jetzt erst einmal zum Tiefenshader. Hier haben wir wieder einen recht unspektakulären Vertexshader:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;varying vec4 vpos;&lt;br /&gt;
varying vec4 ppos;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  vpos = gl_ModelViewMatrix * gl_Vertex;&lt;br /&gt;
  ppos = gl_ModelViewProjectionMatrix * gl_Vertex;&lt;br /&gt;
  gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;&lt;br /&gt;
  gl_FrontColor   = gl_Color;&lt;br /&gt;
  gl_ClipVertex = vpos;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Obwohl es eher wie ein normaler Shader aussieht, ist es doch interessanter als man glaubt. Jetzt kommt uns der Vorteil zugute, dass wir die Kamera in der Projektionsmatrix haben. Wir können einfach die Kameraoptionen außen vor lassen und nur die Operationen, die in der Modelview-Matrix stehen auf den Vertex anwenden. Das erleichtert das Errechnen des Z-Wertes des Vertex ungemein. Jetzt zum Fragmentshader:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;uniform float waterplaneZ;&lt;br /&gt;
&lt;br /&gt;
varying vec4 vpos;&lt;br /&gt;
varying vec4 ppos;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  float y, z;&lt;br /&gt;
  y = waterplaneZ - vpos.z;&lt;br /&gt;
  z = ppos.z;&lt;br /&gt;
  &lt;br /&gt;
  gl_FragColor = vec4(z, z, z, y);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier werden die im Vertexshader berechneten Werte verwendet, um die Höhe des Vertices in den Alphakanal zu schreiben. Angemerkt werden sollte, dass die RGB-Informationen dank des glColorMask in RenderWaterMap verworfen werden. WaterplaneZ ist übrigens der Z-Wert der Wasserebene, in unserem Beispiel also 0.0, wie aus dem obigen Code hervorgeht.&lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir nur noch den Wassershader so verändern, dass er die jetzt im Alphakanal vorhandenen Informationen auch sinnvoll nutzt. Der Vertexshader bleibt dabei, wie er ist, aber der Fragmentshader sieht jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;glsl&amp;quot;&amp;gt;uniform sampler2D refractTex;&lt;br /&gt;
uniform sampler2D reflectTex;&lt;br /&gt;
uniform sampler2D bumpMap;&lt;br /&gt;
&lt;br /&gt;
uniform float refractRatio;&lt;br /&gt;
&lt;br /&gt;
uniform float reflectRatio;&lt;br /&gt;
&lt;br /&gt;
uniform float mappingRatio;&lt;br /&gt;
&lt;br /&gt;
uniform int extendedBlending;&lt;br /&gt;
&lt;br /&gt;
varying mat4 texMat;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
  vec4 refractcoord;&lt;br /&gt;
  vec4 reflectcoord;&lt;br /&gt;
  vec4 offsetColor = (texture2D(bumpMap, vec2(gl_TexCoord[1])) + &lt;br /&gt;
    texture2D(bumpMap, vec2(gl_TexCoord[1]) * 4.0)) / 2.0;&lt;br /&gt;
  vec4 origOffset = offsetColor;&lt;br /&gt;
  vec4 color;&lt;br /&gt;
  vec4 reflectColor = vec4(1.0, 1.0, 1.0, 1.0);&lt;br /&gt;
  vec4 refractColor = vec4(1.0, 1.0, 1.0, 1.0);&lt;br /&gt;
  vec4 blendedColor;&lt;br /&gt;
  &lt;br /&gt;
  offsetColor -= 0.5;&lt;br /&gt;
  offsetColor *= 2.0;&lt;br /&gt;
&lt;br /&gt;
  refractcoord = texMat * gl_TexCoord[0];&lt;br /&gt;
  refractColor = texture2DProj(refractTex, refractcoord);&lt;br /&gt;
  refractcoord = gl_TexCoord[0];&lt;br /&gt;
  refractcoord.x += offsetColor[0] * refractColor[3] * refractRatio;&lt;br /&gt;
  refractcoord.z += offsetColor[1] * refractColor[3] * refractRatio;&lt;br /&gt;
  refractcoord = texMat * refractcoord;&lt;br /&gt;
&lt;br /&gt;
  reflectcoord = texMat * gl_TexCoord[0];&lt;br /&gt;
  reflectColor = texture2DProj(reflectTex, reflectcoord);&lt;br /&gt;
  reflectcoord = gl_TexCoord[0];&lt;br /&gt;
  reflectcoord.x -= offsetColor[0] * reflectColor[3] * reflectRatio;&lt;br /&gt;
  reflectcoord.z -= offsetColor[1] * reflectColor[3] * reflectRatio;&lt;br /&gt;
  reflectcoord = texMat * reflectcoord;&lt;br /&gt;
  &lt;br /&gt;
  reflectColor = texture2DProj(reflectTex, reflectcoord);&lt;br /&gt;
  refractColor = texture2DProj(refractTex, refractcoord);&lt;br /&gt;
&lt;br /&gt;
  reflectColor[3] = 1.0;&lt;br /&gt;
  refractColor[3] = 1.0;&lt;br /&gt;
  &lt;br /&gt;
  if (extendedBlending == 0)&lt;br /&gt;
  {&lt;br /&gt;
    float mappingRefract, mappingReflect;&lt;br /&gt;
    mappingRefract = mappingRatio * 255.0;&lt;br /&gt;
    mappingReflect = 255.0 - mappingRefract;&lt;br /&gt;
    mappingRefract /= 255.0;&lt;br /&gt;
    mappingReflect /= 255.0;&lt;br /&gt;
    blendedColor = refractColor * mappingRefract + reflectColor * mappingReflect;&lt;br /&gt;
    blendedColor.a = 1.0;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    float Alpha, reflectAlpha, refractAlpha;&lt;br /&gt;
    Alpha = (refractColor.r + refractColor.g + refractColor.b) / 3.0;&lt;br /&gt;
    if (Alpha &amp;gt; 1.0)&lt;br /&gt;
      Alpha = 1.0;&lt;br /&gt;
    if (Alpha &amp;lt; 0.0)&lt;br /&gt;
      Alpha = 0.0;&lt;br /&gt;
      &lt;br /&gt;
    refractAlpha = Alpha * 255.0;&lt;br /&gt;
    reflectAlpha = 255.0 - refractAlpha;&lt;br /&gt;
    refractAlpha /= 255.0;&lt;br /&gt;
    reflectAlpha /= 255.0;&lt;br /&gt;
    blendedColor = reflectColor * reflectAlpha + refractColor * refractAlpha;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  gl_FragColor = blendedColor;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ld_watertutorial_step3.jpg|thumb|right|Der finale Wassereffekt mit Wellen und &amp;quot;Kantenerkennung&amp;quot; (von littleDave)]]Der neue Code multipliziert das Offset nochmal mit dem Alpha-Wert, in unserem Falle also die Distanz zwischen der Wasserebene und dem Pixel. Dadurch werden die Wellen je näher der Pixel an der Wasseroberfläche ist, immer niedriger. So werden an der direkten Kante zu dem Objekt, also da, wo der Alpha-Wert 0.0 ist, gar keine Wellen mehr erzeugt. Damit ist die nervige Kante weg. So sieht das ganze zum Schluss aus.&lt;br /&gt;
&lt;br /&gt;
= In the end... =&lt;br /&gt;
Das war es eigentlich. Wenn alles so läuft, wie es soll, dann habt ihr jetzt eine schöne Ebene mit Wassereffekt. Die Shader sowie der andere Code dürfen natürlich beliebig weiterverwendet werden. Verbesserungsvorschläge, Kritik, Feedback jeglicher Art und Morddrohungen wie immer einfach an mich im Forum wenden.&lt;br /&gt;
&lt;br /&gt;
glEnd;&lt;br /&gt;
&lt;br /&gt;
Gruss [[Benutzer:Lord Horazont|Lord Horazont]]&lt;br /&gt;
&lt;br /&gt;
{{TUTORIAL_NAVIGATION|[[Tutorial Alphamasking]]|-}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tutorial|Wassereffekt]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glGenerateMipmap&amp;diff=26162</id>
		<title>glGenerateMipmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glGenerateMipmap&amp;diff=26162"/>
				<updated>2014-03-09T10:52:30Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Parameter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=glGenerateMipmap=&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glGenerateMipmap''' - erzeugt [[MipMaps]] für die an ''target'' gebundene Textur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glGenerateMipmap'''(''target'' : GLenum);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &lt;br /&gt;
 &amp;lt;td&amp;gt;''target''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Spezifiziert das Ziel, an das die Textur gebunden ist, zu der MipMaps generiert werden sollen. ''target'' darf einer der folgenden Werte sein:&lt;br /&gt;
'''GL_TEXTURE_1D'''​, '''GL_TEXTURE_2D'''​, '''GL_TEXTURE_3D​''', '''GL_TEXTURE_1D_ARRAY'''​, '''GL_TEXTURE_2D_ARRAY​''', '''GL_TEXTURE_CUBE_MAP​''' oder '''GL_TEXTURE_CUBE_MAP_ARRAY'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
'''glGenerateMipmap''' generiert [[MipMaps]] für die Textur, die an ''target'' der aktiven Textureunit (siehe [[glActiveTexture]]) gebunden ist. Dabei werden alle MipMap-Level &amp;gt; 0 neu berechnet und ihr alter Inhalt überschrieben. Die Basistextur (Level 0) bleibt dabei unverändert. Das interne Format der abgeleiteten MipMaps ist das gleiche wie das der Basistextur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glGenerateMipmap''' ist erst ab OpenGL 3.0 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehler ==&lt;br /&gt;
'''GL_INVALID_ENUM​''' wird generiert, wenn ''target​'' keins der oben aufgelisteten Werte ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION​''' wird generiert, wenn ''target​'' '''GL_TEXTURE_CUBE_MAP​''' ist und die an '''GL_TEXTURE_CUBE_MAP'''​ gebundene Textur der aktiven Texturunit nicht Cube-vollstänig ist.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glTexImage]], [[glTexParameter]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|GenerateMipmap]]&lt;br /&gt;
[[Kategorie:GL3|GenerateMipmap]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glGenerateMipmap&amp;diff=26161</id>
		<title>glGenerateMipmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glGenerateMipmap&amp;diff=26161"/>
				<updated>2014-03-09T10:51:32Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Parameter */ Rechtschreibfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=glGenerateMipmap=&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glGenerateMipmap''' - erzeugt [[MipMaps]] für die an ''target'' gebundene Textur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glGenerateMipmap'''(''target'' : GLenum);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &lt;br /&gt;
 &amp;lt;td&amp;gt;''target''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Spezifiziert das Ziel, an das die Textur gebunden ist, zu der MipMaps generiert werden sollen. ''target'' darf einer der folgenden Werte sein:&lt;br /&gt;
'''GL_TEXTURE_1D'''​, '''GL_TEXTURE_2D'''​, '''GL_TEXTURE_3D​''', '''GL_TEXTURE_1D_ARRAY'''​, '''GL_TEXTURE_2D_ARRAY​''', '''GL_TEXTURE_CUBE_MAP​''' oder '''GL_TEXTURE_CUBE_MAP_ARRAY'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
'''glGenerateMipmap''' generiert [[MipMaps]] für die Textur, die an ''target'' der aktiven Textureunit (siehe [[glActiveTexture]]) gebunden ist. Dabei werden alle MipMap-Level &amp;gt; 0 neu berechnet und ihr alter Inhalt überschrieben. Die Basistextur (Level 0) bleibt dabei unverändert. Das interne Format der abgeleiteten MipMaps ist das gleiche wie das der Basistextur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
'''glGenerateMipmap''' ist erst ab OpenGL 3.0 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehler ==&lt;br /&gt;
'''GL_INVALID_ENUM​''' wird generiert, wenn ''target​'' keins der oben aufgelisteten Werte ist.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION​''' wird generiert, wenn ''target​'' '''GL_TEXTURE_CUBE_MAP​''' ist und die an '''GL_TEXTURE_CUBE_MAP'''​ gebundene Textur der aktiven Texturunit nicht Cube-vollstänig ist.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glTexImage]], [[glTexParameter]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|GenerateMipmap]]&lt;br /&gt;
[[Kategorie:GL3|GenerateMipmap]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Mix_QuerySpec&amp;diff=26160</id>
		<title>Mix QuerySpec</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Mix_QuerySpec&amp;diff=26160"/>
				<updated>2014-03-07T11:13:35Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Siehe auch */ Kategoriefehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mix_QuerySpec =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''Mix_QuerySpec''' - Gibt Informationen über die aktuellen Audiospezifikationen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 function Mix_QuerySpec( var ''frequency'' : Integer; var ''format'' : UInt16; var ''channels'' : Integer ) : Integer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''frequency'' &lt;br /&gt;
| Die Variable, in die später die aktuelle Sample-Rate geschrieben wird.&lt;br /&gt;
|-&lt;br /&gt;
! ''format'' &lt;br /&gt;
| Die Variable, in die später das Audioformat geschrieben wird.&lt;br /&gt;
|-&lt;br /&gt;
! ''channels'' &lt;br /&gt;
| Die Variable, in die später die Anzahl der Audiokanäle geschrieben wird (1 für Mono, 2 für Stereo)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Gibt das aktuelle Audioformat, welches gerade von dem geöffneten Gerät verwendet wird. Diese müssen nicht unbedingt mit den Werten, die zuvor an [[Mix_OpenAudio]] übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Rückgabewert ==&lt;br /&gt;
0 bei einem Fehler. Wenn das Gerät geöffnet ist, dann wird die Anzahl der [[Mix_OpenAudio]] Aufrufe zurückgegeben. Die Werte der Variablen werden bei einem Fehler nicht gesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Mix_OpenAudio]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:SDLMixer|QuerySpec]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Mix_AllocateChannels&amp;diff=26159</id>
		<title>Mix AllocateChannels</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Mix_AllocateChannels&amp;diff=26159"/>
				<updated>2014-03-07T11:12:44Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Siehe auch */ Kategoriefehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mix_AllocateChannels =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''Mix_AllocateChannels''' - Reserviert Mixerkanäle für die Nutzung durch SDL_Mixer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 function '''Mix_AllocateChannels'''( ''numchannels'' : Integer ) : Integer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; rules=&amp;quot;all&amp;quot;&lt;br /&gt;
! ''numchannels'' &lt;br /&gt;
| Anzahl der Kanäle, die zum Mixen bereitstehen sollten. Eine negative Anzahl wird keine Änderung vornehmen, sondern es wird nur die aktuelle Anzahl zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Setzt die Anzahl der Kanäle, die zum Mixen verwendet werden sollen. Diese Funktion kann mehrfach aufgerufen werden, auch wenn gerade Sound abgespielt wird. Wenn ''numchannels'' kleiner als die vorhandene Kanalanzahl, dann werden die höheren Kanäle freigegeben und daher nicht länger abgespielt. Es ist möglicherweise keine so gute Idee, die Anzahl tausendmal in der Sekunde zu ändern.&lt;br /&gt;
Wenn Kanäle freigegeben werden, werden die Callbacks die durch [[Mix_ChannelFinished]] gesetzt wurden ausgeführt wenn die Kanäle zum Freigeben angehalten werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Wenn null übergeben wird, werden ''alle'' Kanäle freigebenen, Musik wird aber aufgrund der anderen internen Behandlung weiter abgespielt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Rückgabewert ==&lt;br /&gt;
Gibt die Anzahl der reservierten Kanäle zurück. Dies schlägt niemals fehl... aber eine hohe Anzahl an Kanälen kann Fehler verursachen wenn ein Out-of-Memory auftritt. Hier geht es um ''wirklich'' hohe Werte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Mix_OpenAudio]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:SDLMixer|AllocateChannels]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=SDL_GetError&amp;diff=26158</id>
		<title>SDL GetError</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=SDL_GetError&amp;diff=26158"/>
				<updated>2014-03-07T11:11:04Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Siehe auch */ Kategoriefehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SDL_GetError =&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''SDL_GetError''' - Liefert einen String zurück der den letzten aufgetretenen Fehler näher beschreibt. Ab Version 1.0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 function '''SDL_GetError''': PChar;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
'''SDL_GetError''' liefert einen String zurück der den letzten aufgetretenen Fehler näher beschreibt. Besonders bei der Initalisierung sollte überprüft werden, ob angeforderte Ressourcen auch zur Verfügung stehen. Wird statt eines Ergebnisses ein NIL-Wert zurückgegeben, empfiehlt es sich mit '''SDL_GetError''' den aufgetretenen Fehler auszugeben. Dies erleichtert in der Praxis sehr häufig die Diagnose eines Problems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Wir versuchen künstlich einen Fehler hervorzurufen indem wir als gewünschte Bildschirmauflösung negative Werte angeben. Die daraus resultierende Ausgabe lautet: ''Invalid width or height''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;[...]&lt;br /&gt;
surface := SDL_SetVideoMode(-800, -600, -32, videoflags);&lt;br /&gt;
if not assigned(surface) then&lt;br /&gt;
begin&lt;br /&gt;
  WriteLn(SDL_GetError);&lt;br /&gt;
  Quit_App;&lt;br /&gt;
end;&lt;br /&gt;
[...]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glGetError]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:SDL|GetError]]&lt;br /&gt;
[[Kategorie:SDL2|GetError]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=SDL_GetCursor&amp;diff=26157</id>
		<title>SDL GetCursor</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=SDL_GetCursor&amp;diff=26157"/>
				<updated>2014-03-07T11:09:42Z</updated>
		
		<summary type="html">&lt;p&gt;Glawesome: /* Siehe auch */ Kategoriefehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SDL_GetCursor =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''SDL_GetCursor''' - Gibt den aktuellen Mauszeiger zurück&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 function '''SDL_GetCursor''': PSDL_Cursor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
Gibt einen Pointer auf den aktuell verwendeten Mauszeiger der Surface zurück.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Rückgabewert ==&lt;br /&gt;
Der Pointer auf den aktuell verwendeten Mauszeiger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[SDL_CreateCursor]], [[SDL_SetCursor]], [[SDL_ShowCursor]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:SDL|GetCursor]]&lt;/div&gt;</summary>
		<author><name>Glawesome</name></author>	</entry>

	</feed>