<?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=Lyr</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=Lyr"/>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php/Spezial:Beitr%C3%A4ge/Lyr"/>
		<updated>2026-04-17T09:39:06Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Blur&amp;diff=19836</id>
		<title>Diskussion:Blur</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Blur&amp;diff=19836"/>
				<updated>2006-10-30T05:06:35Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich finde es ja sehr nett das jemand das Gaussian Blur etwas ausführlicher erklärt, aber den ein oder anderen Punkt habe ich doch noch zu bemängeln:&lt;br /&gt;
&lt;br /&gt;
1. In einem Blur-Artikel sollte doch eine ganz ganz triviale Blur Matrix (oder ein Kernel wie man ihn auch immer bezeichnen will) auch drinnen sein, also das 1/9 für alle (Gleichberechtigung halt :-) ), hast du in deinem Gedankenexperiment kurz angeschnitten aber da es nicht nur ein Gedankenexperiment ist sondern auch in der Praxis häufig verwendet wird wäre es durchaus etwas detailierter erwähnenswert.&lt;br /&gt;
&lt;br /&gt;
2. In der 2D-Gauss-Verteilung sollte es wohl weniger e^(...x²+x²...) heißen sondern e^(...x²+y²...) :-).&lt;br /&gt;
&lt;br /&gt;
3. Bitte bitte vergleicht [[Motion-Blur]] nicht mehr mit stink normalen Blur ... obwohl es natürlich einen gewissen Zusammenhang gibt, passt er in diesen Artikel (bzw. in diesem Zusammenhang) meines Erachtens eher wenig rein.&lt;br /&gt;
&lt;br /&gt;
Ansonnsten finde ich den Artikel wirklich nett, nur weiter so!&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 06:06, 30. Okt 2006 (CET)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Motion-Blur&amp;diff=19835</id>
		<title>Motion-Blur</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Motion-Blur&amp;diff=19835"/>
				<updated>2006-10-30T04:59:50Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Mal eine erste Version ... Experte bin ich auch keiner&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Motion Blur ist üblicherweise kein Effekt den man macht weil er schön ist, sondern ein Effekt der bei der Übertragung von digitalen Bildern zum menschlichen Auge eine Art Vermittlungsrolle spielt.&lt;br /&gt;
&lt;br /&gt;
== Biologische Grundlagen ==&lt;br /&gt;
Das menschliche Auge nimmt etwa 25 Bilder je Sekunde wahr. Im Unterschied zur Computergrafik sind dies jedoch keine Momentaufnahmen sondern eine Art Aufsummierung aller Lichtreize die während dieser 1/25 Sekunde entstanden sind.&lt;br /&gt;
&lt;br /&gt;
=== Ein leuchtender Punkt ===&lt;br /&gt;
Nehmen wir als Beispiel einen schwarzen Hintergrund. Über diesen schwarzen Hintergrund wandert (verhältnismäßig schnell) ein Licht. In der Computergrafik wenn wir beispielsweise 60 Frames pro Sekunde darstellen können würden wir 60 Momentaufnahmen darstellen, wobei in diesen Momentaufnahmen die Bewegung des Lichtpunktes keine Rolle spielen würde. Das menschliche Auge hingegen erhält nicht 25 Momentaufnahmen, sondern eine analoge Darstellung des Lichtsignales. Dieses analoge Lichtsignal wird nun (wie bereits erwähnt) während der gesamten 1/25 Sekunde aufsummiert und als solches an das Gehirn übertragen. Somit sehen wir nicht einzelne Momentaufnahmen des Lichtes sondern den gesamten Weg den das Licht zurückgelegt hat.&lt;br /&gt;
&lt;br /&gt;
Wenn wir die Tatsache annehmen, dass wir nur 25 Bilder je Sekunde sehen, so können wir dies durch ein sehr einfaches Experiment nachvollziehen:&lt;br /&gt;
&lt;br /&gt;
Begebt euch in einen möglichst dunklen Raum und vollführt mit einem Licht (zB Feuerzeug) verhältnismäßig schnelle Bewegungen. Ihr könnt nun den gesamten Weg sehen den das Licht zurückgelegt hat.&lt;br /&gt;
&lt;br /&gt;
== Technische Umsetzung ==&lt;br /&gt;
&lt;br /&gt;
=== Filme ===&lt;br /&gt;
Wenn ihr euch einen Film anseht, so scheinen die Bewegungen üblicherweise realer als in einem Computerspiel. Wenn ihr euch ein Standbild eines Filmes anseht so wird offensichtlich weshalb dies der Fall ist. Der Film besitzt üblicherweise zwar nur 25 Bilder je Sekunde jedoch besitzen diese Bilder (gleich zum menschlichen Auge) die aufsummierte Helligkeit der 1/25 Sekunde, was in einem Standbild durch Streifen sichtbar wird. Diese Streifen kann man nun als Idealfall von Motion Blur ansehen.&lt;br /&gt;
&lt;br /&gt;
=== Computergrafik ===&lt;br /&gt;
In der Computergrafik stellt man üblicherweise Standbilder dar. Es wäre enorm aufwändig die Berechnungen durchzuführen welche Farbe und welche Helligkeit ein Pixel haben würde, würde es die letzte 1/25 Sekunde darstellen und nicht nur eine Momentaufnahme. Glücklicherweise ist der Mensch nicht ganz so wählerisch und begnügt sich auch mit etwas besseren Darstellungen seiner Wirklichkeit, somit ist es um einiges besser wenn man beispielsweise 60 Momentaufnahmen je Sekunde besitzt als wenn man nur 25 Momentaufnahmen besitzt.&lt;br /&gt;
&lt;br /&gt;
== Motion Blur in der Praxis ==&lt;br /&gt;
Motion Blur ist also ein Effekt der das menschliche Auge möglichst zufriedenstellen soll. Bei verhältnismäßig langsamen Geschwindigkeiten (oder aber bei sehr hohen Frames je Sekunde) hat Motion Blur kaum bis keine Auswirkungen. Erst bei höheren Geschwindigkeiten kann Motion Blur sinnvoll eingesetzt werden. Hier geht es jedoch teilweise nicht nur darum allein das Standbild durch grafische Effekte zu verbessern, sondern im Idealfall geht es darum für jedes Pixel die vergangene 1/25 Sekunde zu beachten.&lt;br /&gt;
&lt;br /&gt;
In Filmen sehen wir Motion Blur dann, wenn enorm hohe Geschwindigkeiten dargestellt werden sollen (annähernd Lichtgeschwindigkeit in Science Fiction Filmen). Obwohl ich weder ein Physiker noch ein Biologe bin, kann ich guten Gewissens behaupten, dass wir ein Raumschiff welches mit (annähernd) Lichtgeschwindigkeit an uns vorbei fliegt wohl so gut wie gar nicht sehen würden, da es nur einen sehr sehr kleinen Bruchteil einer 1/25 Sekunde sichtbar wäre ... einzige Ausnahme wäre natürlich wenn es enorm hell wäre, wodurch dieser sehr kleine Bruchteil viel bei der Aufsummierung der 1/25 Sekunde ausmachen könnte.&lt;br /&gt;
&lt;br /&gt;
In der Computergrafik bezieht sich Motion Blur üblicherweise ausschließlich auf Momentaufnahmen wo die aktuelle Geschwindigkeit beachtet wird, oder aber die vorangegangenen Frames ebenfall einen Einfluss besitzen.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:DelphiGL&amp;diff=19652</id>
		<title>Diskussion:DelphiGL</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:DelphiGL&amp;diff=19652"/>
				<updated>2006-09-15T13:26:47Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Mitgliederentwicklung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Geschichte==&lt;br /&gt;
&lt;br /&gt;
So wie's aussieht gab's hier wohl keine &amp;quot;frühsten Anfänge&amp;quot; ;-) Die DGL war auf einmal da :P&lt;br /&gt;
&lt;br /&gt;
Ne, wäre echt schön, wenn hier einmal eine kleine Geschichtsbeschreibung ähnlich der für [[omwiki:Projektgeschichte|Projektgeschichte für Omorphia (ext)]] zu finden wäre.&lt;br /&gt;
&lt;br /&gt;
Ich kann leider zu diesem Beitrag nichts selber beisteuern, da ich erst wesentlich später zur DGLC gekommen bin.&lt;br /&gt;
&lt;br /&gt;
MfG, --[[Benutzer:BenBE|BenBE]] 21:05, 14. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
Das gibts ja jetzt ;)&lt;br /&gt;
Hab mir auch erlaubt, in dem Text von Phobeus ein paar Sachen, die mir fehlerhaft erschienen, zu ändern bzw. auszubessern.&lt;br /&gt;
Hab außerdem hier mal die Diskussionsseite bisschen formatiert.&lt;br /&gt;
--[[Benutzer:Luketheduke|luketheduke]] 15:19, 30. Mai 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
==Mitgliederentwicklung==&lt;br /&gt;
Hallo, bei der Bildunterschrift zum Diagramm &amp;quot;Mitgliederentwicklung&amp;quot; kann ich mit den Zahlen &amp;quot;18.09&amp;quot;, &amp;quot;21.83&amp;quot; und &amp;quot;25.83&amp;quot; kaum was anfangen. Trennpunkte müssten ja wohl beim Tausender-Schritt stehen (&amp;quot;1.809&amp;quot;), und Dezimalstellen kommen mir 1. unwahrscheinlich vor und 2. im Deutschen bitte ein Komma. Oder zumindest einen Hinweis.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Luketheduke|luketheduke]] 12:11, 2. Apr 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da steht doch monatliches Wachstum 18.09 Mitglieder. Das heißt soviel wie, pro Monat wächst die Comunity um 18 Mitglieder.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Wäre vielleicht noch interessant die aktiven Mitglieder einzutragen. Aktiv könnte man hiebei als: &amp;quot;Hat in den letzten X Monaten einen Forenbeitrag geschrieben&amp;quot;, &amp;quot;War in den letzten X Monaten einmal eingeloggt&amp;quot; oder ähnlich definieren. Weil die Anzahl der Benutzer, egal ob sie überhaupt mal eingeloggt haben oder nicht, sagt nicht wirklich allzu viel aus. Ist historisch wohl nicht so leicht zu machen (vor allem wenn man das letzte einloggen als aktiv definiert) aber man könnte ja mal damit anfangen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 15:26, 15. Sep 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Allgemein (Aus Diskussion zum Vorschlag für Exzellente Artikel) ==&lt;br /&gt;
&lt;br /&gt;
Kann mich Flash und Lyr in Bezug auf den [[DelphiGL]]-Artikel nur anschließen. Außerdem würde ich in Bezug auf die Gestaltung 2 Dinge bemängeln, die als zwingende Vorgaben zu sehen sind:&lt;br /&gt;
#Als Illustration werte ich keinesfalls das zeigen eines Graphen, der die Mitgliederzahl in Abhängigkeit von der Zeit enthält, oder Tabellen, die deren erste Ableitung enthalten. Außerdem ist der Verweis auf die Mitgliederkarte zwar sinnvoll, ist aber auch etwas &amp;quot;lieblos&amp;quot; im Artikel reingeschmissen. Der Artikel muss also in Hinblick auf die äußere (gleichmäßige) Formatierung\Gestaltung auf jeden Fall überarbeitet werden.&lt;br /&gt;
#Zweitens zweifle ich stark die Vollständigkeit dieses Artikels an. Es gibt nämlich nicht nur die frühsten Anfänge und ein Jetzt, sondern auch (2-3 Jahre) dazwischen, die mir in diesem Artikel teilweise (bis ganz) fehlen. Auch ist der unter [[DelphiGL#Historie_im_Überblick]] gezeigte Zeitgraph an relativ vielen Stellen relativ weiß, was IMHO nicht für dessen Vollständigkeit spricht. Weiterhin fehlt in Bezug auf die Aprilscherze, die angeführt werden, die Informationen für die Jahre 2003 und 2004.&lt;br /&gt;
Insgesamt gefällt mir der Artikel also aus folgenden Gründen nicht:&lt;br /&gt;
#Aufmachung und Layout-Gestaltung&lt;br /&gt;
#Präsentation\Gliederung der Informationen&lt;br /&gt;
#Vollständigkeit der dargebrachten informationen&lt;br /&gt;
--[[Benutzer:BenBE|BenBE]] 18:12, 1. Jul 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Level_of_Detail&amp;diff=19615</id>
		<title>Diskussion:Level of Detail</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Level_of_Detail&amp;diff=19615"/>
				<updated>2006-09-11T20:00:44Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sind VIPMs = VDPMs? &lt;br /&gt;
Auf jeden Fall nochmal die Links im Artikel und der LOD-Übersicht im Techniken-teil checken. &lt;br /&gt;
Eventuell wurden VIPMs doppelt aufgeführt.&lt;br /&gt;
--[[Benutzer:Flash (Kevin Fleischer)|Flash (Kevin Fleischer)]] 14:47, 21. Jan 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
Bin ich auch etwas spät dran aber gerade darüber gestoßen:&lt;br /&gt;
&lt;br /&gt;
Nein VIPM ist nicht gleich VDPM das eine heißt View independent -, das andere View dependent - progressive Meshes. Obwohl beide recht ähnlich klingen, teilweise auf ähnlichen Ideen basieren und sogar von der selben Person stammen verfolgen sie doch 2 komplett unterschiedliche Ansätze. VDPMs sind nur bei weiterm nicht so populär geworden wie VIPMs, weil VDPMs (wie man durch den kleinen Unterschied im Namen vielleicht schon erkennen kann) doch eher CPU-lastig sind. Wenns jemanden interessiert (und vielleicht schreibt ja auch jemand was darüber) hier findet man das Paper:&lt;br /&gt;
&lt;br /&gt;
http://research.microsoft.com/~hoppe/&lt;br /&gt;
&lt;br /&gt;
View-dependent refinement of progressive meshes.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 22:00, 11. Sep 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Triangulation&amp;diff=19597</id>
		<title>Diskussion:Triangulation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Triangulation&amp;diff=19597"/>
				<updated>2006-09-08T03:36:02Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;@Flash: ich nehme an bei dem Artikel hast du auch einiges aus dem Uni-Script? :-).&lt;br /&gt;
&lt;br /&gt;
Das triangulieren passiert auf der Grafikkarte und dort ist es nicht mehr und nicht weniger als ein paar Vertices doppelt zu verwenden. Bei lauter Dreiecken hat man also irgend etwas wie:&lt;br /&gt;
 for i = 1 bis Punkte: zeichne Dreieck( Punkt[i], Punkt[i+1], Punkt[i+2] ); i += 3;&lt;br /&gt;
Bei einem Triangle Strip etwa:&lt;br /&gt;
 for i = 1 bis Punkte-2: zeichne Dreieck( Punkt[i], Punkt[i+1], Punkt[i+2] ); i += 1;&lt;br /&gt;
Bei einem Quad, Triangle Fan und natürlich auch bei einem Polygon sieht das nicht viel anders aus. Das ist natürlich irgendwie in Hardware implementiert aber da bin ich nicht so der Spezialist dafür. Dennoch ... wenn mir irgend jemand einreden möchte, dass die 2. Variante relevant länger braucht als die 1ste, dann sollte er dafür schon gute Gründe haben. Und bei der 2. Variante sparen wir natürlich viel Bandbreite auf unserem AGP Bus.&lt;br /&gt;
&lt;br /&gt;
Also wenn man in Bezug auf OGL von Triangulation spricht, dann ist das eine der einfachsten Sachen der Welt. Wenn man von konkaven Polygonen (oder was auch immer) und Triangulation spricht, dann spricht man nicht mehr von OGL, weil OGL kann das nicht.&lt;br /&gt;
&lt;br /&gt;
Wollte schon anfangen den Artikel um zu schreiben, aber irgendwie wird das dann bei mir ein 5 Zeiler oder sowas, das wollte ich dann auch wieder nicht ... also vielleicht lässt sich ja jemand einen schön ausgeschmückten 10-Zeiligen Text einfallen :-).&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 16:20, 7. Sep 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nun das Wiki ist zwar OGL orientiert, aber hier gehts durchaus auch um techniken der allgemeinen Computergrafik.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 16:54, 7. Sep 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Stimmt schon, aber ich finde den Artikel halt etwas irritierend. Da heißt es zum einen: &amp;quot;Wenn ihr die Möglichkeit habt, dann baut eure Szene von Anfang an aus Dreiecken auf.&amp;quot; was ich zu Beginn (bevor ich weiter las) so aufgefasst habe, dass man keine (konvexen) Polygone, Quads, Triangle-Strips und -Fans verwenden soll sondern Dreiecke, was natürlich üblicherweise falsch ist. Weiter unten heißt es dann aber doch dass man Tri-Strips und -Fans verwenden soll und da Polygon = Triangle Fan und Quad ~= Triangle Strip mit 4 Punkten bleibt für den obigen Satz (über das aufteilen in Dreiecke) nur noch die Vermutung dass da konkave Polygone gemeint sind. Über konkave Polygone wiederum steht nirgends etwas.&lt;br /&gt;
&lt;br /&gt;
Das Problem mit dem Begriff Triangulation (wenn er nicht nur auf OGL bezogen sein soll) ist wohl der, dass er für ziemlich alles verwendet werden kann was irgendwie mit dem zerlegen von irgendwelchen Daten in Dreiecke zu tun hat. Daten können hier konvexe oder konkave Polygone sein, irgendwelche beliebigen Punktmengen die die Oberfläche eines Objektes beschreiben und was weiß ich noch alles. Wahrscheinlich wäre der Begriff auch dann angebracht wenn man ein teilweise transparentes Volumen (zB Rauch) mit Dreiecken darstellen möchte. Im Internet findet man unter diesem Begriff alles mögliche.&lt;br /&gt;
&lt;br /&gt;
Ich habe jetzt auch mal die OGL-Spec nach dem Begriff Triangulation zu durchforstet, der kommt dort genau einmal vor nämlich da wo gesagt wird das man ein Polygon (für den Rasterizer) auch in Dreiecke zerlegen darf.&lt;br /&gt;
&lt;br /&gt;
Das beste wäre es also vielleicht wenn man den Titel in Polygon Triangulation ändert und dann etwas von konkaven Polygonen erzählt und überhaupt nicht auf OGL eingeht, oder vielleicht noch ganz kurz die Anmerkung dass man das zerlegen eines Triangle-Strips, -Fans, Quads oder (konvexen) Polygon auch als Triangulation bezeichnen kann. Aber das mit der Geschwindigkeit sollte man halt ganz weg lassen oder vielleicht noch anmerken das Triangle-Strips, -Fans, ... schneller sind als einzelne Dreiecke (wegen Bandbreite).&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 05:36, 8. Sep 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:glBegin&amp;diff=19596</id>
		<title>Diskussion:glBegin</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:glBegin&amp;diff=19596"/>
				<updated>2006-09-08T03:25:21Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich finde das die 2te spalte ziemlich gequetscht aussieht. Besonders wenn man den Browser nicht maximiert hat. Weiß allerdings nicht wie das am besten zu lösen ist.&lt;br /&gt;
(Meine Auflösung ist: 1024 x 768)&lt;br /&gt;
&lt;br /&gt;
Habs umformatiert. Jetzt besser? &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 14:28, 16. Jun 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Lyrs ergänzung zu GL_POLYGON ==&lt;br /&gt;
&lt;br /&gt;
Die Ergänzung ist mir erst jetzt aufgefallen.&lt;br /&gt;
Könntest du vielleicht noch ein 2 Sätze dazu erklären? Die Sachen die Ich reingeschrieben hab kamen aus nem UniScript von mir. Aber kann durchaus sein, dass da Optimierungen ausen vor gelassen wurden.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 13:36, 6. Sep 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Uni-Script als OGL-Referenz ... uiuiui du traust dich was :-).&lt;br /&gt;
&lt;br /&gt;
Uni-Theorie ist meist (bei mir wars zumindest so), dass ein Polygon auch konkav sein darf und diese Annahme übertragen sie dann gleich auf OpenGL. In OGL darf ein Treiber GL_POLYGON exakt gleich berechnen wie Triangle Fans. Ist ja auch hier sogar genau das selbe Bild bei beiden Varianten, und das nicht umsonnst denn sie sind auch gleich. Ich habe das zur Sicherheit damals auch ausprobiert, GL_POLYGON und GL_TRIANGLE_FAN waren bei mir ''exakt'' gleich schnell, so gleich das ich annehme, dass es ein und derselbe Funktionsaufruf ist (oder zumindest eine komplett identische Funktion). Nur wenn man in Wireframe zeichnet, dann ist natürlich GL_POLYGON ein klein wenig schneller, weil er weniger Linien zeichnen muss (nur den Rand nicht die Linien der Dreiecksgrenzen).&lt;br /&gt;
&lt;br /&gt;
Dein Verständnisproblem liegt aber möglicherweise schon beim triangulieren wie mir gerade auffällt. Da diese Erörterung wohl eher dort rein passt, lies am besten auch dort weiter.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 16:22, 7. Sep 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also gibt es keine unterschiede zwischen GL_POLYGON und GL_TRIANGLE_FAN? Dann frag ich mich wieso immer wieder gesagt wird, GL_POLYGON sei extrem langsam. Ob das früher mal so war und das mittlerweile durch intelligente Treiber erledigt ist?&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 16:56, 7. Sep 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Also soweit ich die OGL-Spec verstehe ''kann'' es Unterschiede beim Rasterizer geben, also das die Interpolation der Farbwerte etwas &amp;quot;besser&amp;quot; berechnet wird als beim Triangle Fan. Wäre mir aber noch nie aufgefallen, also dieses &amp;quot;kann&amp;quot; wird wohl von den wenigsten Treibern wahr genommen. Habe ich aber auch nicht so sehr getestet.&lt;br /&gt;
&lt;br /&gt;
Intelligentere Treiber? Nein, eher das Gegenteil. Möglicherweise war es früher so das die Farb- und Textur-Interpolation im Zeitalter von 2D-Grafik bei Polygonen besser war als beim Triangle Fan. Vielleicht ist es auch heute bei Grafikkarten die mehr auf 2D ausgelegt sind noch so (falls es soetwas noch gibt :-) ). Wie gesagt, am besten ausprobieren, ich habe damals nur recht triviale Polygone und Triangle-Fans zum testen verwendet (also ohne Textur und dergleichen). Aber ich bezweifle stark dass man auf mehr als sagen wir mal 5% der Grafikkarten einen merkbaren Unterschied (sowohl was Geschwindigkeit als auch Aussehen betrifft) erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Dann frag ich mich wieso immer wieder gesagt wird, GL_POLYGON sei extrem langsam.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das ist wohl etwas was man einmal hört und dann den &amp;quot;Newbies&amp;quot; unter die Nase reibt das man sich besser auskennt als sie, wodurch die &amp;quot;Newbies&amp;quot; dass dann später den anderen unter die Nase reiben. Also fang ich jetzt mal an den Leuten unter die Nase zu reiben, dass sie sich doch nicht besser auskennen :-).&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 05:25, 8. Sep 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:glBegin&amp;diff=19593</id>
		<title>Diskussion:glBegin</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:glBegin&amp;diff=19593"/>
				<updated>2006-09-07T14:22:04Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich finde das die 2te spalte ziemlich gequetscht aussieht. Besonders wenn man den Browser nicht maximiert hat. Weiß allerdings nicht wie das am besten zu lösen ist.&lt;br /&gt;
(Meine Auflösung ist: 1024 x 768)&lt;br /&gt;
&lt;br /&gt;
Habs umformatiert. Jetzt besser? &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 14:28, 16. Jun 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Lyrs ergänzung zu GL_POLYGON ==&lt;br /&gt;
&lt;br /&gt;
Die Ergänzung ist mir erst jetzt aufgefallen.&lt;br /&gt;
Könntest du vielleicht noch ein 2 Sätze dazu erklären? Die Sachen die Ich reingeschrieben hab kamen aus nem UniScript von mir. Aber kann durchaus sein, dass da Optimierungen ausen vor gelassen wurden.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 13:36, 6. Sep 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Uni-Script als OGL-Referenz ... uiuiui du traust dich was :-).&lt;br /&gt;
&lt;br /&gt;
Uni-Theorie ist meist (bei mir wars zumindest so), dass ein Polygon auch konkav sein darf und diese Annahme übertragen sie dann gleich auf OpenGL. In OGL darf ein Treiber GL_POLYGON exakt gleich berechnen wie Triangle Fans. Ist ja auch hier sogar genau das selbe Bild bei beiden Varianten, und das nicht umsonnst denn sie sind auch gleich. Ich habe das zur Sicherheit damals auch ausprobiert, GL_POLYGON und GL_TRIANGLE_FAN waren bei mir ''exakt'' gleich schnell, so gleich das ich annehme, dass es ein und derselbe Funktionsaufruf ist (oder zumindest eine komplett identische Funktion). Nur wenn man in Wireframe zeichnet, dann ist natürlich GL_POLYGON ein klein wenig schneller, weil er weniger Linien zeichnen muss (nur den Rand nicht die Linien der Dreiecksgrenzen).&lt;br /&gt;
&lt;br /&gt;
Dein Verständnisproblem liegt aber möglicherweise schon beim triangulieren wie mir gerade auffällt. Da diese Erörterung wohl eher dort rein passt, lies am besten auch dort weiter.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 16:22, 7. Sep 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Triangulation&amp;diff=19592</id>
		<title>Diskussion:Triangulation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Triangulation&amp;diff=19592"/>
				<updated>2006-09-07T14:20:05Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: ist etwas ... missverständlich&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;@Flash: ich nehme an bei dem Artikel hast du auch einiges aus dem Uni-Script? :-).&lt;br /&gt;
&lt;br /&gt;
Das triangulieren passiert auf der Grafikkarte und dort ist es nicht mehr und nicht weniger als ein paar Vertices doppelt zu verwenden. Bei lauter Dreiecken hat man also irgend etwas wie:&lt;br /&gt;
 for i = 1 bis Punkte: zeichne Dreieck( Punkt[i], Punkt[i+1], Punkt[i+2] ); i += 3;&lt;br /&gt;
Bei einem Triangle Strip etwa:&lt;br /&gt;
 for i = 1 bis Punkte-2: zeichne Dreieck( Punkt[i], Punkt[i+1], Punkt[i+2] ); i += 1;&lt;br /&gt;
Bei einem Quad, Triangle Fan und natürlich auch bei einem Polygon sieht das nicht viel anders aus. Das ist natürlich irgendwie in Hardware implementiert aber da bin ich nicht so der Spezialist dafür. Dennoch ... wenn mir irgend jemand einreden möchte, dass die 2. Variante relevant länger braucht als die 1ste, dann sollte er dafür schon gute Gründe haben. Und bei der 2. Variante sparen wir natürlich viel Bandbreite auf unserem AGP Bus.&lt;br /&gt;
&lt;br /&gt;
Also wenn man in Bezug auf OGL von Triangulation spricht, dann ist das eine der einfachsten Sachen der Welt. Wenn man von konkaven Polygonen (oder was auch immer) und Triangulation spricht, dann spricht man nicht mehr von OGL, weil OGL kann das nicht.&lt;br /&gt;
&lt;br /&gt;
Wollte schon anfangen den Artikel um zu schreiben, aber irgendwie wird das dann bei mir ein 5 Zeiler oder sowas, das wollte ich dann auch wieder nicht ... also vielleicht lässt sich ja jemand einen schön ausgeschmückten 10-Zeiligen Text einfallen :-).&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 16:20, 7. Sep 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Blenderexporter&amp;diff=18436</id>
		<title>Diskussion:Blenderexporter</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Blenderexporter&amp;diff=18436"/>
				<updated>2006-07-19T11:53:37Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Das mit dem Hauptseite/_Kategorie:Trampelpfad_/Enginepfad ... hat wohl nicht so toll hin gehauen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Denke mal der Artikel kann dan den Artikel [[Blenderscript]] ablösen. Interessant wäre vorallem wie man das exportierte Modell dan wieder laden kann.&lt;br /&gt;
&lt;br /&gt;
Bitte verlinke den neuen Artikel dann gut im Wiki! Der Alte konnte nur über [[Hauptseite]]/Trampelpfad/[[Enginepfad]]/[[Leveleditoren]]/[[Blenderscript]] ereicht werden&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Hintergrundwissen&amp;diff=18435</id>
		<title>Hintergrundwissen</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Hintergrundwissen&amp;diff=18435"/>
				<updated>2006-07-19T10:45:54Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Sonstiges */ + Vertex Cache&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was hier hinein gehört ==&lt;br /&gt;
&lt;br /&gt;
In diese Kategorie kommt alles rein was zum Verständnis im Bereich OpenGL/3D-Programmierung nützlich sein könnte. Also u.a. welche Puffer es unter OpenGL gibt, und für was die gut sind.&lt;br /&gt;
&lt;br /&gt;
Auch hier sollte man möglichst aufspalten und dann eine Überschrift setzen. So macht man das Auffinden bestimmter Dinge leichter und auch die Verlinkung darauf ist oft etwas das man in anderen Dokumenten benötigt.&lt;br /&gt;
&lt;br /&gt;
P.S. : Ob hier Deutsche Begriffe oder Anglizismen genutzt werden ist jedem selbst überlassen. Ich persönlich bevorzuge ersteres.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Begriffserklärungen ==&lt;br /&gt;
In diesem Teil findet ihr Erklärungen zu begriffen, die ihr ständig im Zusammenhang mit OpenGL höhrt. Wenn ihr etwas nicht kennt, könnt ihr hier nachsehen, ob der Begriff bereits erklärt wurde.&lt;br /&gt;
&lt;br /&gt;
=== Grundlagen ===&lt;br /&gt;
: [[Funktions Anhang|Aufbau von OpenGL Funktionen]] &lt;br /&gt;
: [[Bounding Volume]] ([[Bounding Box]])&lt;br /&gt;
: [[Clipping Plane]] {{excIcon}} (Schnittebenen)&lt;br /&gt;
: [[Frustum]]&lt;br /&gt;
: [[Matrix|Matrix / Matrizen]]&lt;br /&gt;
: [[OpenGL Name|Namen in OpenGL]]&lt;br /&gt;
: [[Normalen]]&lt;br /&gt;
: [[Primitive]]&lt;br /&gt;
: [[Texel]] {{icpIcon}}&lt;br /&gt;
&lt;br /&gt;
=== Bildentstehung ===&lt;br /&gt;
: [[Dithering]] {{icpIcon}}&lt;br /&gt;
: [[Fragment| Fragmente]]&lt;br /&gt;
: [[Pixel]]&lt;br /&gt;
: [[Rasterisierung]]&lt;br /&gt;
: [[Tiefentest]]&lt;br /&gt;
&lt;br /&gt;
=== Puffer ===&lt;br /&gt;
: [[Akkumulationspuffer]] (Accumulationbuffer)&lt;br /&gt;
: [[Doppelpufferung]] (Doublebuffering)&lt;br /&gt;
: [[Farbpuffer]] (Colorbuffer)&lt;br /&gt;
: [[Feedbackpuffer]]&lt;br /&gt;
: [[Framebuffer]]&lt;br /&gt;
: [[Logischer Puffer]]&lt;br /&gt;
: [[Schablonenpuffer]] (Stencilbuffer)&lt;br /&gt;
: [[Selektionspuffer]]&lt;br /&gt;
: [[Tiefenpuffer]] (Depthbuffer)&lt;br /&gt;
&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
: [[Decals]]&lt;br /&gt;
: [[MipMaps]]&lt;br /&gt;
: [[Register Combiner]]&lt;br /&gt;
: [[Texel Berechnung]]&lt;br /&gt;
: [[Texturen]]&lt;br /&gt;
&lt;br /&gt;
=== Textureneffekte ===&lt;br /&gt;
: [[Animierte Textur]]en&lt;br /&gt;
: [[Bumpmapping]] (Simulation rauher Oberflächen)&lt;br /&gt;
: [[Displacementmapping]] (Änderung der Oberflächengeometrie)&lt;br /&gt;
: [[Detailmapping]] (Erhöhung des Texturdetailgrades)&lt;br /&gt;
: [[Environment Mapping]] (Umgebungsspiegelung)&lt;br /&gt;
:: [[Cubemap]]ping {{icpIcon}}&lt;br /&gt;
:: [[Spheremap]]ping {{icpIcon}}&lt;br /&gt;
: [[Multitexturing]]&lt;br /&gt;
: [[Texture Stage]]&lt;br /&gt;
&lt;br /&gt;
=== Effekte ===&lt;br /&gt;
: [[Antialiasing]] (Kantenglättung)&lt;br /&gt;
: [[Blenden]] (Blending)&lt;br /&gt;
: [[Jittering]] (Verwischen)&lt;br /&gt;
: [[Nebel]] (Fogging)&lt;br /&gt;
: [[Transparenz]] (durchsichtige Objekte)&lt;br /&gt;
&lt;br /&gt;
=== Optimierungen ===&lt;br /&gt;
: [[Backfaceculling]]&lt;br /&gt;
: [[Displaylisten]]&lt;br /&gt;
: [[Frustum Culling]] &lt;br /&gt;
: [[Triangulation]]&lt;br /&gt;
: [[VBO]] (Vertex Buffer Objects)&lt;br /&gt;
&lt;br /&gt;
=== Weiterführendes ===&lt;br /&gt;
: [[Beleuchtung]]&lt;br /&gt;
: [[Billboard]]s &lt;br /&gt;
:: [[sphärisches Billboard]] {{icpIcon}}&lt;br /&gt;
:: [[zylindrisches Billboard]] {{icpIcon}}&lt;br /&gt;
: [[Convolution]]&lt;br /&gt;
: [[NURBS]]&lt;br /&gt;
: [[Picking]]&lt;br /&gt;
: [[Point Sprite]]&lt;br /&gt;
: [[Quadrik]]en&lt;br /&gt;
: [[Selektion]]&lt;br /&gt;
: [[Sprite]]s&lt;br /&gt;
: [[Tesselierung]]&lt;br /&gt;
&lt;br /&gt;
=== Fehler/ Nebeneffekte ===&lt;br /&gt;
: [[Aliasing]]  (Treppenbildung und Ähnliches)&lt;br /&gt;
: [[Popping]]   (Plötzliches Auftauchen von Elementen. Z.B. bekannt bei [[LOD]])&lt;br /&gt;
: [[ZFighting]] (Flimmernde Polygone und Kanten)&lt;br /&gt;
&lt;br /&gt;
=== Render-Pipeline ===&lt;br /&gt;
: [[Feste Funktionspipeline]] {{icpIcon}}&lt;br /&gt;
: [[GLSlang]] &lt;br /&gt;
: [[GLSL]]&lt;br /&gt;
: [[Shader]] (allgemein)&lt;br /&gt;
:: [[Fragmentshader]]&lt;br /&gt;
:: [[Vertexshader]]&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheken ===&lt;br /&gt;
: [[DGLSDK]]&lt;br /&gt;
: [[OpenAL]]&lt;br /&gt;
: [[SDL]]&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
: [[Benchmark]]&lt;br /&gt;
: [[Callback]]&lt;br /&gt;
: [[Füllrate]]&lt;br /&gt;
: [[Renderkontext]]&lt;br /&gt;
: [[Scanlinerenderer]]&lt;br /&gt;
: [[Timebased Movement]]&lt;br /&gt;
: [[Vertexlimitiert]]&lt;br /&gt;
: [[Shaderlimitiert]]&lt;br /&gt;
: [[Bandbreitenlimitiert]]&lt;br /&gt;
: [[Vertex Cache]]&lt;br /&gt;
&lt;br /&gt;
=== Bücher zum Thema ... ===&lt;br /&gt;
: ... OpenGL: [[RedBook]]&lt;br /&gt;
: ... OpenGL: [[BlueBook]]&lt;br /&gt;
: ... OpenGL: [[PurpleBook]]&lt;br /&gt;
: ... OpenGL: [[OrangeBook]]&lt;br /&gt;
: ... OpenGL: [http://www.starstonesoftware.com/OpenGL/ OpenGL Superbible]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Checklisten ==&lt;br /&gt;
In diesem Teil findet ihr Checklisten die ihr durcharbeiten solltet, wenn ihr Fehler im Code habt, bzw. wenn eure Ausgabe nicht so aussieht wie sie es söllte.&lt;br /&gt;
&lt;br /&gt;
:[[Checkliste Blending]]&lt;br /&gt;
:[[Checkliste Positionierung]]&lt;br /&gt;
:[[Checkliste Selektion]]&lt;br /&gt;
:[[Checkliste Shader]]&lt;br /&gt;
:[[Checkliste Texturierung]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertex_Cache&amp;diff=18434</id>
		<title>Vertex Cache</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertex_Cache&amp;diff=18434"/>
				<updated>2006-07-19T10:45:47Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vor allem bei [[Vertexgebunden]]en Applikationen sollte man darauf achten den Vertex Cache möglichst effektiv zu nützen. Der Vertex Cache - oder Transform &amp;amp; Lighting Cache - wird unterteilt in Pre- und Post-T&amp;amp;L-Cache.&lt;br /&gt;
&lt;br /&gt;
==Pre-T&amp;amp;L-Cache==&lt;br /&gt;
Der Pre-T&amp;amp;L-Cache ist vergleichbar mit dem Cache der CPU. Wenn wir mit der CPU auf ein Byte im RAM zugreiffen, so wird ja bekanntlich der gesamte Block (in dem sich das gesuchte Byte befindet) im Cache abgelegt. Wenn nun auf Bytes im selben Block zugegriffen wird, so befinden sich diese bereits im Cache und dieser erlaubt einen schnellen Zugriff. Auf sehr ähnliche Weise funktioniert der Pre-T&amp;amp;L-Cache. Wenn wir einen größeren Array von [[Vertex|Vertices]] besitzen und über eine Index-Liste darauf zugreifen, so bewirkt ein Zugriff auf einen [[Vertex]] nicht nur das holen des gesuchten Vertex, sondern der gesamte Block in dem sich der [[Vertex]] befindet wird in den Pre-T&amp;amp;L-Cache geladen. Wird nun solange dieser Block im Cache liegt ein Index angegeben, welcher einen [[Vertex]] im selben Block referenziert, so kann dieser [[Vertex]] sehr schnell aus dem Cache ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
===Cache-Größe===&lt;br /&gt;
Der Pre-T&amp;amp;L-Cache ist üblicherweise verhältnismäßig groß. Einige Beispiele:&lt;br /&gt;
* GeForce FX 3000: ~8,000 [[Vertex|Vertices]]&lt;br /&gt;
* GeForce FX 6800: ~64,000 [[Vertex|Vertices]]&lt;br /&gt;
&lt;br /&gt;
===Hinweise zur Performance===&lt;br /&gt;
Bei diesem Cache können nur begrenzt allgemein gültige Hinweise zur Performance gegeben werden, da verschiedene Grafikkarten unterschiedliche Strategien und Implementierungen besitzen können. Üblicherweise sollten jedoch folgende Punkte beachtet werden:&lt;br /&gt;
* Verhältnismäßig sequenzielle Zugriffe auf einen [[Vertex]]-Array sind wünschenswert.&lt;br /&gt;
* [[Vertex]]-Array-Blöcke die zu groß für den Cache sind können sich negativ auswirken, vor allem bei eher wenigen sequenziellen Zugriffen.&lt;br /&gt;
* Mehrere [[Vertex]]-Daten-Streams können sich negativ auswirken, wodurch meistens verschachtelte Streams (siehe [[glInterleavedArrays]]) vorzuziehen sind. Wenn jedoch beispielsweise die [[Vertex]]-Daten statisch sind jedoch die Farbwerte oder Texturcoordinaten dynamisch, so ist es natürlich dennoch besser wenn die [[Vertex]]-Daten getrennt im GPU-Speicher abgelegt werden.&lt;br /&gt;
* Vor allem bei eher nicht sequenziellen Zugriffen ist es üblicherweise hilfreich wenn die Daten für einen [[Vertex]] eine &amp;quot;gut handhabbare&amp;quot; Größe besitzen (üblicherweise 32 Byte).&lt;br /&gt;
&lt;br /&gt;
==Post-T&amp;amp;L-Cache==&lt;br /&gt;
Der Post-T&amp;amp;L-Cache dient dazu um Ergebnisse der [[Feste Funktionspipeline#Vertex Pipeline|Vertex-Pipeline]] zu speichern. Wenn ein vor kurzem berechneter [[Vertex]] identisch ist mit dem zu berechnenden [[Vertex]], so wird das gespeicherte Ergebnis verwendet und somit muss dieser [[Vertex]] die [[Feste Funktionspipeline#Vertex Pipeline|Vertex-Pipeline]] nicht mehr durchlaufen. Zu beachten ist, dass dieser Cache üblicherweise als FIFO (First in first out) realisiert ist und nicht der für Cache-Systeme gängigere LRU (Least recently used) Algorithmus verwendet wird.&lt;br /&gt;
&lt;br /&gt;
===Cache-Größe===&lt;br /&gt;
Die größe dieses Caches ist üblicherweise stark begrenzt. Einige Beispiele:&lt;br /&gt;
* GeForce 1&amp;amp;2: 16 [[Vertex|Vertices]]&lt;br /&gt;
* GeForce 3: 24 [[Vertex|Vertices]]&lt;br /&gt;
&lt;br /&gt;
===Hinweise zur Performance===&lt;br /&gt;
Hier sollte man nur darauf achten, dass gleiche [[Vertex|Vertices]] möglichst schnell hintereinander verwendet werden. Das typische Beispiel hierfür ist ein 2 dimensionales Gitternetz (beispeilsweise eine [[Heightmap]]) bei dem immer ein Streifen mit einem Triangle-Strip gezeichnet wird. Besitzen wir beispielsweise einen Vertex-Cache mit 16 Einträgen, so ist die optimale größe für einen Triangle-Strip 7 Vierecke (wofür wir genau 16 Eckpunkte benötigen). Zeichen wir nun den darunter liegenden Streifen, wo die Hälfte der Punkte mit dem oberen Streifen geteilt werden, so wird für jeden zweiten Punkt der Vertex-Cache verwendet. Werden hingegen 8 Vierecke je Streifen gezeichnet, so wird der Vertex-Cache überhaupt nicht verwendet. Wenn man also mehr als 7 Vierecke je Streifen besitzt, so ist es besser man zeichnet den ersten Streifen von links nach rechts und den zweiten Streifen von rechts nach links usw., wodurch wenigstens ein Teil der Punkte noch im Vertex-Cache zu finden ist.&lt;br /&gt;
&lt;br /&gt;
==Referenzen==&lt;br /&gt;
* [http://www.ati.com/developer/dx9/ATI-DX9_Optimization.pdf Performance Optimization Techniques for ATI Graphics Hardware with DirectX® 9.0]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Framebuffer&amp;diff=18422</id>
		<title>Framebuffer</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Framebuffer&amp;diff=18422"/>
				<updated>2006-07-12T04:15:57Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Vor allem wegen der häufig missverständlichen Verwendung von &amp;quot;Fragment&amp;quot; ziemlich stark umformuliert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bevor das Bild, welches man rendert, auf dem Monitor sichtbar wird, wird es in den so genannten Framebuffer geschrieben. Im Framebuffer wird nicht nur die Farbe eines Bildpunktes gespeichert, sondern auch dessen Tiefe und/oder dessen Stencil-Wert.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Objekt gezeichnet wird, so muss sowohl der Tiefentest (welcher seine Daten vom [[Tiefenpuffer]] und von der Tiefe des zu prüfenden [[Fragment]]es bezieht) als auch der Stencil-Test (welcher seine Daten aus dem [[Schablonenpuffer]] und vom Stencil-Wert des zu prüfenden [[Fragment]]es bezieht) bestanden werden, damit die Daten im [[Farbpuffer]] landen. Der Tiefen- und Stencil-Test kann natürlich aktiviert oder deaktiviert werden. Voraussetzung für beide Tests ist aber natürlich das Vorhandensein der Puffer, welches durch das gewählte [[Pixelformat]] (gesetzt durch [[WGL ARB pixel format]] bzw. [[SetPixelFormat]]) gewährleistet sein muss.&lt;br /&gt;
&lt;br /&gt;
==Die Bildentstehung im Framebuffer==&lt;br /&gt;
&lt;br /&gt;
Wenn ein (das erste) Objekt gezeichnet wird, so wird der Colorbuffer an diesen Stellen beschrieben. Ebenso der [[Tiefenpuffer]]. Vor dem erneuten schreiben in den Framebuffer wird nun überprüft, ob die Tiefenkoordinaten der [[Fragment|Fragmente]] des neuen Objektes den [[Tiefentest]] bestehen (üblicherweise muss der Tiefenwert dafür kleiner - also näher - sein als der bereits existierende Wert im Framebuffer). Dieser Vorgang wiederholt sich bis alle Objekte gezeichnet wurden. Das Bild liegt nun fertig im Framebuffer und kann auf dem Bildschirm angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie der [[Tiefenpuffer]] können auch die Stencil-Werte mit dem [[Schablonenpuffer]] verglichen werden. Das verhalten von beiden Tests kann mittels [[glDepthFunc]] bzw. [[glStencilFunc]] verändert werden.&lt;br /&gt;
&lt;br /&gt;
Der Framebuffer funktioniert nach dem so genannten [[Doppelpufferung|Doublebuffering]]prinzip.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Farbpuffer&amp;diff=18421</id>
		<title>Farbpuffer</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Farbpuffer&amp;diff=18421"/>
				<updated>2006-07-12T03:39:13Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: RGB_A_ ist meines Wissens nicht Pflicht und vor allem auf älteren Karten auch nicht so sehr in Hardware vertreten.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt;&lt;br /&gt;
== Was ist der Farbpuffer? ==&lt;br /&gt;
Der Farbpuffer enthält die Farbinformationen im [[Framebuffer]]. Gespeichert werden dazu je nach Modus entweder Indizes auf Paletteneinträgte (Index-Modus) oder Intensitäts-Werte der Pufferkomponenten (RGB(A)-Modus).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
=== RGBA-Modus ===&lt;br /&gt;
Hat man einen Renderkontext mit mehr als 8-Bit Farbwerten (8-Bit = 256 Farben = Indexmodus) angefordert, bekommt man von OpenGL einen sog. RGB- oder RGBA-Farbpuffer (R=Rot, G=Grün, B=Blau, A=Alpha) zur verfügung gestellt. Der Farbpuffer besteht dann aus insgesamt 3 oder 4 unabhängigen Puffern für jede RGB(A)-Komponente, deren Bit-Tiefe von der gewählten Farbtiefe abhängt. Im Normalfall (32-Bit Farbtiefe, 24 Bit für R+G+B und 8 Bit für A) besitzt jeder dieser Komponentenpuffer 8 Bitflächen, in denen die Intensität der entsprechenden Komponente als Ganzzahlwert abgelegt wird. Die Intensität reicht dabei von 0 (entspricht 0/255) bis 255 (entspricht 1.0, also volle Intensität).&lt;br /&gt;
Die Alpha-Komponente kann mittels [[Blending]]/[[Alphamasking]] für verschiedene Transparenz-Effekte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man sich unter Windows ein Pixelformat besorgt, werden die Bits aus '''cColorBits''' auf Rot, Grün und Blau verteilt. Der Wert von '''cAlphaBits''' gibt dagegen die Bits für den Alpha Kanal an.&lt;br /&gt;
&lt;br /&gt;
=== Index-Modus ===&lt;br /&gt;
Dieser Modus wird heute nur noch sehr selten verwendet, denn 256-Palettenfarben sind inzwischen einfach viel zu wenig, aber mehr war damals aufgrund eingeschränkter Hardware einfach nicht machbar. In diesem Modus gibt man (im Normalfall beim Programmstart) eine Farbpalette an, in der sich alle benötigten Farbwerte befinden. Jeder dieser Farbwerte besitzt eine eindeutige Nummer, den Index. OpenGL schreibt in diesem Modus dann nicht die Intensität der Farbkomponente in den Farbpuffer, sondern einfach nur den Index dieser Farbe, so dass diese später referenziert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wichtige Funktionen ==&lt;br /&gt;
Wie auch die anderen Buffer kann der Colorbuffer über die Funktion [[glClear]] und dem Parameter '''GL_COLOR_BUFFER_BIT''' mit einem Wert gefüllt werden.&lt;br /&gt;
Dieser Farbwert wird mit Hilfe der Funktion [[glClearColor]] definiert.&lt;br /&gt;
Farbwerte für einzelne [[Eckpunkt|Eckpunkte]] übergibt man mittels [[glColor]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch == &lt;br /&gt;
[[Tiefenpuffer]], [[Schablonenpuffer]], [[Akkumulationspuffer]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Fragment&amp;diff=18420</id>
		<title>Fragment</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Fragment&amp;diff=18420"/>
				<updated>2006-07-11T12:33:00Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein [[Primitive]] welches gezeichnet werden soll wird vom Rasterizer (siehe [[Feste Funktionspipeline#Fragment Pipeline|Fragment Pipeline]]) in Fragmente zerlegt. Jedes Fragment durchläuft die [[Feste Funktionspipeline#Fragment Pipeline|Fragment Pipeline]] und landet nach mehreren bestandenen Tests als [[Pixel]] im [[Framebuffer]]. Ein Fragment besitzt dabei vor allem folgende Daten:&lt;br /&gt;
* Fensterposition&lt;br /&gt;
* Tiefe&lt;br /&gt;
* Farbwert(e) oder Farbindex&lt;br /&gt;
* Alphawert&lt;br /&gt;
* Texturcoordinate(n)&lt;br /&gt;
* Stencilwert&lt;br /&gt;
Die Daten können (beispielsweise durch einen [[Fragment Shader]], Nebelberechnungen, ...) während der Lebensdauer eines Fragmentes noch verändert werden. Zusätzlich kann jeder Test ([[Tiefentest]], Alphatest, ...) ein Fragment verwerfen.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Fragment&amp;diff=18418</id>
		<title>Diskussion:Fragment</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Fragment&amp;diff=18418"/>
				<updated>2006-07-10T22:52:00Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich dachte eigentlich, dass Fragmente die &amp;quot;Dinger&amp;quot; sind die vom Rasterizer erzeugt werden, und nicht die Werte die im Frame-Buffer aktuell zu finden sind. In diesem Fall würden sie noch etwas mehr Informationen beinhalten wie beispielsweise Texturkoordinaten. Bin mir ziemlich sicher das man diese &amp;quot;Dinger&amp;quot; ''auch'' als Fragmente bezeichnet, aber nicht 100% sicher ob man die Werte im Framebuffer ''nicht'' als Fragmente bezeichnet. Wenn man diese nicht als Fragmente bezeichnet (was ich wie gesagt glaube) sollte man den gesamten Artikel etwas umschreiben, was auch der Grund ist weshalb ich ihn nicht sofort geändert habe.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 01:32, 7. Jul 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Also ich weiß (glaube es jedenfalls) dass Fragmente auch Tiefeninfos besitzen. Das mit dem Rasterizer stimmt auch. Ich denke also, dass beide Aussagen stimmen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 19:38, 10. Jul 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Naja, für die Fragment-Pipeline brauch ich auch Tiefen-Infos, die des neuen Fragmentes. Also für mich handelt es sich um ein Fragment auf dem Weg vom Rasterizer bis zu dem Zeitpunkt wo es im Framebuffer drinnen steht. Danach ist es für mich ein Pixel (ggf. mit Tiefeninfos, Alpha- und Stencil-Wert, aber dennoch nur ein Pixel). Und in diesem Artikel wäre nach meiner Auffassung zur Zeit der Begriff Fragment mit Pixel vertauscht worden.&lt;br /&gt;
&lt;br /&gt;
Das englische Wikipedia scheint meine Auffassung zu teilen, wobei deren Artikel auch erst seit kurzem besteht.&lt;br /&gt;
&lt;br /&gt;
In der OGL-Spezifikation unter &amp;quot;4. Per-Fragment Operations and the Framebuffer&amp;quot; (Version 1.2.1 und 1.3, wird sich aber wohl kaum geändert haben) am Anfang werden auch ein paar Andeutungen in die Richtung gemacht, im Sinne von wenn was im Frame Buffer drinnen ist, dann ist es ein Pixel. Vor allem durch den Satz unter 4.1: &amp;quot;A fragment produced by rasterization with window coordinates of (xw;yw) modifies the pixel in the framebuffer at that location based on a number of parameters and conditions.&amp;quot; würde ich schon fast meine Hand dafür ins Feuer legen ... aber nur fast :-).&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 00:52, 11. Jul 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tiefentest&amp;diff=18404</id>
		<title>Tiefentest</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tiefentest&amp;diff=18404"/>
				<updated>2006-07-07T00:06:37Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Tiefentest = gut und nicht böse auf heutiger Hardware&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei der Berechnung eines [[Fragment]]es, muss OpenGL feststellen können, welche Teile der Grafik im Vordergrund stehen und welche Objekte ganz oder teilweise durch andere Objekte verdeckt werden.&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Für den Tiefentest existiert der [[Tiefenpuffer]]. Dieser ist genauso gross wie der Framebuffer. Für jeden Pixel auf dem Bildschirm gibt es dann also einen weiteren Wert - den Eintrag im Tiefenpuffer. &lt;br /&gt;
&lt;br /&gt;
Im ersten Schritt wird der gesamte Tiefenpuffer auf den größtmöglichen Wert initialisiert (also die maximale Distanz, siehe [[glClear]] und [[glClearDepth]]).&lt;br /&gt;
Sobald dann ein Objekt gerendert wird, wird für jeden Pixel überprüft, ob der Tiefenwert des Pixels dieses Objekts kleiner ist als der Wert im Tiefenpuffer. Ist dies der Fall, wird dieses Pixel in den Framebuffer gezeichnet und der Tiefepuffer aktualisiert, ansonsten wird es verworfen. Der Test kann mittels [[glDepthFunc]] auch abgeändert werden. Zum Beispiel kann man dafür sorgen, dass auch gleich große Tiefenwerte akzeptiert werden.&lt;br /&gt;
&lt;br /&gt;
Der Tiefentest findet verhältnismäßig früh in der [[Feste_Funktionspipeline#Fragment_Pipeline|Fragment-Pipeline]] statt, wodurch er sehr effizient nicht benötigte Fragmente ausschließen kann. Wenn Objekte tiefensortiert (in diesem Fall von vorne nach hinten) gezeichnet werden, ist der Tiefentest sehr gut geeignet um sehr früh nicht benötigte Fragmente zu verwerfen um so die [[Füllrate]] zu schonen.&lt;br /&gt;
&lt;br /&gt;
== Transparenz und Tiefentest ==&lt;br /&gt;
Sobald Transparenz verwendet wird, kann der Tiefentest zumindest für diese Teile nicht mehr benutzt werden. Dies würde zu Fehlern führen, da das transparente Fragment ggfs. das durchscheinende, jedoch erst später an die Grafik-Pipeline gesendete und somit vom Tiefentest verworfene Fragment dahinter völlig verbirgt. Wenn man Transparente Fragmente nicht in den Tiefenbuffer schreibt, so können diese Fragmente von anderen, eigentlich weiter hinten liegenden, Fragmenten komplett überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Aus diesem Grund sollten Transparente Objekte nach allen anderen Objekten an OpenGL geschickt werden und diese möglichst von hinten nach vorne sortiert sein. Das Sortieren kann durch einen Alpha Wert im [[Framebuffer]] umgangen werden, jedoch ist dieser nur selten in Hardware vorhanden, wodurch in den weit langsameren Softwaremodus gewechselt wird.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Rasterisierung&amp;diff=18403</id>
		<title>Rasterisierung</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Rasterisierung&amp;diff=18403"/>
				<updated>2006-07-06T23:44:52Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Vor allem &amp;quot;vorletzter Schritt der OGL-Pipeline&amp;quot; ist etwas fragwürdig ...&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.&lt;br /&gt;
&lt;br /&gt;
Danach werden noch per-Fragment Operationen ([[Blending]], [[Feste_Funktionspipeline#Alpha_Test|Alpha Test]], [[Feste_Funktionspipeline#Stencil_Test|Stencil Test]], etc.) durchgeführt, bevor aus dem Fragment dann ein [[Pixel]] im [[Farbpuffer]] wird.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:Fragment&amp;diff=18402</id>
		<title>Diskussion:Fragment</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:Fragment&amp;diff=18402"/>
				<updated>2006-07-06T23:32:19Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich dachte eigentlich, dass Fragmente die &amp;quot;Dinger&amp;quot; sind die vom Rasterizer erzeugt werden, und nicht die Werte die im Frame-Buffer aktuell zu finden sind. In diesem Fall würden sie noch etwas mehr Informationen beinhalten wie beispielsweise Texturkoordinaten. Bin mir ziemlich sicher das man diese &amp;quot;Dinger&amp;quot; ''auch'' als Fragmente bezeichnet, aber nicht 100% sicher ob man die Werte im Framebuffer ''nicht'' als Fragmente bezeichnet. Wenn man diese nicht als Fragmente bezeichnet (was ich wie gesagt glaube) sollte man den gesamten Artikel etwas umschreiben, was auch der Grund ist weshalb ich ihn nicht sofort geändert habe.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 01:32, 7. Jul 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Normale&amp;diff=18401</id>
		<title>Normale</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Normale&amp;diff=18401"/>
				<updated>2006-07-06T23:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Wie berechne ich Normalen? */ &amp;lt;a,b&amp;gt; wird sehr sehr häufig für Skalarprodukt verwendet, sollte also nicht für Kreuzprodukt verwendet werden, wäre nur verwirrend.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Normalen =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist das? ==&lt;br /&gt;
Eine '''Normale''' ist ein Vektor, der Senkrecht auf eine Fläche steht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wozu brauch ich Normalen? ==&lt;br /&gt;
'''Normalen''' haben in OpenGL zwei zentrale Aufgaben.&lt;br /&gt;
&lt;br /&gt;
# Sie zeigen welche Flächenseite die Vorderseite ist (anhand des Vorzeichens).&lt;br /&gt;
# Sie bestimmen wie Licht von der Fläche reflektiert wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie berechne ich Normalen? ==&lt;br /&gt;
'''Normalen''' sind Flächennormalen. Das heißt, sie stehen senkrecht auf einer Fläche.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Welche Fläche?'''&lt;br /&gt;
&lt;br /&gt;
Eine beliebige...&lt;br /&gt;
&lt;br /&gt;
Ersteinmal eine kurze Zusammenfassung.&amp;lt;br&amp;gt;&lt;br /&gt;
* Flächen bestehen aus Polygonen.&lt;br /&gt;
* Polygone bestehen aus n Dreiecken.&lt;br /&gt;
* Jedes Dreieck ist definiert durch seine 3 Eckpunkte.&lt;br /&gt;
* 3 Punkte liegen immer in einer Ebene&lt;br /&gt;
&lt;br /&gt;
Wenn man nun die Normale eines Dreiecks berechnen will geht man folgenermaßen vor:&lt;br /&gt;
# Einen Eckpunkt als Bezugspunkt (P0) wählen.&lt;br /&gt;
# Die beiden Vektoren v1 = P1-P0 und v2 = P2-P0 bestimmen.&lt;br /&gt;
# Diese beiden Kreuzmultiplizieren v1 X v2. (steht in jedem Tafelwerk unter Kreuzprodukt)&lt;br /&gt;
# Das Ergebnis hat schonmal die richtige Richtung. (Für OpenGl reicht das.) &lt;br /&gt;
&lt;br /&gt;
=== Normalisieren ===&lt;br /&gt;
Eine Normale heißt aber nur deshalb Normale, weil sie normiert ist. Das heißt sie ist 1 Längeneinheit lang. Wenn man einen Vektor normieren will dividiert man einfach den Vektor durch seine Länge.&lt;br /&gt;
 Allgemein:&lt;br /&gt;
                   1/sqrt(x^2+y^2+z^2) * (x,y,z)&lt;br /&gt;
&lt;br /&gt;
 Beispiel eines normierten Vektors:&lt;br /&gt;
&lt;br /&gt;
          (1)  normieren    1       (1)&lt;br /&gt;
          (1) ----------&amp;gt;  ---   *  (1)&lt;br /&gt;
          (0)             sqrt(2)   (0)&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis ist die Normale des Dreiecks und damit auch der gesamten Ebene in der das Dreieck liegt.&lt;br /&gt;
&lt;br /&gt;
Mit [[glNormal]] hat man in OpenGL explizit die Möglichkeit einer Fläche eine '''Normale''' zu zuweisen. Diese muss nicht senkrecht (wie eine echte Normale) auf dieser Fläche stehen. Damit hat man die Möglichkeit, die Beleuchtung von Flächen gezielt zu manipulieren.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''GL_NORMALIZE''&amp;lt;br&amp;gt;&lt;br /&gt;
In OpenGL gibt es weiterhin die Möglichkeit die Normalen automatisch normalisieren zu lassen. Dazu muss mittels glEnable(GL_NORMALIZE) das Normalisieren eingeschaltet werden. Alle darauffolgenden Aufrufe von glNormal setzen die aktuelle Normale automatisch normiert. Abgeschaltet werden kann dies natürlich wieder durch glDisable(GL_NORMALIZE).&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glNormal]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Bounding_Volume&amp;diff=18400</id>
		<title>Bounding Volume</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Bounding_Volume&amp;diff=18400"/>
				<updated>2006-07-06T23:09:05Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Tradeoffs */ &amp;quot;möglichst dieselbe Füllrate&amp;quot; ist doch etwas stark übertrieben.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei dem '''Bounding Volume''' handelt es sich um die geschlossene Hülle eines Objektes.&lt;br /&gt;
Genauer gesagt ist ein Bounding Volume ein (möglichst einfaches) geometrisches Objekt, das ein anderes 3D-Objekt vollständig umschliesst.&lt;br /&gt;
&lt;br /&gt;
==Anwendung==&lt;br /&gt;
&lt;br /&gt;
Die zwei wichtigsten Techniken bei denen Bounding Volumes eingesetzt werden, sind das [[Occlusion Culling]], bei dem bestimmt werden muss, ob ein Objekt gezeichnet werden muss oder nicht, und beim [[Collision Detection]], wo bestimmt wird, ob zwei Objekte kollidieren oder nicht.&lt;br /&gt;
        &lt;br /&gt;
==Tradeoffs==&lt;br /&gt;
Es gibt zwei Kriterien, die bei der Erstellung eines Bounding Volumes berücksichtigt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Zuerst einmal sollte es das zu umschliessende Objekt so gut wie möglich approximieren.&lt;br /&gt;
Für [[Occlusion Culling]] ist es z.B. notwendig, dass das Bounding Volume möglichst exakt die Geometrie des Objektes widergibt.&lt;br /&gt;
Bei [[Collision Detection]] möchte man, dass die physikalischen Eigenschaften des Objektes durch das Bounding Volume so gut wie möglich approximiert werden.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite sollte das Bounding Volume aber auch so einfach wie möglich konstruiert sein, denn ein Bounding Volume ist nur zweckmässig, wenn das zu umschliessende 3D-Objekt um ein Vielfaches komplexer ist.&lt;br /&gt;
&lt;br /&gt;
==Arten==&lt;br /&gt;
Die am häufigste auftretenden Arten von Bounding Volumes sind die [[Bounding Box]], die [[Bounding Sphere]] und der [[Bounding Cylinder]]. &lt;br /&gt;
&lt;br /&gt;
Ein spezielles Bounding Volume ist die [[konvexe Hülle]] eines Objektes.&lt;br /&gt;
Diese approximiert ein 3D-Objekt zwar am besten, ist in der Praxis jedoch eher seltener im Einsatz.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Technik_oder_Algorithmus]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexlimitiert&amp;diff=18399</id>
		<title>Vertexlimitiert</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexlimitiert&amp;diff=18399"/>
				<updated>2006-07-06T22:59:37Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: - Beleuchtung. OGL-Licht wird üblicherweise per Vertex berechnet =&amp;gt; Vertexlimitierung wird verstärkt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von einem &amp;quot;vertexlimitiertem&amp;quot; Szenario wird dann gesprochen, wenn das Rendern einer 3D-Szene durch den maximal möglichen Vertexdurchsatz einer Grafikkarte limitiert ist. D.h. dass in der Szene mehr Eckpunkte verwendet werden als die Grafikkarte verkraften kann.&lt;br /&gt;
Da aber selbst moderne Consumergrafikkarten '''mehrere hundert Millionen Eckpunkte pro Sekunde''' über den Bus schieben bzw. darstellen können (nicht zuletzt dank mehrerer Vertexprozessoren, z.B. 6 bei der neusten Radeon-Generation), wird man '''heutzutage kaum eine Anwendung finden die vertexlimitiert ist'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I.d.R. sind moderne Grafikkarten bzw. 3D-Anwendungen entweder durch [[Füllrate]] oder [[Shaderlimitiert|Shadergeschwindigkeit]] limitiert. Sollte dennoch ein Szenario der Vertexlimitierung (z.B. auf alter Hardware, oder Anwendungen die komplexe Geometrie ohne Texturen oder ohne Fragment-Shader rendern) auftreten, empfiehlt es sich die Szenerie durch '''Sichtbarkeitsprüfungen''' mittels [[Techniken_und_Algorithmen#Raumunterteilungstechniken|Raumunterteilung]] oder [[LOD|Level-Of-Detail]] zur Laufzeit an die Hardware anzupassen.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Benchmark&amp;diff=18395</id>
		<title>Benchmark</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Benchmark&amp;diff=18395"/>
				<updated>2006-07-05T22:48:33Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Benchmark ist ein Referenzwert für Messungen eines Systems. Ein System (im weiteren auf Computer reduziert) ist ein aus mehreren Einzelteilen bestehendes Gefüge, welches nicht nur die Eigenschaften der Einzelteile (RAM-Größe, [[Füllrate]], [[Bandbreitenlimitiert|Bandbreite]], Festplattengeschwindigkeit, ...) besitzt, sondern auch auftauchende Eigenschaften ([[Füllrate]]nlimitierung, Seitenflattern, ...) aufweist. Diese auftauchenden Eigenschaften können nicht über die Informationen der einzelnen Systemkomponenten bestimmt werden, sondern sind durch möglichst realitätsnahe Simulationen zu testen.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise handelt es sich bei einem Benchmark um eine Simulation von ein oder mehreren Applikationen die häufig auch auf unterschiedliche Eigenschaften des Computers eingehen. Beispielsweise könnte ein Benchmark für Computerspieler folgende Testprogramme enthalten:&lt;br /&gt;
*primär [[Füllrate]]nlimitierte (Landschaft, [[Schatten Volumen]], ...)&lt;br /&gt;
*primär [[Vertexlimitiert]]e (viele Lichter, hohe [[Vertex]]anzahl, lange [[Vertex]] [[Shader]], ...)&lt;br /&gt;
*primär [[Bandbreitenlimitiert]]e&lt;br /&gt;
*starker Festplattengebrauch (Nachladen während der Laufzeit nötig)&lt;br /&gt;
*viel CPU-Aufwand (Für KI-Berechnungen oder auch Sichtbarkeitsberechnungen und ähnliches)&lt;br /&gt;
Für jeden dieser Tests werden Punkte vergeben (Beispielsweise die durchschnittlichen Frames / Sekunde). Am Ende werden die Punkte der einzelnen Tests (gegebenenfalls mit einer bestimmten Gewichtung) in einen Endwert umgerechnet. Einge Möglichkeiten hierfür wären beispielsweise:&lt;br /&gt;
*Addition&lt;br /&gt;
*Arithmetisches Mittel&lt;br /&gt;
*Geometrisches Mittel&lt;br /&gt;
*Harmonisches Mittel&lt;br /&gt;
Dieser Endwert kann nun verwendet werden um 2 Computer (in Sicht auf ihre Performance) zu vergleichen. Im Idealfall kann solch ein Benchmark auch aufschluss über die Schwachstellen eines Computers liefern und somit als Endergebnis die Komponente aufzeigen die verbesserungsbedürftig ist.&lt;br /&gt;
&lt;br /&gt;
Ein auf ein spezielles Gebiet zugeschnittener Benchmark ist eine gute Möglichkeit um 2 Computer miteinander zu vergleichen, jedoch sollte auch das Ergebnis eines Benchmarks mit Vorsicht genossen werden. Es handelt sich zum einen immer noch um einen simulierten Betrieb, und zum anderen werden häufig auch einzelne Komponenten gar nicht getestet (beispielsweise bei Benchmarks für Computerspiele findet man eher selten einen Test des Internetanschlusses).&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Hintergrundwissen&amp;diff=18394</id>
		<title>Hintergrundwissen</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Hintergrundwissen&amp;diff=18394"/>
				<updated>2006-07-05T22:47:37Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Sonstiges */ +Bandbreitenlimitiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was hier hinein gehört ==&lt;br /&gt;
&lt;br /&gt;
In diese Kategorie kommt alles rein was zum Verständnis im Bereich OpenGL/3D-Programmierung nützlich sein könnte. Also u.a. welche Puffer es unter OpenGL gibt, und für was die gut sind.&lt;br /&gt;
&lt;br /&gt;
Auch hier sollte man möglichst aufspalten und dann eine Überschrift setzen. So macht man das Auffinden bestimmter Dinge leichter und auch die Verlinkung darauf ist oft etwas das man in anderen Dokumenten benötigt.&lt;br /&gt;
&lt;br /&gt;
P.S. : Ob hier Deutsche Begriffe oder Anglizismen genutzt werden ist jedem selbst überlassen. Ich persönlich bevorzuge ersteres.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Begriffserklärungen ==&lt;br /&gt;
In diesem Teil findet ihr Erklärungen zu begriffen, die ihr ständig im Zusammenhang mit OpenGL höhrt. Wenn ihr etwas nicht kennt, könnt ihr hier nachsehen, ob der Begriff bereits erklärt wurde.&lt;br /&gt;
&lt;br /&gt;
=== Grundlagen ===&lt;br /&gt;
: [[Funktions Anhang|Aufbau von OpenGL Funktionen]] &lt;br /&gt;
: [[Bounding Volume]] ([[Bounding Box]])&lt;br /&gt;
: [[Clipping Plane]] {{excIcon}} (Schnittebenen)&lt;br /&gt;
: [[Frustum]]&lt;br /&gt;
: [[Matrix|Matrix / Matrizen]]&lt;br /&gt;
: [[OpenGL Name|Namen in OpenGL]]&lt;br /&gt;
: [[Normalen]]&lt;br /&gt;
: [[Primitive]]&lt;br /&gt;
: [[Texel]] {{icpIcon}}&lt;br /&gt;
&lt;br /&gt;
=== Bildentstehung ===&lt;br /&gt;
: [[Dithering]] {{icpIcon}}&lt;br /&gt;
: [[Fragment| Fragmente]]&lt;br /&gt;
: [[Pixel]]&lt;br /&gt;
: [[Rasterisierung]]&lt;br /&gt;
: [[Tiefentest]]&lt;br /&gt;
&lt;br /&gt;
=== Puffer ===&lt;br /&gt;
: [[Akkumulationspuffer]] (Accumulationbuffer)&lt;br /&gt;
: [[Doppelpufferung]] (Doublebuffering)&lt;br /&gt;
: [[Farbpuffer]] (Colorbuffer)&lt;br /&gt;
: [[Feedbackpuffer]]&lt;br /&gt;
: [[Framebuffer]]&lt;br /&gt;
: [[Logischer Puffer]]&lt;br /&gt;
: [[Schablonenpuffer]] (Stencilbuffer)&lt;br /&gt;
: [[Selektionspuffer]]&lt;br /&gt;
: [[Tiefenpuffer]] (Depthbuffer)&lt;br /&gt;
&lt;br /&gt;
=== Texturen ===&lt;br /&gt;
: [[Decals]]&lt;br /&gt;
: [[MipMaps]]&lt;br /&gt;
: [[Register Combiner]]&lt;br /&gt;
: [[Texel Berechnung]]&lt;br /&gt;
: [[Texturen]]&lt;br /&gt;
&lt;br /&gt;
=== Textureneffekte ===&lt;br /&gt;
: [[Animierte Textur]]en&lt;br /&gt;
: [[Bumpmapping]] (Simulation rauher Oberflächen)&lt;br /&gt;
: [[Displacementmapping]] (Änderung der Oberflächengeometrie)&lt;br /&gt;
: [[Detailmapping]] (Erhöhung des Texturdetailgrades)&lt;br /&gt;
: [[Environment Mapping]] (Umgebungsspiegelung)&lt;br /&gt;
:: [[Cubemap]]ping {{icpIcon}}&lt;br /&gt;
:: [[Spheremap]]ping {{icpIcon}}&lt;br /&gt;
: [[Multitexturing]]&lt;br /&gt;
: [[Texture Stage]]&lt;br /&gt;
&lt;br /&gt;
=== Effekte ===&lt;br /&gt;
: [[Antialiasing]] (Kantenglättung)&lt;br /&gt;
: [[Blenden]] (Blending)&lt;br /&gt;
: [[Jittering]] (Verwischen)&lt;br /&gt;
: [[Nebel]] (Fogging)&lt;br /&gt;
: [[Transparenz]] (durchsichtige Objekte)&lt;br /&gt;
&lt;br /&gt;
=== Optimierungen ===&lt;br /&gt;
: [[Backfaceculling]]&lt;br /&gt;
: [[Displaylisten]]&lt;br /&gt;
: [[Frustum Culling]] &lt;br /&gt;
: [[Triangulation]]&lt;br /&gt;
: [[VBO]] (Vertex Buffer Objects)&lt;br /&gt;
&lt;br /&gt;
=== Weiterführendes ===&lt;br /&gt;
: [[Beleuchtung]]&lt;br /&gt;
: [[Billboard]]s &lt;br /&gt;
:: [[sphärisches Billboard]] {{icpIcon}}&lt;br /&gt;
:: [[zylindrisches Billboard]] {{icpIcon}}&lt;br /&gt;
: [[Convolution]]&lt;br /&gt;
: [[NURBS]]&lt;br /&gt;
: [[Picking]]&lt;br /&gt;
: [[Point Sprite]]&lt;br /&gt;
: [[Quadrik]]en&lt;br /&gt;
: [[Selektion]]&lt;br /&gt;
: [[Sprite]]s&lt;br /&gt;
: [[Tesselierung]]&lt;br /&gt;
&lt;br /&gt;
=== Fehler/ Nebeneffekte ===&lt;br /&gt;
: [[Aliasing]]  (Treppenbildung und Ähnliches)&lt;br /&gt;
: [[Popping]]   (Plötzliches Auftauchen von Elementen. Z.B. bekannt bei [[LOD]])&lt;br /&gt;
: [[ZFighting]] (Flimmernde Polygone und Kanten)&lt;br /&gt;
&lt;br /&gt;
=== Render-Pipeline ===&lt;br /&gt;
: [[Feste Funktionspipeline]] {{icpIcon}}&lt;br /&gt;
: [[GLSlang]] &lt;br /&gt;
: [[GLSL]]&lt;br /&gt;
: [[Shader]] (allgemein)&lt;br /&gt;
:: [[Fragmentshader]]&lt;br /&gt;
:: [[Vertexshader]]&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheken ===&lt;br /&gt;
: [[DGLSDK]]&lt;br /&gt;
: [[OpenAL]]&lt;br /&gt;
: [[SDL]]&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
: [[Benchmark]]&lt;br /&gt;
: [[Callback]]&lt;br /&gt;
: [[Füllrate]]&lt;br /&gt;
: [[Renderkontext]]&lt;br /&gt;
: [[Scanlinerenderer]]&lt;br /&gt;
: [[Timebased Movement]]&lt;br /&gt;
: [[Vertexlimitiert]]&lt;br /&gt;
: [[Shaderlimitiert]]&lt;br /&gt;
: [[Bandbreitenlimitiert]]&lt;br /&gt;
&lt;br /&gt;
=== Bücher zum Thema ... ===&lt;br /&gt;
: ... OpenGL: [[RedBook]]&lt;br /&gt;
: ... OpenGL: [[BlueBook]]&lt;br /&gt;
: ... OpenGL: [[PurpleBook]]&lt;br /&gt;
: ... OpenGL: [[OrangeBook]]&lt;br /&gt;
: ... OpenGL: [http://www.starstonesoftware.com/OpenGL/ OpenGL Superbible]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Checklisten ==&lt;br /&gt;
In diesem Teil findet ihr Checklisten die ihr durcharbeiten solltet, wenn ihr Fehler im Code habt, bzw. wenn eure Ausgabe nicht so aussieht wie sie es söllte.&lt;br /&gt;
&lt;br /&gt;
:[[Checkliste Blending]]&lt;br /&gt;
:[[Checkliste Positionierung]]&lt;br /&gt;
:[[Checkliste Selektion]]&lt;br /&gt;
:[[Checkliste Shader]]&lt;br /&gt;
:[[Checkliste Texturierung]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Bandbreitenlimitiert&amp;diff=18393</id>
		<title>Bandbreitenlimitiert</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Bandbreitenlimitiert&amp;diff=18393"/>
				<updated>2006-07-05T22:46:24Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auch in Bezug auf Grafikkarten kann die Bandbreite, also die maximale Datenmenge welche pro Zeiteinheit zur Grafikkarte gesendet werden kann, der Ausschlaggebende Faktor für die Framerate sein. Wenn eine Applikation Bandbreitenlimitiert ist, so bedeutet dies, dass die Applikation zu viele Daten über den PCI oder AGP-Bus an die Grafikkarte sendet oder von ihr erhalten will.&lt;br /&gt;
&lt;br /&gt;
Eine Grafikkarte ist sehr stark darauf ausgelegt, dass sie ausschließlich Daten erhält, wodurch die CPU nur selten auf die Grafikkarte warten muss (sie sollten möglichst parallel arbeiten). Hingegen dazu ist Feedback von der Grafikkarte nur selten gewünscht, wodurch Anfragen an die Grafikkarte (welcher Art auch immer) enorme Performance Einbusen nach sich ziehen können. Und obwohl derartige Probleme eher weniger mit der Bandbreite des Busses zu tun haben, werden sie häufig auch in diese Problemkategorie eingereiht. Aufgrund dessen muss man sehr stark unterscheiden zwischen Daten die an die Grafikkarte gesendet werden und denen die von der CPU verlangt werden. Man fasst also häufig Synchronisations-Probleme und Bandbreiten-Probleme zusammen.&lt;br /&gt;
&lt;br /&gt;
Häufige Ursachen für Bandbreitenlimitierung:&lt;br /&gt;
* Der Speicher der Grafikkarte muss teilweise auf den Hauptspeicher ausgelagert werden.&lt;br /&gt;
* Zu viele Texturen werden erstellt oder verändert (beispielsweise mittels [[glTexSubImage]])&lt;br /&gt;
* Zu häufig (bzw. an zu viel verschiedenen Stellen) werden Daten von der Grafikkarte verlangt (Feedback-Buffer, [[glReadPixels]], ...)&lt;br /&gt;
* Zu viele Renderdaten werden an die Grafikkarte gesendet. Dies resultiert jedoch üblicherweise in einer [[Vertexlimitiert|Vertexlimitierung]] wenn die drei anderen Aspekte nicht zutreffen.&lt;br /&gt;
&lt;br /&gt;
Die Bandbreite kann weniger beansprucht werden durch:&lt;br /&gt;
* Weniger Texturen die häufig erstellt oder verändert werden.&lt;br /&gt;
* [[glBindTexture]] nur dann wenn nötig (nach Texturen sortiert zeichnen) sofern die Texturen im Hauptspeicher ausgelagert werden.&lt;br /&gt;
* Verwendung von Display Listen oder Vertex Buffer Objects, sofern der Grafikkartenspeicher nicht bereits überfüllt ist.&lt;br /&gt;
* Weniger Anfragen an die Grafikkarte.&lt;br /&gt;
* Verwendung von Synchronisations-Extensions wie GL_NV_fence wenn häufig Daten von der Grafikkarte angefordert werden.&lt;br /&gt;
* Weniger Geometrie-Daten (zB. durch [[glMap2]], Level of Detail, Frustum Culling, ... ).&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Bandbreitenlimitiert&amp;diff=18392</id>
		<title>Bandbreitenlimitiert</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Bandbreitenlimitiert&amp;diff=18392"/>
				<updated>2006-07-05T22:40:30Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auch in Bezug auf Grafikkarten kann die Bandbreite, also die maximale Datenmenge welche pro Zeiteinheit zur Grafikkarte gesendet werden kann, der Ausschlaggebende Faktor für die Framerate sein. Wenn eine Applikation Bandbreitenlimitiert ist, so bedeutet dies, dass die Applikation zu viele Daten über den PCI oder AGP-Bus an die Grafikkarte sendet oder von ihr erhalten will.&lt;br /&gt;
&lt;br /&gt;
Eine Grafikkarte ist sehr stark darauf ausgelegt, dass sie ausschließlich Daten erhält, wodurch die CPU nur selten auf die Grafikkarte warten muss (sie sollten möglichst parallel arbeiten). Hingegen dazu ist Feedback von der Grafikkarte nur selten gewünscht, wodurch Anfragen an die Grafikkarte (welcher Art auch immer) enorme Performance Einbusen nach sich ziehen können. Und obwohl derartige Probleme eher weniger mit der Bandbreite des Busses zu tun haben, werden sie häufig auch in diese Problemkategorie eingereiht. Aufgrund dessen muss man sehr stark unterscheiden zwischen Daten die an die Grafikkarte gesendet werden und denen die von der CPU verlangt werden. Man fasst also häufig Synchronisations-Probleme und Bandbreiten-Probleme zusammen.&lt;br /&gt;
&lt;br /&gt;
Häufige Ursachen für Bandbreitenlimitierung:&lt;br /&gt;
* Der Speicher der Grafikkarte muss teilweise auf den Hauptspeicher ausgelagert werden.&lt;br /&gt;
* Zu viele Texturen werden erstellt oder verändert (beispielsweise mittels [[glTexSubImage]])&lt;br /&gt;
* Zu häufig (bzw. an zu viel verschiedenen Stellen) werden Daten von der Grafikkarte verlangt (Feedback-Buffer, [[glReadPixels]], ...)&lt;br /&gt;
* Zu viele Renderdaten werden an die Grafikkarte gesendet. Dies resultiert jedoch üblicherweise in einer [[Vertexlimitiert|Vertexlimitierung]] wenn die drei anderen Aspekte nicht zutreffen.&lt;br /&gt;
&lt;br /&gt;
Die Bandbreite kann weniger beansprucht werden durch:&lt;br /&gt;
* Weniger Texturen die häufig erstellt oder verändert werden.&lt;br /&gt;
* [[glBindTexture]] nur dann wenn nötig (nach Texturen sortiert zeichnen) sofern die Texturen im Hauptspeicher ausgelagert werden.&lt;br /&gt;
* Verwendung von Display Listen oder Vertex Buffer Objects, sofern der Grafikkartenspeicher nicht bereits überfüllt ist.&lt;br /&gt;
* Weniger Anfragen an die Grafikkarte.&lt;br /&gt;
* Verwendung von Synchronisations-Extensions wie GL_NV_fence wenn häufig Daten von der Grafikkarte angefordert werden.&lt;br /&gt;
* Weniger Geometrie-Daten (zB. durch Frustum Culling).&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=18386</id>
		<title>Kategorie Diskussion:Exzellent</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=18386"/>
				<updated>2006-07-03T22:58:13Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Kommentar: Convolution Filter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Vorraussetzungen für Exzellente Artikel=&lt;br /&gt;
Hier könnt ihr Artikel vorschlagen welche ihr als &amp;quot;exzellenten Artikel&amp;quot; einstufen würdet.&lt;br /&gt;
&lt;br /&gt;
Folgende Punkte '''müssen''' erfüllt sein:&lt;br /&gt;
* Kein Sackgassenartikel - Artikel muss auf andere Artikel direkt (nicht über Code) verlinken&lt;br /&gt;
* Kein Plain Text - Artikel muss eine einheitliche Formatierung aufweisen&lt;br /&gt;
* Bilder - Artikel muss mindestens ein Bild/Grafik besitzen&lt;br /&gt;
* Vollständig - Der Artikel muss das Thema umfassend behandeln&lt;br /&gt;
* Kein Tutorial - Der Artikel darf nicht der [[:Kategorie:Tutorial|Kategorie Tutorial]] angehören.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit ein Artikel als '''exezellent''' eingestuft wird müssen:&lt;br /&gt;
* 5 Wiki-User der Wahl zustimmen darunter mindestens ein Moderator,&lt;br /&gt;
* keine Gegenstimmen bestehen,&lt;br /&gt;
* die Vorraussetzungen von oben gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=Kandidatenliste=&lt;br /&gt;
Um einen Artikel zur Kandidatenliste hinzuzufügen bitte den Nachfolgenden Code vor dem Ende (&amp;quot;&amp;lt;nowiki&amp;gt;|}&amp;lt;/nowiki&amp;gt;&amp;quot;) der Tabelle einfügen:&lt;br /&gt;
&lt;br /&gt;
 |&amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
Um eine Stimme abzugeben, kopiert ihr bitte den Wiki-Code &amp;quot;&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&amp;quot; in die entsprechende Spalte. Das Wiki generiert daraus eure Unterschrift (Signatur).&lt;br /&gt;
&lt;br /&gt;
Falls ihr eine Gegenstimme abgebt, muss eine Begründung dazu gegeben werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Vorgeschlagener Artikel&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Beführworter&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Gegner&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Begründung für Gegenstimme / Diskussion&lt;br /&gt;
|-&lt;br /&gt;
|[[Skybox]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Wenn hier noch jemand ein Codebeispiel liefern könnte wäre der Artikel auch Excellent. So ist er etwas Kurz. (Kriterium der Vollständigkeit ;))&lt;br /&gt;
|-&lt;br /&gt;
|[[glBegin]]&lt;br /&gt;
| --[[Benutzer:Lyr|Lyr]] 17:14, 7. Apr 2006 (CEST),&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 11:53, 2. Mai 2006 (CEST),&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 01:47, 3. Mai 2006 (CEST)&lt;br /&gt;
| &lt;br /&gt;
| Dieser Artikel wäre sicherlich auch ein Kandidat. Was mich bei ihm noch etwas zögerlich stimmt ist die Beschreibung. Diese ist realtiv weit weg vom Orginal. Das ist nicht sodnerlich schlimm, nur muss halt sichergestellt werden, dass alle Infos der orginal Spezifikation enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Scheint mir (zumindest was OGL 1.1 betrifft) vollständ und sieht auch ganz nett aus.&lt;br /&gt;
&lt;br /&gt;
Habe ihn nochmal gecheckt. Ist soweit ich das sehe vollständig.&lt;br /&gt;
|-&lt;br /&gt;
|[[DelphiGL]]&lt;br /&gt;
| --[[Benutzer:Luketheduke|luketheduke]] 12:06, 2. Apr 2006 (CEST),&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 01:47, 3. Mai 2006 (CEST)&lt;br /&gt;
| --[[Benutzer:Lyr|Lyr]] 07:02, 15. Jun 2006 (CEST),&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 12:12, 16. Jun 2006 (CEST), &lt;br /&gt;
--[[Benutzer:BenBE|BenBE]] 18:12, 1. Jul 2006 (CEST)&lt;br /&gt;
| Phobeus hat die Anfänge ergänzt -&amp;gt; jetzt bin ich auch ein Fan. --[[Benutzer:Flash|Flash]] 19:37, 10. Apr 2006 (CEST)&lt;br /&gt;
Gegenstimme: obwohl dieser Artikel informell aufgebaut ist, fällt er für mich in die Kategorie Werbung oder zumindest in die Kategorie: Beschreibung was hier zu finden ist, bzw. wer dies zustande gebracht hat. In meinen Augen sollte ein Beitrag darüber was auf einer Seite gemacht wird - oder wer diese verfasst hat - ''niemals'' hervorgehoben werden. Entweder die Seite ist so gut dass sie ohne entsprechende Hervorhebung ihrer Leistungen auskommt, oder eine derartige Hervorhebung (auf der Seite selbst) kann auch nichts daran ändern. Im Endeffekt: als Information gut gebrauchbar, aber lesenswert ... nur für die die es interessiert, also für die die dieses Wiki anpsrechend finden und diejenigen informieren sich darüber wer dies geschaffen hat ... oder auch nicht. Für alle anderen (wenn ich hier von meiner Perspektive sprechen darf) klingt ein derartiger &amp;quot;lesenswerter&amp;quot; Artikel wie Heuchelei. Um den (hier vielleicht zu häufig verwendeten) Vergleich zu Wikipedia zu ziehen: damals als ein solcher Artikel noch einer der besten war hätte sich keiner dafür interessiert. Und jetzt wo die Entstehungsgeschichte von Wikipedia vielleicht eine Erwähnung hier und da Wert wäre gibt es in Wikipedia bereits viele viele Artikel die bei weitem lesenswerter sind als dessen Entstehungsgeschichte.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 07:02, 15. Jun 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Ich stimme Lyr zu. Wir sollten uns bei den excellenten/lesenswerten Artikeln auf unser Zentrales Thema Grafikprogrammierung konzentrieren. Der DelphiGL Artikel ist sicherlich ein Schätzchen, wir den normalen Leser aber bestimmt wenig interessieren.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 12:12, 16. Jun 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Kann mich Flash und Lyr in Bezug auf den [[DelphiGL]]-Artikel nur anschließen. Außerdem würde ich in Bezug auf die Gestaltung 2 Dinge bemängeln, die als zwingende Vorgaben zu sehen sind:&lt;br /&gt;
#Als Illustration werte ich keinesfalls das zeigen eines Graphen, der die Mitgliederzahl in Abhängigkeit von der Zeit enthält, oder Tabellen, die deren erste Ableitung enthalten. Außerdem ist der Verweis auf die Mitgliederkarte zwar sinnvoll, ist aber auch etwas &amp;quot;lieblos&amp;quot; im Artikel reingeschmissen. Der Artikel muss also in Hinblick auf die äußere (gleichmäßige) Formatierung\Gestaltung auf jeden Fall überarbeitet werden.&lt;br /&gt;
#Zweitens zweifle ich stark die Vollständigkeit dieses Artikels an. Es gibt nämlich nicht nur die frühsten Anfänge und ein Jetzt, sondern auch (2-3 Jahre) dazwischen, die mir in diesem Artikel teilweise (bis ganz) fehlen. Auch ist der unter [[DelphiGL#Historie_im_Überblick]] gezeigte Zeitgraph an relativ vielen Stellen relativ weiß, was IMHO nicht für dessen Vollständigkeit spricht. Weiterhin fehlt in Bezug auf die Aprilscherze, die angeführt werden, die Informationen für die Jahre 2003 und 2004.&lt;br /&gt;
Insgesamt gefällt mir der Artikel also aus folgenden Gründen nicht:&lt;br /&gt;
#Aufmachung und Layout-Gestaltung&lt;br /&gt;
#Präsentation\Gliederung der Informationen&lt;br /&gt;
#Vollständigkeit der dargebrachten informationen&lt;br /&gt;
--[[Benutzer:BenBE|BenBE]] 18:12, 1. Jul 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Convolution-Filter]]&lt;br /&gt;
| --[[Benutzer:I0n0s|I0n0s]] 12:49, 15. Jun 2006 (CEST)&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 15:06, 28. Jun 2006 (CEST)&lt;br /&gt;
| &lt;br /&gt;
|Ohne mich jetzt explizit dagegen auszuprechen, möchte ich doch anmerken, dass man bei diesem Artikel noch einige Feinheiten wie (vor allem) eine etwas nähere Erklärung zum Gaussian-Blur einfügen könnte, und auch Informationen und/oder Verweise für Bias bzw. Skalierung der Werte etwas fehlen. Gaussian-Blur ist nun mal keine einfache Matrix die man hin &amp;quot;schmeisst&amp;quot; und das wars und Bias und Skalierung sollte der Vollständigkeit halber drinnen sein, somal es (meines Wissens nach) sogar von OpenGL unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
Also bevor das nicht drinnen ist gibts von meiner Seite aus keine Pluspunkte :-).&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 00:58, 4. Jul 2006 (CEST)&lt;br /&gt;
|-&lt;br /&gt;
| [[glTexParameter]]&lt;br /&gt;
| --[[Benutzer:Flash|Flash]] 15:06, 28. Jun 2006 (CEST)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswahlkriterien ==&lt;br /&gt;
&lt;br /&gt;
Ich finde die Asuwahlkriterien etwas strange. Schließlich sind Tutorials auch Artikel und in den meisten Fällen noch dazu ziemlich gute. Warum sollten diese also ausgeschlossen werden? Vermitteln ja schließlich meist recht anschaulich viel Information. Also exakt das, was nen guten Artikel ausmacht.&lt;br /&gt;
--[[Benutzer:Frase|Frase]] 18:48, 18. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tutorials sind einzelarbeiten die von einer Person gemacht wurden und die eigentlich auch nur von dieser zu Verantworten/Verbessern sind. Die Auszeichnung soll gerade dafür sorgen die &amp;quot;graue Maus&amp;quot; Artikel aufzuwerten. Das unsere Tutorials alle Exzellent sind steht außer Frage. Die Auszeichnung heißt aber nicht um sonst &amp;quot;Exzellente Artikel&amp;quot; und nicht &amp;quot;Exzellente Tutorials&amp;quot;. Außerdem soll die Auzeichnung erreichen, dass die Nutzer einfach mal ins Wiki reinlesen. Tutorials sind in sich geschlossen und verlinken kaum auf andere Artikel. Sie behandeln ein Thema, und das ist gut so.&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 01:11, 19. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und es kann die Leute animieren die Artikel den Kritierie anzupassen bzw. eigene Artikel einzustellen.&lt;br /&gt;
So hat es zumindest bei mir funktioniert. Ich habe jetzt sogar Bilder! :lol:&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 04:35, 19. Mär 2006 (CET)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=O-Notation&amp;diff=18343</id>
		<title>O-Notation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=O-Notation&amp;diff=18343"/>
				<updated>2006-06-30T15:54:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Noch eine kleine Anmerkung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die O-Notation beschreibt die Qualität eines Algorithmus (nicht jedoch die Qualität der Implementierung!). Meistens wird die Laufzeit betrachtet, jedoch kann die O-Notation beispielsweise auch für den Speicherbedarf verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die O-Notation besagt (sehr grob ausgedrückt): Die maximale Laufzeit für n Elemente übersteigt nicht die durch Faktor * O( f(n) ) angegebene Funktion.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich also um eine stark vereinfachte Berechnung des Laufzeitverhalten. Es fließen dabei nicht mit ein:&lt;br /&gt;
*Initialisierungen und Vorberechnungen (die O-Notation ist für hohe Wertebereiche ausgelegt)&lt;br /&gt;
*kleine Nebenberechnungen (da sie bei hohen Wertebereichen keine Rolle mehr spielen)&lt;br /&gt;
*Den Faktor (welcher stark von der Implementierung und der Hardware abhängen kann)&lt;br /&gt;
&lt;br /&gt;
'''Dadurch gilt also:'''&lt;br /&gt;
*O( n*n + 10*n + 100 ) = O( n*n ): Initialisierungen und kleine Nebenberechnungen weg lassen&lt;br /&gt;
*O( 3*n ) = O( n ): Faktoren weg lassen&lt;br /&gt;
*O( ld( n ) ) = O( log( n ) ): Faktoren weg lassen ( ld( n ) = log( n ) / log( 2 ) )&lt;br /&gt;
*O( n ) darf als O( n*n ) geschrieben werden: n übersteigt ab einem gewissen Wert X niemals n*n&lt;br /&gt;
*O( n*n ) darf nicht als O( n ) geschrieben werden: n*n übersteigt bei hohen Wertebereichen n =&amp;gt; nicht gültig&lt;br /&gt;
&lt;br /&gt;
'''Typische Algorithmen und ihre Laufzeiten:'''&lt;br /&gt;
*O( 1 ): Zugriff auf ein Element in einem Array &lt;br /&gt;
*O( log(n) ): Element suchen in einer (ausgeglichenen) Baumstruktur&lt;br /&gt;
*O( n ): Element suchen in einer Liste oder einem unsortierten Array&lt;br /&gt;
*O( n*log(n) ): Gute Sortieralgorithmen wie zB Heap Sort&lt;br /&gt;
*O( n*n ): Schlechte Sortieralgorithmen wie zB Bubblesort&lt;br /&gt;
&lt;br /&gt;
'''Wozu sollte die O-Notation verwendet werden:'''&lt;br /&gt;
*Für einen groben Vergleich von Algorithmen&lt;br /&gt;
*Für eine grobe Einteilung der Zeitkomplexität von Algorithmen&lt;br /&gt;
*Um besser einschätzen zu können für welche Wertebereiche ein Algorithmus geeignet ist&lt;br /&gt;
*Um besser einschätzen zu können wie stark n steigen darf mit der Hardware in einem Jahr (welche etwa doppelt so schnell ist)&lt;br /&gt;
&lt;br /&gt;
'''Wo sollte die O-Notation mit Vorsicht genossen werden:'''&lt;br /&gt;
*Genaue Bewertung eines Algorithmus (In der praktischen Anwendung laufen viele Algorithmen deutlich schneller als in der pessimistischen Theorie)&lt;br /&gt;
Beispiel: Quicksort hat eine maximale Laufzeit von O( n*n ), jedoch eine durchschnittliche Laufzeit von O( n*log(n) )&lt;br /&gt;
&lt;br /&gt;
'''Formale Definition:'''&amp;lt;br&amp;gt;&lt;br /&gt;
Seien f(x) und g(x) 2 Funktionen, dann gilt:&lt;br /&gt;
 f(x) = O( g(x) ) für x -&amp;gt; unendlich&lt;br /&gt;
wenn folgende Bediengung zutrifft:&lt;br /&gt;
 Es gibt 2 Zahlen a und b so dass:&lt;br /&gt;
  f(x) &amp;lt;= b * g(x) für alle x &amp;gt; a&lt;br /&gt;
&lt;br /&gt;
'''Einschränkungen'''&lt;br /&gt;
&lt;br /&gt;
Anzumerken sei noch, dass man bei der O-Notation üblicherweise weitere Annahmen trifft. So benötigt man zum Beispiel für das addieren von 2 Zahlen nicht eine Laufzeit von O(1) sondern O(n), wobei n die Anzahl der Bit dieser Zahlen ist. Dies wird jedoch üblicherweise vernachlässigt, da man sich meist mit Zahlen mit fixer Größe (heutzutage 32 oder 64 Bit) zufrieden gibt. Es spielt jedoch durchaus eine Rolle, wenn es beispielsweise um Mathematik-Bibliotheken mit beliebig großen Zahlen geht.&lt;br /&gt;
&lt;br /&gt;
Der umgekehrte Fall kann jedoch eintreffen wenn man einen Algorithmus für parallele Rechner implementiert. In diesem Fall existiert häufig auch eine kleinere obere Schranke für einen Algorithmus.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Floyd_Warshall&amp;diff=18342</id>
		<title>Floyd Warshall</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Floyd_Warshall&amp;diff=18342"/>
				<updated>2006-06-30T15:42:37Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Kritik */  O-Notation-Links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Eigenschaften==&lt;br /&gt;
Der Floy Warshall Algorithmus findet nicht nur den kürzesten Weg von einer Position zu einer anderen, sondern bestimmt alle kürzesten Wege von jedem Punkt zu jedem anderen. &lt;br /&gt;
&lt;br /&gt;
Der Graph darf negative Kanten enthalten aber Vorraussetzung ist, dass '''keine negativen Kreise''' im Graph enthalten sind. (Kreise die negative Kosten verursachen.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Algorithmus==&lt;br /&gt;
Der Algorithmus basiert auf einer (Adjazenz-)Matrix. Die Knoten des Graphen werden als Index verwendet.&lt;br /&gt;
Der Zeilenindex stellt den Startknoten dar, der Spaltenindex den Zielknoten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
T[1..n][1..n] of integer; //n = Anzahl der Knoten&lt;br /&gt;
&lt;br /&gt;
//Initialisierung&lt;br /&gt;
Matrix mit Maximalwert initialisieren.&lt;br /&gt;
Hauptdiagonale mit 0 initialisieren&lt;br /&gt;
&lt;br /&gt;
for i := 1 to n do&lt;br /&gt;
  for each Nachbar j von i do&lt;br /&gt;
     T[i][j] = Kosten(i nach j);&lt;br /&gt;
&lt;br /&gt;
//Eigentliches bestimmen der kürzesten Wege&lt;br /&gt;
for z := 1 to n do        //z = zwischenknoten&lt;br /&gt;
  for i := 1 to n do      //i = startknoten&lt;br /&gt;
    for j := 1 to n do    //j = Zielknoten&lt;br /&gt;
      if (T[i][z] + T[z][j]) &amp;lt; T[i][j]) then //&amp;quot;Wenn der Weg über den Zwischenknoten z besser ist&lt;br /&gt;
          T[i][j] := T[i][z] + T[z][j];      // als der direkte, nimm diesen Weg.&amp;quot;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls auf der Hauptdiagonale irgendwann ein Wert kleiner 0 steht hat man einen negativen Kreis gefunden. Dadurch ist nicht mehr sichergestellt, dass die Ergebnisse korrekt sind.&lt;br /&gt;
&lt;br /&gt;
Am Ende des Algorithmus stehen in T[i][j] die minimalen Kosten um von i nach j zu kommen.&lt;br /&gt;
Steht in T[i][j] der Maximalwert (siehe Initialisierung) ist j von i aus nicht erreichbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kritik==&lt;br /&gt;
'''Vorteile:'''&lt;br /&gt;
*Der Algorithmus findet die minimalen Kosten von '''allen''' Wegen im Graph.&lt;br /&gt;
*Der Algorithmus ist deshalb besonders geeignet um die kürzesten Wege in statischen Netzwerken zu finden, da er nur einmal ausgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
'''Nachteile:'''&lt;br /&gt;
*Der Algorithmus muss bei Änderungen des Netzwerks erneut aufgerufgen werden und berechnet dann alles neu.&lt;br /&gt;
*Der Algorithmus benötigt [[O-Notation|O]](n²) Speicherplatz.&lt;br /&gt;
*Mit einer '''Laufzeit von [[O-Notation|O]](n³)''' ist er nicht besonders schnell.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Interpolation&amp;diff=18226</id>
		<title>Interpolation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Interpolation&amp;diff=18226"/>
				<updated>2006-06-17T17:15:01Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Normalvektoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei Interpolationsverfahren geht es darum, aus wenigen Werten beliebig viele Werte zu generieren. Da die gegebenen Werte - wo Interpolation nötig ist - meistens als Stichproben gesehen werden können, werden verschiedenste Verfahren benötigt um auch die nicht gegebenen Werte den Ansprüchen entsprechend zu berechnen. Die Ansprüche variieren hierbei etwas anhand der Geschwindigkeitsanforderungen, des Zahlenraumes und nicht zuletzt anhand der Art und Weise wie man interpolieren möchte.&lt;br /&gt;
&lt;br /&gt;
=Polynom Interpolationen=&lt;br /&gt;
Wenn man N gegebene Werte hat, so kann man diese mit einem Polynom (N-1)ten Grades interpolieren. Eine Polynom Interpolationen besitzen die allgemeine Form:&lt;br /&gt;
 I = (t^n)*Fn + (t^(n-1))*F(n-1) + ... + t*F1 + F0&lt;br /&gt;
Wobei:&lt;br /&gt;
 t ... die Interpolationsposition im Wertebereich [0|1]&lt;br /&gt;
 Fx ... ein konstanter Wert oder Faktor (oder allgemein ein m-Dimensionaler Vektor)&lt;br /&gt;
 I ... das interpolierte Ergebnis, was ebenfalls ein einzelner Wert oder ein Vektor sein kann.&lt;br /&gt;
Durch die Vektor-Schreibweise sollte bereits klar sein, dass Polynom-Interpolationen für jede Dimension extrig berechnet werden, und somit auf beliebig viele Dimensionen erweiterbar sind.&lt;br /&gt;
&lt;br /&gt;
== Lineare Interpolation ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Die einfachste Form einer Polynom-Interpolation ist die lineare Interpolation. Hierbei sind nur 2 Werte gegeben, somit kann man diese Werte mit einem Polynom ersten Grades interpolieren. Dieses ist (wie unschwer zu erraten) eine Gerade der Form:&lt;br /&gt;
 I = t*F1 + F0&lt;br /&gt;
Diese (eher ungewöhnliche) Form der Geradengleichung entspricht der oben angegebenen Polynom-Interpolation in beliebiger Dimension. Die Berechnung der Faktoren Px erfolgt hier für jede Dimension getrennt. Gegeben seien 2 m dimensionale Punkte (A1, A2, ..., A(m-1), Am) und (B1, B2, ..., B(m-1), Bm). Nun lässt sich für jede Dimension d ein einfaches Gleichungssystem aufstellen:&lt;br /&gt;
 Ad = 0*F1d + F0d&lt;br /&gt;
 Bd = 1*F1d + F0d&lt;br /&gt;
da wir mit einem Interpolationswert von 0 den ersten Punkt (A) erhalten wollen und einem Interpolationswert von 1 den zweiten Punkt (B) möchten. Dies umgeformt auf P1d und P0d ergibt:&lt;br /&gt;
 F0d = Ad&lt;br /&gt;
 F1d = Bd - Ad&lt;br /&gt;
Diesen Rechenschritt wiederholen wir für jede Dimension.&lt;br /&gt;
&lt;br /&gt;
=== Rechenbeispiel ===&lt;br /&gt;
Wir wollen 2 Punkte im 3 dimensionalen Raum interpolieren:&lt;br /&gt;
 A: (2|5|0)&lt;br /&gt;
 B: (4|1|8)&lt;br /&gt;
Wir berechnen uns die Vektoren P1 und P0 wie oben angegeben, wobei x die erste und z die dritte Dimension dar stellen soll:&lt;br /&gt;
 F0x = Ax = 2&lt;br /&gt;
 F1x = Bx - Ax = 2&lt;br /&gt;
 F0y = Ay = 5&lt;br /&gt;
 F1y = By - Ay = -4&lt;br /&gt;
 F0z = Az = 0&lt;br /&gt;
 F1z = Bz - Az = 8&lt;br /&gt;
Somit erhalten wir die unsere Interpolationsgleichung:&lt;br /&gt;
 I(x|y|z) = t * (2|-4|8) + (2|5|0)&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationBsp1.png]]&lt;br /&gt;
&lt;br /&gt;
''2 dimensionale Version des obigen Beispieles. Die gegebenen Punkte sind somit A(2|5) und B(4|1). Diese Punkte sind in rot dargestellt. Die Gerade beinhaltet alle Punkte für die gegebene Formel mit t im Wertebereich [0|1]''&lt;br /&gt;
&lt;br /&gt;
== Polynome höheren Grades ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Wie euch vielleicht schon bei der linearen Interpolation aufgefallen ist, ist eine Reihung der Punkte (vorher nur 2) erforderlich. Welcher PUnkt soll das Ergebnis mit t = 0 sein? Und welcher mit t=1? Wenn man mehr als 2 Punkte gegeben hat, so benötigt man zusätzlich noch die Informationen für welches t die beiden neuen Punkte gelten sollen. Meistens interpoliert man hier die Werte für t linear. Das heißt bei N gegebenen Punkten, soll der x-te Punkt für den t-Wert&lt;br /&gt;
 t(Px) = x / (N-1) + 0&lt;br /&gt;
gegeben werden. Wobei:&lt;br /&gt;
 t(Px) ... der t-Wert für den x-ten Punkt&lt;br /&gt;
Das (N-1) der Gleichung wird uns noch länger verfolgen, deshalb werden wir im weiteren Verlauf N-1 als n bezeichnen. Hier noch kurz die Anmerkung, dass man bei einem gegebenen Punkt natürlich keine Parameter benötigt sondern der Punkt immer gleich ist. Man kann sich dies (und alles darauffolgende) auch so vorstellen, dass wir den ersten gegebenen Punkt F0 als 0-Punkt annehmen und erst am &amp;quot;Ende&amp;quot; F0 addieren. Aus dieser Sichtweise heraus bekommen wir unser n = N-1.&lt;br /&gt;
&lt;br /&gt;
Nun lässt sich wiederum das allgemeine (lineare) Gleichungssystem auffstellen:&lt;br /&gt;
 P0 = t(P0)^n * Fn + t(P0)^(n-1) * F(n-1) + ... + t(P0) * F1 + F0&lt;br /&gt;
 P1 = t(P1)^n * Fn + t(P1)^(n-1) * F(n-1) + ... + t(P1) * F1 + F0&lt;br /&gt;
 ...&lt;br /&gt;
 Pn = t(Pn)^n * Fn + t(Pn)^(n-1) * F(n-1) + ... + t(Pn) * F1 + F0&lt;br /&gt;
Wobei:&lt;br /&gt;
 Px ... der x-te Punkt&lt;br /&gt;
 t(Px) ... der t-Wert für den x-ten Punkt&lt;br /&gt;
 Fy ... der zu berechnende Faktor&lt;br /&gt;
Also ein Gleichungssystem mit n unbekannten und n (linear unabhängigen) Gleichungen, welches sich demnach eindeutig lösen lässt. Wobei dieses Gleichungssystem wiederum für jede Dimension extrig aufgestellt und berechnet werden muss! Da man (eindeutig lösbare) Gleichungssystem recht angenehm durch Matrizen-Mathematik lösen kann, empfiehlt sich auch folgende Schreibweise:&lt;br /&gt;
 P = M * F&lt;br /&gt;
Wobei:&lt;br /&gt;
 P ... ein N dimensionaler Vektor der die gegebenen Werte für den jeweiligen Punkt beinhaltet&lt;br /&gt;
 M ... eine NxN Matrix welche die t(Px)^y beinhaltet&lt;br /&gt;
 F ... ein N dimensionaler Vektor der die zu berechnenden Faktoren erhält&lt;br /&gt;
 und N ... wie gehabt die Anzahl der gegebenen Punkte und n = N - 1&lt;br /&gt;
&lt;br /&gt;
Dies kann man nun umformen in:&lt;br /&gt;
 M^-1 * P = F&lt;br /&gt;
Wobei:&lt;br /&gt;
 M^-1 ... die inverse von M ist&lt;br /&gt;
&lt;br /&gt;
Dadurch erhält man alle Werte Fy die man benötigt und kann somit für ein gegebenes t wiederum in die allgemeine Form:&lt;br /&gt;
  I = (t^n)*Fn + (t^(n-1))*F(n-1) + ... + t*F1 + F0&lt;br /&gt;
einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Rechenbeispiel ===&lt;br /&gt;
Wir wollen über 4 Punkte eine Polynominterpolation im 2 dimensionalen Raum. Diese sind:&lt;br /&gt;
 P0: (5|3)&lt;br /&gt;
 P1: (1|4)&lt;br /&gt;
 P2: (4|2)&lt;br /&gt;
 P3: (1|2)&lt;br /&gt;
Wir legen nun zuerst wieder die t-Werte für die Punkte fest, und sagen:&lt;br /&gt;
 P0 bei t=0&lt;br /&gt;
 P1 bei t=1/3&lt;br /&gt;
 P2 bei t=2/3&lt;br /&gt;
 P3 bei t=1&lt;br /&gt;
Und berechnen uns nun die Matrix M mit diesen t-Werten:&lt;br /&gt;
     |   0^3    0^2   0^1 1 |&lt;br /&gt;
 M = | 0.33^3 0.33^2 0.33 1 |&lt;br /&gt;
     | 0.66^3 0.66^2 0.66 1 |&lt;br /&gt;
     |   1^3    1^2   1^1 1 |&lt;br /&gt;
Und berechnen uns nun die inverse M^-1:&lt;br /&gt;
        | -4.5  13.5 -13.5  4.5 |&lt;br /&gt;
 M^-1 = |   9  -22.5   18  -4.5 |&lt;br /&gt;
        | -5.5   9    -4.5   1  |&lt;br /&gt;
        |   1    0      0    0  |&lt;br /&gt;
Nun nehmen wir den P-Vektor der ersten Dimension:&lt;br /&gt;
 Px = (5|1|4|1)&lt;br /&gt;
und multiplizieren ihn mit der Matrix wodurch wir&lt;br /&gt;
 Fx = M^-1 * Px = (-58.5|90|35.5|5)&lt;br /&gt;
erhalten. Nun das selbe für die zweite Dimension:&lt;br /&gt;
 Py = (3|4|2|2)&lt;br /&gt;
und wiederum&lt;br /&gt;
 Fy = M^-1 * Py = (22.5|-36|12.5|3)&lt;br /&gt;
&lt;br /&gt;
Somit ist unsere endgültige Formel für die Interpolation:&lt;br /&gt;
 Ix = -58.5 * t^3 + 90 * t^2 - 35.5 * t + 5&lt;br /&gt;
 Iy = 22.5 * t^3 - 36 * t^2 + 12.5 * t + 3&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationBsp2.png]]&lt;br /&gt;
&lt;br /&gt;
''Oben angegebenes Beispiel grafisch dargestellt. Die Punkte P0 bis P3 sind rot dargestellt. Die Kurve beinhaltet alle Punkte der gegebenen Funktionen für ( Ix , Iy ) mit t im Wertebereich [0|1].''&lt;br /&gt;
&lt;br /&gt;
=Kurven mit gegebenen Tangenten=&lt;br /&gt;
Wir haben die oben gegebene Polynom-Gleichung für N Punkte. Wenn wir nun zusätzlich J Tangenten angeben möchten, so haben wir natürlich J zusätzliche Gleichungen und benötigen ein Polynom (N+K-1)ten Grades. Als erstes stellen wir wiederum eine derartige Polynom-Gleichung auf, jedoch mit dem Unterschied das wir dies gleich mit dem (N+J-1)ten Grad machen. Des weiteren müssen wir für jede Tangente Festlegen bei welchem t^x wir sie einbrigen möchten. Der Einfachheit halber wird hier die Reihung: zuerst die Punkte (also einem t^x mit höherem x) und danach die Tangenten (also einem t^x mit niedrigerem x als die Punkte bis hin zu x=0) verwendet. Daraus ergibt sich die allgemeine Form für die Punkte:&lt;br /&gt;
 P0 = t(P0)^(n+J) * F(n+J) + t(P0)^(n+J-1) * F(n+J) + ... + t(P0)^(J+1) * F(J+1) + t(P0)^J * F(J) + t(P0)^(J-1) * F(J-1) + t(P0)^(J-2) * F(J-2) + ... + t(P0) * F1 + F0&lt;br /&gt;
 P1 = t(P1)^(n+J) * F(n+J) + t(P1)^(n+J-1) * F(n+J) + ... + t(P1)^(J+1) * F(J+1) + t(P1)^J * F(J) + t(P1)^(J-1) * F(J-1) + t(P1)^(J-2) * F(J-2) + ... + t(P1) * F1 + F0&lt;br /&gt;
 ...&lt;br /&gt;
 Pn = t(Pn)^(n+J) * F(n+J) + t(Pn)^(n+J-1) * F(n+J) + ... + t(Pn)^(J+1) * F(J+1) + t(Pn)^J * F(J) + t(Pn)^(J-1) * F(J-1) + t(Pn)^(J-2) * F(J-2) + ... + t(Pn) * F1 + F0&lt;br /&gt;
Wobei:&lt;br /&gt;
 Px ... der x-te Punkt&lt;br /&gt;
 t(Px) ... der t-Wert für den x-ten Punkt&lt;br /&gt;
 F(n+J) bis F(J) ... der zu berechnende Faktor für den (N-1)ten Punkt&lt;br /&gt;
 F(J-1) bis F(0) ... der zu berechnende Faktor für die J-te Tangente&lt;br /&gt;
Nun benötigen wir natürlich noch weitere Gleichungen für die Tangenten um das Gleichungssystem eindeutig lösbar zu machen. Eine Tangente K (hier wird bewusst K und nicht T gewählt) für den Xten Punkt lässt sich durch eine Ableitung nach t berechnen:&lt;br /&gt;
 K(Px) = (n+J) * t(Px)^(n+J-1) * F(n+J) + (n+J-1) * t(Px)^(n+J-2) * F(n+J-1) + ... + (J+1) * t(Px)^(J) * F(J+1) + J * t(Px)^(J-1) * F(J) + (J-1) * t(Px)^(J-2) * F(J-1) + (J-2) * t(Px)^(J-3) * F(J-2) + ... + t(Px) * F2 + F1 + ( 0 * F0 )&lt;br /&gt;
Mit diesen Gleichungssystemen können wir wiederum eine Matrix formen, diese invertieren und los legen. Aber (meines Erachtens) erklärt sich dies am besten an einem Beispiel.&lt;br /&gt;
&lt;br /&gt;
=== Hermite Kurven ===&lt;br /&gt;
Hermite Kurven sind Interpolationsfunktionen wo der Anfangs- und Endpunkt eine bestimmte Tangente aufweist. Üblicherweise werden Hermite Kurven zusätzlich noch auf 2 gegebene Punkte beschränkt, was wir hier der Einfachheit halber beibehalten wollen. Wir haben 2 Punkte, 2 Tangenten wodurch wir auf ein Polynom (N+J-1) = (2+2-1) = 3ten Grades kommen. Alse stellen wir eine Polynomgleichung für 2 gegebene Punkte auf, wobei der erste Punkt den Zeitpunkt 0 und der zweite Punkt den Zeitpunkt 1 erhält. Dadurch kommen wir auf zwei triviale Gleichungen:&lt;br /&gt;
 P0 = 0 * F(3) + 0 * F(2) + 0 * F(1) + 1 * F(0)&lt;br /&gt;
 P1 = 1 * F(3) + 1 * F(2) + 1 * F(1) + 1 * F(0)&lt;br /&gt;
Nun noch die Tangentengleichungen die sich aus der oben angegebenen K(Px) - Formel ergeben:&lt;br /&gt;
 K0 = 0 * F(3) + 0 * F(2) + 1 * F(1) + 0 * F(0)&lt;br /&gt;
 K1 = 3 * F(3) + 2 * F(2) + 1 * F(1) + 0 * F(0)&lt;br /&gt;
Dies ist unser lineares Gleichungssystem woraus wir wiederum unsere Matrix gewinnen:&lt;br /&gt;
     | 0 0 0 1 |&lt;br /&gt;
 M = | 1 1 1 1 |&lt;br /&gt;
     | 0 0 1 0 |&lt;br /&gt;
     | 3 2 1 0 |&lt;br /&gt;
Und natürlich die Formel:&lt;br /&gt;
 W = M * F&lt;br /&gt;
Wobei:&lt;br /&gt;
 W ... ein Vektor ist der die Werte P0, P1, K0, K1 (in dieser Reihenfolge) beinhaltet&lt;br /&gt;
 M ... die oben gegebene Matrix&lt;br /&gt;
 F ... der Vektor der die zu berechnenden Werte beinhaltet.&lt;br /&gt;
Diese Matrix invertiert ergibt:&lt;br /&gt;
        |  2 -2  1  1 |&lt;br /&gt;
 M^-1 = | -3  3 -2 -1 |&lt;br /&gt;
        |  0  0  1  0 |&lt;br /&gt;
        |  1  0  0  0 |&lt;br /&gt;
Somit können wir den F-Vektor berechnen durch&lt;br /&gt;
 M^-1 * W = F&lt;br /&gt;
Wenn wir nun also für W die Werte (2,3,-1,1) hätten, wobei hier&lt;br /&gt;
 2 ... der erste Punkt&lt;br /&gt;
 3 ... der zweite Punkt&lt;br /&gt;
 -1 ... die Tangente für den ersten Punkt&lt;br /&gt;
 1 ... die Tangente für den zweiten Punkt&lt;br /&gt;
so ergeben sich daraus die Faktoren:&lt;br /&gt;
 F = M^-1 * W = (-2,4,-1,2)&lt;br /&gt;
Wodruch wir für unsere Kurve folgende Formel erhalten:&lt;br /&gt;
 f(t) = t^3 * (-2) + t^2 * 4 + t * (-1) + 2&lt;br /&gt;
Da die Dimensionen hier ebenfalls unabhängig sind, können Hermit-Kurven auf beliebig viele Dimensionen erweitert werden.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationBsp3.PNG]]&lt;br /&gt;
&lt;br /&gt;
''Oben angegebenes Beispiel grafisch dargestellt. Die beiden Punkte sind rot dargestellt, die beiden Tangenten sind als blaue Geraden eingezeichnet. Die Kurve beinhaltet alle Punkte der gegebenen Funktionen für t im Wertebereich [0|1].''&lt;br /&gt;
&lt;br /&gt;
=Tangenten von Kurven=&lt;br /&gt;
Besitzt man die Funktion für eine Kurve so lässt sich die Tangente durch das differenzieren dieser Funktion ermitteln. Aus unserem vorigen Beispiel wäre dies:&lt;br /&gt;
 f(t) = t^3 * (-2) + t^2 * 4 + t * (-1) + 2&lt;br /&gt;
 f'(t) = -6 * t^2 + 8 * t - t&lt;br /&gt;
Da die Dimensionen einer derartigen Kurve wie gesagt unabhängig voneinander behandelt werden können, kann man dadurch die Tangente in der entsprechenden Dimension erhalten.&lt;br /&gt;
&lt;br /&gt;
= Interpolation mit anderen Funktionen =&lt;br /&gt;
Bisher wurden nur Interpolationen gezeigt, bei denen der t-Wert potenziert wurde. Es wurde immer ein Anfangspunkt verwendet, für den der t-Wert 0 sein sollte, und ein Endpunkt für den der t-Wert 1 sein sollte. Wir können natürlich jede beliebige Funktion für die Interpolation verwenden wo dies zutrifft. Wenn wir möchten können wir natürlich auch eine Funktion verwenden wo der Anfangspunkt bei t=X und der Endpunkt bei t=Y zu finden ist, denn eine derartige Funktion können wir wiederum umformen zu einer Funktion für die wir einen Anfangspunkt mit t=0 und einen Endpunkt mit t=1 haben.&lt;br /&gt;
&lt;br /&gt;
Andere Funktionen werden meistens (nicht immer) bei nur 2 gegebenen Punkten verwendet. Hier wird meistens aus einem t-Wert im Bereich [0|1] ein neuer Wert u im Bereich [1|0] berechnet, welcher danach ähnlich wie bei der linearen Interpolation verwendet wird. Also:&lt;br /&gt;
 u = f(t)&lt;br /&gt;
 Interpolierter_Wert = I(t) = u * Startwert + (1-u) * Endwert&lt;br /&gt;
Wobei:&lt;br /&gt;
 f(t) ... die Interpolationsfunktion, welche bei t=0 1 zurück liefert und bei t=1 0 ist.&lt;br /&gt;
 Interpolierter_Wert ... das Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Mögliche andere Funktionen sind nun beispielsweise:&lt;br /&gt;
&lt;br /&gt;
== Cosinus ähnliche Interpolation ==&lt;br /&gt;
&lt;br /&gt;
===Cosinus Interpolation===&lt;br /&gt;
Der Cosinus liefert Werte zwischen -1 und 1. Wir wollen einen eindeutigen y-Wert für y=Cos(t), somit verwenden wir nur t-Werte im Wertebereich von 0 bis 180 Grad (bzw. 0 bis Pi Radianten), denn bei t=181 Grad würden wir ja den selben Wert erhalten wie für t=179 Grad.&lt;br /&gt;
&lt;br /&gt;
Der t-Wert wird für den Cosinus im Wertebereich [0|Pi] bzw. [0|180Grad] benötigt. Um nun einen t-Wert (wie zuvor) im Wertebereicheich von [0|1] verwenden zu können, multiplizieren wir ihn einfach mit Pi. Also verwenden wir einfach&lt;br /&gt;
 t2 = t * Pi&lt;br /&gt;
bzw. das Ganze mit Grad:&lt;br /&gt;
 t2 = t * 180&lt;br /&gt;
&lt;br /&gt;
Der Ausgabewert von Cosinus ist im Wertebereich [1|-1]. Um ihn auf den Wertebereich [1|0] zu bringen, müssen wir ihn transformieren. Dafür formen wir um:&lt;br /&gt;
 f(t2) = Cos(t2)&lt;br /&gt;
 g(t2) = f(t2)/2 + 1/2 = ( 1 + f(t2) ) / 2 = ( 1 + Cos(t2) ) / 2&lt;br /&gt;
Und nun noch t2 durch t ersetzt:&lt;br /&gt;
 g(t) = ( 1 + Cos(t*Pi) ) / 2&lt;br /&gt;
bzw. das Ganze mit Grad:&lt;br /&gt;
 g(t) = ( 1 + Cos(t*180) ) / 2&lt;br /&gt;
&lt;br /&gt;
Wir haben nun eine Formel die uns bei t=0 einen Wert von 1 liefert und bei t=1 einen Wert von 0. Dies können wir in unsere allgemeine Funktion einsetzen:&lt;br /&gt;
 Interpolierter_Wert = I(t) = g(t) * Startwert + ( 1 - g(t) ) * Endwert&lt;br /&gt;
Und für g(t) eingesetzt:&lt;br /&gt;
 Interpolierter_Wert = I(t) = ( (1+Cos(t*Pi))/2 ) * Startwert + ( 1 - (1+Cos(t*Pi))/2 ) * Endwert&lt;br /&gt;
bzw. das Ganze mit Grad:&lt;br /&gt;
 Interpolierter_Wert = I(t) = ( (1+Cos(t*180))/2 ) * Startwert + ( 1 - (1+Cos(t*180))/2 ) * Endwert&lt;br /&gt;
&lt;br /&gt;
Nun die Frage warum der ganze Aufwand, also warum nicht linear interpolieren? Um dies zu beantworten müssen wir die Steigungen dieser Funktion betrachten, wofür wir die Ableitung der Funktion berechnen:&lt;br /&gt;
 I'(t) = 1/2 * Endwert * Pi * Sin( t * Pi ) - 1/2 * Startwert * Pi * Sin( t * Pi )&lt;br /&gt;
Sieht kompliziert aus, aber wenn wir nun t=0 annehmen so erhalten wir für Sin( t * Pi ) ebenfalls 0. Wenn wir für t=1 annehmen so erhalten wir für Sin( t * Pi ) wiederum 0. Und dadurch erhalten wir an beiden Enden eine Steigung von 0.&lt;br /&gt;
&lt;br /&gt;
Was können wir machen mit einer Funktion die an beiden Enden eine Steigung von 0 aufweist? Ganz einfach: wir können mehrere dieser Funktionen aneinander reihen, ohne das man einen übergang erkennt. Somit können wir sagen:&lt;br /&gt;
 Bei t im Bereich [0|1] verwende als Startwert 3 und als Endwert 1&lt;br /&gt;
 Bei t im Bereich ]1|2] verwende als Startwert 1 und als Endwert 7&lt;br /&gt;
 Bei t im Bereich ]2|3] verwende als Startwert 7 und als Endwert 8&lt;br /&gt;
Und wenn wir alle 3 Funktionen mit dem Wertebereich [0|1] verwenden (oder mathematisch ausgedrückt: I2(t) = I(t modulo 1) ), so erhalten wir eine Kurve ohne Kanten, oder um es etwas mathematischer auszudrücken: diese Funktion ist im Wertebereich ]0|3[ ableitbar, also in diesem Wertebereich auch stetig.&lt;br /&gt;
&lt;br /&gt;
Und um die Ästhetik hinter diesen Formeln zu zeigen, ein Vergleich von linearer- zu cosinus-Interpolation:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Interpolation.png]]&lt;br /&gt;
&lt;br /&gt;
=== Quadratische Annäherung der Cosinus Interpolation ===&lt;br /&gt;
Da die Berechnung des Cosinus eine etwas aufwändigere Angelegenheit ist, wünscht man sich hin und wieder eine Funktion die ähnlich aussieht und die gleichen Bedingungen (also eine Steigung von 0 an Start- und Endpunkt) erfüllt. Hierfür kann man 2 quadratische Funktionen verwenden die folgendes erfüllen müssen:&lt;br /&gt;
#Beide Kurven müssen einen gemeinsamen Punkt besitzen, also I1(t) = I2(t) für t im Wertebereich [0|1]&lt;br /&gt;
#An diesem Punkt müssen beide Kurven die selbe Steigung besitzen, also es existiert ein ( I1(X) = I2(X) wo auch gilt I1'(X) = I2'(X) ).&lt;br /&gt;
#Steigung (also Ableitung) bei t=0 und t=1 soll 0 sein&lt;br /&gt;
#Die Kurve sollte symmetrisch sein bezogen auf t=0.5, so das gilt: I1(t) = 1-I2(1-t). Somit muss gleichzeitig der Punkt wo gilt I1(t) = I2(t) bei 0.5 liegen.&lt;br /&gt;
&lt;br /&gt;
Wir können uns nun aus der ersten und dritten Bedinung einfach die beiden Formeln herleiten, aber um es kurz zu machen:&lt;br /&gt;
 Wenn t &amp;lt;= 0.5 dann I1(t) = -2*t^2 + 1&lt;br /&gt;
 Wenn t &amp;gt; 0.5 dann I2(t) = 2*t^2 - 4*t + 2 = 2 * (1-t)^2&lt;br /&gt;
Nun zeigen wir, dass die oben angegebenen Bedingungen erfüllt sind:&lt;br /&gt;
#I1(0.5) = -2*0.5^2 + 1 = 0.5; I2(0.5) = 2 * (1-0.5)^2) = 0.5&lt;br /&gt;
#I1'(t) = -4t, I1'(0.5) = -2; I2'(t) = 4*t - 4, I2'(0.5) = -2&lt;br /&gt;
#I1'(0) = -4*0 = 0; I2'(1) = 4*1 - 4) = 0&lt;br /&gt;
#I1(t) = 1-I2(1-t) '''=&amp;gt;''' -2*t^2 + 1 = 1 - (2*(1-t)^2 - 4*(1-t) + 2) '''=&amp;gt;''' -2*t^2 + 1 = 1 - (2 - 4*t + 2*t^2 - 4 + 4*t + 2) '''=&amp;gt;''' -2*t^2 + 1 = -2*t^2 + 1&lt;br /&gt;
&lt;br /&gt;
=== Cosinus ähnliche Interpolation durch Polynominterpolation ===&lt;br /&gt;
Wenn wir eine Polynominterpolation mit den beiden Endtangenten 0 berechnen wollen, so verwenden wir eine Hermite Kurve. Hierbei verwenden wir die Werte:&lt;br /&gt;
 1 ... Startpunkt&lt;br /&gt;
 0 ... Endpunkt&lt;br /&gt;
 0 ... Steigung bei Startpunkt&lt;br /&gt;
 0 ... Steigung bei Endpunkt&lt;br /&gt;
Mit der unter Hermit Kurven angegebenen Matrix M^-1 können wir uns nun die dazugehörige Funktion berechnen und erhalten:&lt;br /&gt;
 I(t) = 2*t^3 - 3*t^2 + 1&lt;br /&gt;
Die ersten beiden Bedingungen von vorher sind automatisch erfüllt, da es sich nur um eine Funktion handelt. Für die 3. und 4. Bedingung lässt sich ebenfalls verhältnismäßig einfach zeigen das sie erfüllt sind.&lt;br /&gt;
&lt;br /&gt;
=== Vergleich der Cosinus ähnlichen Interpolationsarten ===&lt;br /&gt;
Und zu guter letzt hier noch die grafische Veranschaulichung der etwas zahlenbeladenen Funktionen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationCosAnnaeherung.png]]&lt;br /&gt;
&lt;br /&gt;
''Die 3 Cosinus ähnlichen Funktionen graphisch dargestellt:&lt;br /&gt;
*Grün: Cos-Interpolation&lt;br /&gt;
*Rot: Polynom-Interpolation&lt;br /&gt;
*Blau: Quadratische Annäherung''&lt;br /&gt;
&lt;br /&gt;
=Interpolierte Flächen=&lt;br /&gt;
Bisher wurden ausschließlich Kurven betrachtet. Aus Kurven lassen sich jedoch ohne größere Umstände auch Flächen bilden. Hier hat man zwei (unterschiedliche) t-Werte und eine Matrix von Punkten gegeben, wobei jeder Punkt gegebenenfalls noch 1 oder 2 Tangenten besitzen kann. Um einen Punkt einer Fläche zu berechnen interpoliert man zuerst die Punkte für jede Zeile der Punktmatrix. Nachdem man nun die interpolierten Punkte für jede Zeile besitzt kann man sich mit diesen Punkten ein neues Gleichungssystem aufstellen und wiederum eine Kurve bilden. Diese Kurve interpoliert man wiederum mit dem zweiten gegebenen t-Wert. Dies lässt sich auf beliebig viele Dimensionen nach dem gleichen Schema erweitern, üblicherweise wird dies jedoch nur für Oberflächen (also 2D) benötigt.&lt;br /&gt;
&lt;br /&gt;
==Normalvektoren==&lt;br /&gt;
Besitzt man Flächen und berechnet sie nach dem gegebenen Schema, so berechnet man sich zuerst auch mehrere Kurven von denen man die Tangenten berechnen kann. Interpoliert man nun diese Tangenten mit der gleichen Kurvenfunktion wie die resultierenden Punkte, und berechnet sich aus der resultierenden Kurvenfunktion ebenfalls die Tangente, so erhält man 2 Tangenten. Aus diesen beiden Tangenten kann nun mit einem Kreuzprodukt ein Normalvektor errechnet werden.&lt;br /&gt;
&lt;br /&gt;
=Kurvenlängen-Interpolation=&lt;br /&gt;
Es könnte erwünscht sein (beispielsweise für Kamerafahrten, Keyframe Interpolationen jeglicher Art oder auch bei der Interpolation von Positionsangaben die man beispielsweise über ein Netzwerk erhält), dass man über keine fixe Achse t interpolieren möchte, sondern über die Kurvenlänge.&lt;br /&gt;
&lt;br /&gt;
Bei den typischen physikalischen Beispielen besitzt man meist eine Geschwindigkeit welche durch Beschleunigung verändert wird. Also wenn man einen Ball senkrecht hoch wirft, so gibt es einen Punkt an dem er komplett stehen bleibt. Für diese Art von physikalischen Berechnungen wird man also kaum eine Kurvenlängen-Interpolation benötigen.&lt;br /&gt;
&lt;br /&gt;
Wenn man jedoch sehr langsame Geschwindigkeiten besitzt, also beispielsweise zu fuß geht, so haben wir eine nahezu konstante Gehgeschwindigkeit, egal ob wir eine Kurve gehen oder nicht. Wenn wir noch weiter gehen und auf einer Straße oder einer Rennstrecke alle 100 Meter ein Längenangabenschild hin stellen möchten, so ist uns Beschleunigung und auch die Geschwindigkeit vollkommen egal. Wir hätten also am liebsten eine Funktion P(s), welche uns den Punkt der Kurve für für Kilometer (oder Meter) s liefert.&lt;br /&gt;
&lt;br /&gt;
==Der eindimensionale Fall==&lt;br /&gt;
Dieser Teil soll lediglich als Erklärung dienen, besitzt in der Praxis aber kaum Relevanz.&lt;br /&gt;
&lt;br /&gt;
Im Eindimensionalen Fall kann man sich dies noch sehr gut veranschaulichen. Wenn ich eine gerade Strecke besitze und meine 1D-Koordinaten kenne, so kann ich ganz einfach sagen: zum Zeitpunkt t bin ich Betrag( f(t) - f(t0) ) Meter (allg. Einheiten) gegangen. Interessant wir es noch mal wenn ich die Richtung ändere, also wenn ich bei Kilometer 4 merke das ich etwas zu Hause vergessen habe, noch einmal umdrehe und dann weiter fahre. In diesem Fall kann ich nicht sagen: ich befinde mich an Position 10 Kilometer entfernt =&amp;gt; ich bin 10 Kilometer gegangen, sondern in Wirklichkeit habe ich noch zusätzlich 8 Kilometer umweg hinter mir.&lt;br /&gt;
&lt;br /&gt;
Dieses simple beispiel mathematisch ausgedrückt:&lt;br /&gt;
&lt;br /&gt;
 wenn f(t) monoton steigend oder monoton fallend ist: Kurvenlänge(t) = | f(t) - f(t0) | &lt;br /&gt;
 Sonnst: Kurvenlänge = Integral[t0 bis t]( f'(t) )&lt;br /&gt;
Beim Integrieren müssen wir nun aufpassen, ob unsere Stammfunktion 0-Stellen besitzt. Bei jeder solchen 0-Stelle Zx zerteilen wir die Wertebereiche:&lt;br /&gt;
 W = [t0, Z1, Z2, Z3, ..., Zn, t]&lt;br /&gt;
&lt;br /&gt;
 Kurvenlänge(t) = Summe[ n=1 bis Elemente von W ]( Integral[W[n-1] bis W[n]]( f'(t) )&lt;br /&gt;
Da wir nun in der Stammfunktion alle 0-Stellen berücksichtigt haben können wir das Integral &amp;quot;kürzen&amp;quot;, also&lt;br /&gt;
 Kurvenlänge(t) = Summe[ n=1 bis Elemente von W ]( | f(w[n]) - f(w[n-1]) | )&lt;br /&gt;
&lt;br /&gt;
Das Integral macht hier also nichts anderes als Richtungswechsel zu erkennen, denn bei einem Richtungswechsel in 1D ändert sich das Vorzeichen der Ableitung einer Funktion, und für jeden Vorzeichenwechsel muss es auch einen 0-Punkt geben wenn es sich um eine stetige Funktion handelt.&lt;br /&gt;
&lt;br /&gt;
Wir kennen nun also den Weg den wir zu einem bestimmten Zeitpunkt zurückgelegt haben. Wir wollen jedoch den Zeitpunkt wissen an dem wir eine bestimmte Weglänge zurückgelegt haben, um die Funktion f(t) durch f(t(s)) = g(s) wodurch g(s) eine Funktion ist wo wir die Position für einen bestimmte Kurvenlänge erhalten.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also ein t finden für das gilt&lt;br /&gt;
 Kurvenlänge(t) = s&lt;br /&gt;
und können danach dieses t in unsere Ursprüngliche Kurvengleichung einsetzen.&lt;br /&gt;
&lt;br /&gt;
Und nun mit voller Wucht: warum bringt uns das alles ganz und gar nichts?&lt;br /&gt;
Wenn wir eine Eindimensionale &amp;quot;Kurve&amp;quot; besitzen und wir wollen diese über die Kurvenlänge parametrisieren, so sagen wir schlicht und ergreifend:&lt;br /&gt;
 x = x0 +/- s&lt;br /&gt;
wenn wir nicht mehrere Fälle besitzen. Wenn wir Fallunterscheidungen bekommen, so gibt es (wie im mehrdimensionalen Fall noch verdeutlicht wird) natürlich auch Methoden mit denen wir diese Fallunterscheidungen umgehen können (namentlich: numerische Integration). Dennoch ist die Funktion wohl in nahezu allen Fällen einfacher mit derartigen Fallunterscheidungen zu berechnen.&lt;br /&gt;
&lt;br /&gt;
===Beispiel===&lt;br /&gt;
Ein Beispiel noch am Rande, wie man unschwer erahnen kann, gibt es eher wenig alltäglichere Beispiele die nicht zu trivial und von Interesse wären:&lt;br /&gt;
&lt;br /&gt;
Wir besitzen eine gedämpfte Schwingung mit der Formel&lt;br /&gt;
 f(t) = e^(-t) * sin(t)&lt;br /&gt;
und möchten aus unerfindlichen Gründen wissen wo sich der schwingende Körper befindet wenn er den Weg s zurückgelegt hat.&lt;br /&gt;
&lt;br /&gt;
Wir berechnen uns die Ableitung&lt;br /&gt;
 f'(t) = e^(-t) * cos(t) - e^(-t) * sin(t)&lt;br /&gt;
und nun die 0-Stellen, also&lt;br /&gt;
 f'(t) = 0&lt;br /&gt;
davon gibt es aber natürlich jede Menge ... aber wir begnügen und mit den ersten 3:&lt;br /&gt;
 f'(PI/4) = 0   | f(PI/4) ~= 0.322&lt;br /&gt;
 f'(~3.927) = 0 | f(3.927) ~= -0.014&lt;br /&gt;
 f'(~7.069) = 0 | f(7.069) ~= 0.0006&lt;br /&gt;
Da der Startpunkt (t=0) natürlich auch bei 0 liegt, erhalten wir also jetzt für unsere Position in Abhängigkeit der Weglänge s:&lt;br /&gt;
 g(s) = s für s im Bereich [0,0.322]&lt;br /&gt;
 g(s) = 2*0.322-s für s im Bereich ]0.322|0.658] wobei 0.658 = 0.322 + | 0.322-0.014 |&lt;br /&gt;
 g(s) = s-2*0.322-2*0.014 für s im Bereich ]0.658|0.6585] wobei 0.6586 = 0.322 + | 0.322 - (-0.014) | + | -0.014 - 0.0006 |&lt;br /&gt;
 &lt;br /&gt;
==Kurven in höheren Dimensionen==&lt;br /&gt;
Im allgemeinen Fall kann eine Kurve in einer bestimmten Dimension als Vektor von Funktionen dargestellt werden:&lt;br /&gt;
        | x(t) |&lt;br /&gt;
 P(t) = | y(t) |&lt;br /&gt;
        | z(t) |&lt;br /&gt;
        | ...  |&lt;br /&gt;
wir können die Tangente berechnen indem wir in jeder Dimensionen die Funktion ableiten:&lt;br /&gt;
        | x'(t) |&lt;br /&gt;
 T(t) = | y'(t) |&lt;br /&gt;
        | z'(t) |&lt;br /&gt;
        | ...   |&lt;br /&gt;
und natürlich handelt es sich nun nicht um irgendeine Tangente, sondern um die Tangente welche auch die Änderungsgeschwindigkeit der Kurve abhängig von t beschreibt. Wir können die Länge dieser Tangente also als Geschwindigkeit der Kurve betrachten. Die Länge eines Vektors ist ein skalarer Wert, also erhalten wir für die Geschwindigkeit zu einem Zeitpunkt t die Funktion:&lt;br /&gt;
 Geschwindigkeit(t) = | T(t) |&lt;br /&gt;
Der Betrag der Tangente wir nun folgendermaßen gebildet:&lt;br /&gt;
 Geschwindigkeit(t) = Wurzel( x'(t)^2 + y'(t)^2 + z'(t)^2 + ... )&lt;br /&gt;
Nun besitzen wir eine Funktion für die Geschwindigkeit der Kurve welche uns integriert die Länge der Kurve bis zum Zeitpunkt t angibt. Im Gegensatz zum eindimensionalen Fall (wo dies eher wenig Sinn hatte) quadrieren wir hier jeden verwendeten Wert, wodurch diese Funktion niemals &amp;lt; 0 werden kann, somit müssen wir beim integrieren auch nicht auf 0-Stellen aufpassen.&lt;br /&gt;
&lt;br /&gt;
Wir Integrieren nun:&lt;br /&gt;
 Kurvenlänge(t) = Integral[t0 bis t]( Geschwindigkeit(t) )&lt;br /&gt;
&lt;br /&gt;
Und hier stoßen wir an einen unangenehmen Punkt. Nehmen wir ein &amp;quot;einfaches&amp;quot; Polynom für x(t), y(t) und z(t). An einem Integral wie aus unserem Polynom-Beispiel:&lt;br /&gt;
 Integral[t0 bis t]( Wurzel( (-58.5*t^3 + 90*t^2 - 35.5*t + 5)^2 + (22.5*t^3 - 36*t^2 + 12.5*t + 3)^2 ) )&lt;br /&gt;
scheitern sogar gute Mathematik-Bibliotheken, und von normalsterblichen Menschen ganz zu schweigen.&lt;br /&gt;
&lt;br /&gt;
Doch noch ist nicht alles Verloren, wir können uns der Lösung recht gut annähern. Bestimmte Integrale können wir mit numerischen Verfahren lösen, wodurch es zumindest möglich ist ein entsprechendes t anzunähern und mit entsprechenden Näherungsverfahren können wir uns auch verhältnismäßig schnell und gut annähern.&lt;br /&gt;
&lt;br /&gt;
===Numerische Integration===&lt;br /&gt;
Da dieser Teil wohl etwas zu ausschweifend wäre möchte ich hier nur die Grundlegende Idee und eine sehr einfache Methode erwähnen.&lt;br /&gt;
&lt;br /&gt;
Bei numerischen Verfahren wählt man üblicherweise ein paar Punkte der zu integrierenden Funktion aus und berechnet den Flächeninhalt des Kurvenstückes indem man häufig sehr grobe Annäherungen verwendet. Die wohl naivste Methode ist, wenn man sagt:&lt;br /&gt;
 Integral[a bis b]( f(x) ) ~= | (b-a) * f( (b+a)/2 ) |&lt;br /&gt;
Also man berechnet sich den Flächeninhalt des Rechtecks, mit der Breite des entsprechenden Kurvenstückes und einem Punkt der Kurve (in diesem Fall der Punkt in der Mitte des Stückes).&lt;br /&gt;
&lt;br /&gt;
Eine andere sehr bekannte Methode verwendet statt Rechtecken Trapeze und benötigt dafür natürlich bereits 2 Punkte der Kurve:&lt;br /&gt;
 Integral[a bis b]( f(x) ) ~= | (b-a) * ( f(a) + f(b) )/2 |&lt;br /&gt;
&lt;br /&gt;
Da eine solche Annäherung natürlich erfolgversprechender wird, desto kleiner der Abstand zwischen a und b ist, wird man üblicherweise einen größeren Bereich in mehrere (oder sogar sehr viele) kleinere Bereiche unterteilen:&lt;br /&gt;
 Integral[a bis b]( f(x) ) = Integral[a bis k1]( f(x) ) + Integral[k1 bis k2]( f(x) ) + ... + Integral[kn bis b]( f(x) )&lt;br /&gt;
Je kleiner die Teilbereiche werden, umso genauer wird das Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Generell kann man wohl sagen, dass bei komplexeren Integralen ein guter Mittelweg zu finden ist zwischen Genauigkeit und Rechenaufwand, sofwohl was die Anzahl der Teilstücke, als auch die Qualität der Berechnung der Teilstücke betrifft.&lt;br /&gt;
&lt;br /&gt;
===Näherungsverfahren===&lt;br /&gt;
Auch hier gibt es mehrere Varianten, da es sich jedoch um eine monoton wachsende Funktion handelt, sind wohl alle Varianten brauchbar, wenn einige davon aber dennoch endlos um das Ziel herum oszillieren können. Wir besitzen nun eine Methode mit der wir beispielsweise das oben problematische Integral ganz gut annähern können. Wir können also jetzt bestimmten:&lt;br /&gt;
 Im Zeitraum t0 bis t hat die Kurve eine Länge s.&lt;br /&gt;
Wir möchten aber nun für einen Länge s einen Zeitpunkt t (in Abhängigkeit von t0) finden. Dies erreichen wir, indem wir uns möglichst schnell an dieses t annähern. Ein Beispiel dafür ist das Newtonsche Näherungsverfahren. Wiederum soll jedoch nur ein grober Überblick über die Materie gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir einen Zielwert (der Einfachheit halber immer f(x) = 0 ) besitzen, einen aktuellen Wert X1 und f(X1) = k, so wissen wir bei einer monoton steigenden Funktion bereits ob wir nach links oder nach rechts müssen. Ist k größer als 0 so müssen wir nach links. Ist k kleiner 0, so müssen wir nach rechts. Des weiteren können wir uns noch die Steigung der Funktion am Punkt X1 berechnen, wodurch wir auch eine recht gute Ahnung davon bekommen wie weit wir uns bewegen sollen. Dafür nehmen wir an, dass die Steigung annähernd gleich bleibt. Nun berechnen wir uns wie weit wir bei gleich bleibender Steigung gehen müssen und erhalten so unser X2. Diesen Vorgang wiederholen wir so lange bis wir einen genügend genauen Wert besitzen, oder der Wert längere Zeit nicht mehr genauer wird. Die Formel dafür lautet:&lt;br /&gt;
 X(n+1) = Xn - f(Xn) / f'(Xn)&lt;br /&gt;
Und somit haben wir alle Werkzeuge zur Verfügung die wir benötigen, denn nun können wir den 0-Punkt der Funktion&lt;br /&gt;
 Integral[t0 bis t]( f(x) ) - s = 0&lt;br /&gt;
annähern, so dass wir ein t erhalten welches die gesuchte Weglänge gut annähert. Diese t können wir danach in unsere Formel ganz normal einsetzen und somit erhalten wir die Position und bei Bedarf natürlich auch wieder die Tangente oder einen Normalvektor.&lt;br /&gt;
&lt;br /&gt;
===Beispiel===&lt;br /&gt;
Wir verwenden hier wieder eine Kurve im 2D-Raum welches wie unter &amp;quot;Polynome höheren Grades&amp;quot; aus 4 Punkten erstellt wurde. Ohne große Umschweife hier die beiden Formeln:&lt;br /&gt;
 Ix = -31.5*t^3 + 58.5*t^2 - 28*t + 5&lt;br /&gt;
 Iy = 22.5*t^3 - 36*t^2 + 12.5*t + 3&lt;br /&gt;
&lt;br /&gt;
Wir implementieren diese direkt (also hardgecodet) um den Quellcode eher kurz und einfach zu halten (bisher C-Code):&lt;br /&gt;
 /* x Wert der Kurve in Abhängigkeit der Zeit */&lt;br /&gt;
 double func_x( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return 5.0 - 28.0*t + 58.5*t*t - 31.5*t*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* func_x'(t) also func_x abgeleitet. Ein Polynom lässt sich sehr einfach&lt;br /&gt;
  * ableiten, der Einfachheit halber jedoch auch hier direkt angegeben.&lt;br /&gt;
  */&lt;br /&gt;
 double func_dx( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return -28.0 + 117.0*t - 94.5*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* y Wert der Kurve in Abhängigkeit der Zeit */&lt;br /&gt;
 double func_y( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return 3.0 + 12.5*t - 36.0*t*t + 22.5*t*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* func_y'(t) also func_y abgeleitet */&lt;br /&gt;
 double func_dy( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return 12.5 - 72.0*t + 67.5*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* Weg in Abhängigkeit der Zeit abgeleitet. */&lt;br /&gt;
 double func_ds( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return sqrt( func_dx(t)*func_dx(t) + func_dy(t)*func_dy(t) );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Nun der erste etwas interessantere Teil, das numerische integrieren von func_ds:&lt;br /&gt;
 /* Liefert eine Annäherung an das Integral von func mit den Schranken a und b.&lt;br /&gt;
  * Parameter:&lt;br /&gt;
  * a: untere Schranke&lt;br /&gt;
  * b: obere Schranke&lt;br /&gt;
  * sections: Anzahl der verwendeten Trapeze zur Annäherung, je höher desto genauer die Annäherung&lt;br /&gt;
  * Wenn b kleiner als a ist, so wird ein negativer Wert zurück gegeben.&lt;br /&gt;
  */&lt;br /&gt;
 double NIntegrate( double a, double b, int sections )&lt;br /&gt;
 {&lt;br /&gt;
     int d;&lt;br /&gt;
     double sum = 0.0;&lt;br /&gt;
     double pos = a;&lt;br /&gt;
     double pos2 = a + (b-a)/(double)sections;&lt;br /&gt;
     double f = func_ds( pos );&lt;br /&gt;
     double f2;&lt;br /&gt;
     &lt;br /&gt;
     for( d=0; d&amp;lt;sections; d++ )&lt;br /&gt;
     {&lt;br /&gt;
         f2 = func_ds( pos2 );&lt;br /&gt;
     &lt;br /&gt;
         sum += fabs( (f+f2)*0.5*(b-a)/(double)sections );&lt;br /&gt;
     &lt;br /&gt;
         pos = pos2;&lt;br /&gt;
         pos2 += (b-a)/(double)sections;&lt;br /&gt;
     &lt;br /&gt;
         f = f2;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Ist die untere Schranke a größer als die obere Schranke b, so negiere den Wert&lt;br /&gt;
     if( a &amp;gt; b )&lt;br /&gt;
         return -sum;&lt;br /&gt;
     else&lt;br /&gt;
         return sum;&lt;br /&gt;
 }&lt;br /&gt;
Mit dieser Funktion können wir uns nun bereits berechnen wie viel Weg zu einem Zeitpunkt t zurück gelegt wurde. Ein Beispiel hierfür folgt noch weiter unten. Um uns für einen gegebenen Weg s an einen Zeitpunkt t anzunähern an dem wir den Weg zurück gelegt haben, verwenden wir nun ein Näherungsverfahren. Wir wollen die Funktion&lt;br /&gt;
 f(x) = Integral[0 bis t]( func_ds(x) ) - s&lt;br /&gt;
an 0 annähern. Für das Newton-Verfahren benötigen wir noch die Ableitung von f(x):&lt;br /&gt;
 f'(x) = func_ds(x)&lt;br /&gt;
und nun können wir folgende Formel verwenden:&lt;br /&gt;
 Xn+1 = Xn - (Integral[ 0 bis Xn ]( func_ds(x) ) - s) / func_ds(Xn)&lt;br /&gt;
Und genau das machen wir in folgender Funktion:&lt;br /&gt;
 /* Nähert den Wert t für&lt;br /&gt;
  * Integral[0 bis t]( func_ds(x) ) = Value&lt;br /&gt;
  * an.&lt;br /&gt;
  * Parameter:&lt;br /&gt;
  * start: ein möglichst genau geschätzter Wert mit dem die Annäherung begonnen werden soll.&lt;br /&gt;
  * Value: Zielwert nach obiger Formel.&lt;br /&gt;
  * depth: Anzahl der Iterationen (bzw. um genau zu sein der Rekursionen) je höher dieser Wert desto genauer das Ergebnis&lt;br /&gt;
  * sections: Wird an NIntegrate weitergereicht, je höher dieser Wert desto genauer das Ergebnis&lt;br /&gt;
  */&lt;br /&gt;
 double FindValue( double start, double Value, int depth, int sections )&lt;br /&gt;
 {&lt;br /&gt;
 	double newval;&lt;br /&gt;
 	double f = func_ds( start );&lt;br /&gt;
 &lt;br /&gt;
 	if( depth &amp;lt;= 0 )&lt;br /&gt;
 		return start;&lt;br /&gt;
 &lt;br /&gt;
 	// verhindert Division durch 0. Extrem kleine Werte _könnten_ auch problematisch sein.&lt;br /&gt;
 	if( f &amp;lt; 0.0000001 &amp;amp;&amp;amp; f &amp;gt; -0.0000001)&lt;br /&gt;
 	{&lt;br /&gt;
 		if( f &amp;gt;= 0.0f )&lt;br /&gt;
 			newval = start - (NIntegrate( 0.0, start, sections ) - Value);&lt;br /&gt;
 		else&lt;br /&gt;
 			newval = start + (NIntegrate( 0.0, start, sections ) - Value);&lt;br /&gt;
 	}&lt;br /&gt;
 	else&lt;br /&gt;
 	{&lt;br /&gt;
 		// die Unterscheidung ob start &amp;gt; 0 ist wird bereits von NIntegrate durchgeführt&lt;br /&gt;
 		newval = start - (NIntegrate( 0.0, start, sections ) - Value) / f;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	return FindValue( newval, Value, --depth, sections );&lt;br /&gt;
 }&lt;br /&gt;
Nun noch das ein oder andere Beispiel wie wir diese Funktionen verwenden:&lt;br /&gt;
 /* Beispielshafte Verwendung der Funktionen */&lt;br /&gt;
 void main()&lt;br /&gt;
 {&lt;br /&gt;
     double FullKurveLength = NIntegrate( 0.0, 1.0, 100 );&lt;br /&gt;
     double TforS;&lt;br /&gt;
     double KurveLength;&lt;br /&gt;
     &lt;br /&gt;
     printf( &amp;quot;Die gesamte Kurvenlaenge (von Zeitpunkt 0 bis 1) betraegt ziemlich genau: %f\n&amp;quot;, FullKurveLength );&lt;br /&gt;
     &lt;br /&gt;
     printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
     &lt;br /&gt;
     /* Parameter:&lt;br /&gt;
      * a = 0.0: Wir möchten den zurückgelegten Weg angefangen von Zeitpunkt 0.0&lt;br /&gt;
      * b = 0.5: Wir möchten den zurückgelegten Weg bis zum Zeitpunkt 0.5, also von 0.0 bis 0.5&lt;br /&gt;
      * sections = 10: liefert wahrscheinlich ein eher ungenaues Ergebnis.&lt;br /&gt;
      */&lt;br /&gt;
     KurveLength = NIntegrate( 0.0, 0.5, 10 );&lt;br /&gt;
     printf( &amp;quot;Ungeneau: in der haelfte der Zeit wurde %f Weg zurueck gelegt.\n&amp;quot;, KurveLength );&lt;br /&gt;
     &lt;br /&gt;
     KurveLength = NIntegrate( 0.0, 0.5, 20 );&lt;br /&gt;
     printf( &amp;quot;Etwas geneauer: in der haelfte der Zeit wurde %f Weg zurueck gelegt.\n&amp;quot;, KurveLength );&lt;br /&gt;
     &lt;br /&gt;
     KurveLength = NIntegrate( 0.0, 0.5, 100 );&lt;br /&gt;
     printf( &amp;quot;Recht geneau: in der haelfte der Zeit wurde %f Weg zurueck gelegt.\n&amp;quot;, KurveLength );&lt;br /&gt;
     &lt;br /&gt;
     printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
     &lt;br /&gt;
     /* Parameter:&lt;br /&gt;
      * start = 0.5: wir schätzen das der halbe Weg zum Zeitpunkt 0.5 zurück gelegt wurde&lt;br /&gt;
      * Value = FullKurveLength * 0.5: wir möchten wissen zu welchem Zeitpunkt der halbe Weg zurück gelegt wurde&lt;br /&gt;
      * depth &amp;amp; sections = 0: liefert wahrscheinlich ein eher ungenaues Ergebnis.&lt;br /&gt;
      */&lt;br /&gt;
     TforS = FindValue( 0.5, FullKurveLength * 0.5, 5, 10 );&lt;br /&gt;
     printf( &amp;quot;Ungenau: zum Zeitpunkt %f wurde der halbe Weg zurueck gelegt.\n&amp;quot;, TforS );&lt;br /&gt;
     &lt;br /&gt;
     TforS = FindValue( 0.5, FullKurveLength * 0.5, 10, 20 );&lt;br /&gt;
     printf( &amp;quot;Etwas genauer: zum Zeitpunkt %f wurde der halbe Weg zurueck gelegt.\n&amp;quot;, TforS );&lt;br /&gt;
     &lt;br /&gt;
     TforS = FindValue( 0.5, FullKurveLength * 0.5, 50, 100 );&lt;br /&gt;
     printf( &amp;quot;Recht genau: zum Zeitpunkt %f wurde der halbe Weg zurueck gelegt.\n&amp;quot;, TforS );&lt;br /&gt;
 };&lt;br /&gt;
Als ausgabe dieses Tests erhalten wir:&lt;br /&gt;
 Die gesamte Kurvenlaenge (von Zeitpunkt 0 bis 1) betraegt ziemlich genau: 9.201214&lt;br /&gt;
&lt;br /&gt;
 Ungeneau: in der haelfte der Zeit wurde 5.582572 Weg zurueck gelegt.&lt;br /&gt;
 Etwas geneauer: in der haelfte der Zeit wurde 5.558352 Weg zurueck gelegt.&lt;br /&gt;
 Recht geneau: in der haelfte der Zeit wurde 5.550576 Weg zurueck gelegt.&lt;br /&gt;
&lt;br /&gt;
 Ungenau: zum Zeitpunkt 0.376217 wurde der halbe Weg zurueck gelegt.&lt;br /&gt;
 Etwas genauer: zum Zeitpunkt 0.378924 wurde der halbe Weg zurueck gelegt.&lt;br /&gt;
 Recht genau: zum Zeitpunkt 0.379795 wurde der halbe Weg zurueck gelegt.&lt;br /&gt;
Wir können uns nun auch die Zeitpunkte ausrechnen an denen 10%, 20%, ... des Weges zurück gelegt wurde und uns die Punkte auf der Kurve einzeichnen um auch einen visuelleren Vergleich zu erhalten:&lt;br /&gt;
&lt;br /&gt;
[[Bild:KurvenlaengenInterpolation.gif]]&lt;br /&gt;
&lt;br /&gt;
Rot: Die Punkte zu den Zeitpunkten 0.0, 0.1, 0.2, ..., 0.9, 1.0&lt;br /&gt;
&lt;br /&gt;
Blau: Die Punkte zu denen 0%, 10%, 20%, ..., 90%, 100% des Weges zurück gelegt wurde angenähert durch FindValue(...) mit depth = 5 und sections = 10&lt;br /&gt;
&lt;br /&gt;
Grün: Die Punkte zu denen 0%, 10%, 20%, ..., 90%, 100% des Weges zurück gelegt wurde angenähert durch FindValue(...) mit depth = 50 und sections = 100&lt;br /&gt;
&lt;br /&gt;
Gut zu erkennen ist auf diesem Bild auch, dass 10 Unterteilungen für einen das Integrieren von 0 bis 0.1 noch ganz gute Ergebnisse liefert, jedoch bei einem Wertebereich von 0 bis 1 schon ziemlich ungenau wird, somit macht es durchaus Sinn die Anzahl der Unterteilungen auch abhängig von der Größe des Bereiches zu machen.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Interpolation&amp;diff=18220</id>
		<title>Interpolation</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Interpolation&amp;diff=18220"/>
				<updated>2006-06-17T17:07:30Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Kurvenlängen-Interpolation */  C -&amp;gt; Pascal wär wieder mal gefragt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei Interpolationsverfahren geht es darum, aus wenigen Werten beliebig viele Werte zu generieren. Da die gegebenen Werte - wo Interpolation nötig ist - meistens als Stichproben gesehen werden können, werden verschiedenste Verfahren benötigt um auch die nicht gegebenen Werte den Ansprüchen entsprechend zu berechnen. Die Ansprüche variieren hierbei etwas anhand der Geschwindigkeitsanforderungen, des Zahlenraumes und nicht zuletzt anhand der Art und Weise wie man interpolieren möchte.&lt;br /&gt;
&lt;br /&gt;
=Polynom Interpolationen=&lt;br /&gt;
Wenn man N gegebene Werte hat, so kann man diese mit einem Polynom (N-1)ten Grades interpolieren. Eine Polynom Interpolationen besitzen die allgemeine Form:&lt;br /&gt;
 I = (t^n)*Fn + (t^(n-1))*F(n-1) + ... + t*F1 + F0&lt;br /&gt;
Wobei:&lt;br /&gt;
 t ... die Interpolationsposition im Wertebereich [0|1]&lt;br /&gt;
 Fx ... ein konstanter Wert oder Faktor (oder allgemein ein m-Dimensionaler Vektor)&lt;br /&gt;
 I ... das interpolierte Ergebnis, was ebenfalls ein einzelner Wert oder ein Vektor sein kann.&lt;br /&gt;
Durch die Vektor-Schreibweise sollte bereits klar sein, dass Polynom-Interpolationen für jede Dimension extrig berechnet werden, und somit auf beliebig viele Dimensionen erweiterbar sind.&lt;br /&gt;
&lt;br /&gt;
== Lineare Interpolation ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Die einfachste Form einer Polynom-Interpolation ist die lineare Interpolation. Hierbei sind nur 2 Werte gegeben, somit kann man diese Werte mit einem Polynom ersten Grades interpolieren. Dieses ist (wie unschwer zu erraten) eine Gerade der Form:&lt;br /&gt;
 I = t*F1 + F0&lt;br /&gt;
Diese (eher ungewöhnliche) Form der Geradengleichung entspricht der oben angegebenen Polynom-Interpolation in beliebiger Dimension. Die Berechnung der Faktoren Px erfolgt hier für jede Dimension getrennt. Gegeben seien 2 m dimensionale Punkte (A1, A2, ..., A(m-1), Am) und (B1, B2, ..., B(m-1), Bm). Nun lässt sich für jede Dimension d ein einfaches Gleichungssystem aufstellen:&lt;br /&gt;
 Ad = 0*F1d + F0d&lt;br /&gt;
 Bd = 1*F1d + F0d&lt;br /&gt;
da wir mit einem Interpolationswert von 0 den ersten Punkt (A) erhalten wollen und einem Interpolationswert von 1 den zweiten Punkt (B) möchten. Dies umgeformt auf P1d und P0d ergibt:&lt;br /&gt;
 F0d = Ad&lt;br /&gt;
 F1d = Bd - Ad&lt;br /&gt;
Diesen Rechenschritt wiederholen wir für jede Dimension.&lt;br /&gt;
&lt;br /&gt;
=== Rechenbeispiel ===&lt;br /&gt;
Wir wollen 2 Punkte im 3 dimensionalen Raum interpolieren:&lt;br /&gt;
 A: (2|5|0)&lt;br /&gt;
 B: (4|1|8)&lt;br /&gt;
Wir berechnen uns die Vektoren P1 und P0 wie oben angegeben, wobei x die erste und z die dritte Dimension dar stellen soll:&lt;br /&gt;
 F0x = Ax = 2&lt;br /&gt;
 F1x = Bx - Ax = 2&lt;br /&gt;
 F0y = Ay = 5&lt;br /&gt;
 F1y = By - Ay = -4&lt;br /&gt;
 F0z = Az = 0&lt;br /&gt;
 F1z = Bz - Az = 8&lt;br /&gt;
Somit erhalten wir die unsere Interpolationsgleichung:&lt;br /&gt;
 I(x|y|z) = t * (2|-4|8) + (2|5|0)&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationBsp1.png]]&lt;br /&gt;
&lt;br /&gt;
''2 dimensionale Version des obigen Beispieles. Die gegebenen Punkte sind somit A(2|5) und B(4|1). Diese Punkte sind in rot dargestellt. Die Gerade beinhaltet alle Punkte für die gegebene Formel mit t im Wertebereich [0|1]''&lt;br /&gt;
&lt;br /&gt;
== Polynome höheren Grades ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Wie euch vielleicht schon bei der linearen Interpolation aufgefallen ist, ist eine Reihung der Punkte (vorher nur 2) erforderlich. Welcher PUnkt soll das Ergebnis mit t = 0 sein? Und welcher mit t=1? Wenn man mehr als 2 Punkte gegeben hat, so benötigt man zusätzlich noch die Informationen für welches t die beiden neuen Punkte gelten sollen. Meistens interpoliert man hier die Werte für t linear. Das heißt bei N gegebenen Punkten, soll der x-te Punkt für den t-Wert&lt;br /&gt;
 t(Px) = x / (N-1) + 0&lt;br /&gt;
gegeben werden. Wobei:&lt;br /&gt;
 t(Px) ... der t-Wert für den x-ten Punkt&lt;br /&gt;
Das (N-1) der Gleichung wird uns noch länger verfolgen, deshalb werden wir im weiteren Verlauf N-1 als n bezeichnen. Hier noch kurz die Anmerkung, dass man bei einem gegebenen Punkt natürlich keine Parameter benötigt sondern der Punkt immer gleich ist. Man kann sich dies (und alles darauffolgende) auch so vorstellen, dass wir den ersten gegebenen Punkt F0 als 0-Punkt annehmen und erst am &amp;quot;Ende&amp;quot; F0 addieren. Aus dieser Sichtweise heraus bekommen wir unser n = N-1.&lt;br /&gt;
&lt;br /&gt;
Nun lässt sich wiederum das allgemeine (lineare) Gleichungssystem auffstellen:&lt;br /&gt;
 P0 = t(P0)^n * Fn + t(P0)^(n-1) * F(n-1) + ... + t(P0) * F1 + F0&lt;br /&gt;
 P1 = t(P1)^n * Fn + t(P1)^(n-1) * F(n-1) + ... + t(P1) * F1 + F0&lt;br /&gt;
 ...&lt;br /&gt;
 Pn = t(Pn)^n * Fn + t(Pn)^(n-1) * F(n-1) + ... + t(Pn) * F1 + F0&lt;br /&gt;
Wobei:&lt;br /&gt;
 Px ... der x-te Punkt&lt;br /&gt;
 t(Px) ... der t-Wert für den x-ten Punkt&lt;br /&gt;
 Fy ... der zu berechnende Faktor&lt;br /&gt;
Also ein Gleichungssystem mit n unbekannten und n (linear unabhängigen) Gleichungen, welches sich demnach eindeutig lösen lässt. Wobei dieses Gleichungssystem wiederum für jede Dimension extrig aufgestellt und berechnet werden muss! Da man (eindeutig lösbare) Gleichungssystem recht angenehm durch Matrizen-Mathematik lösen kann, empfiehlt sich auch folgende Schreibweise:&lt;br /&gt;
 P = M * F&lt;br /&gt;
Wobei:&lt;br /&gt;
 P ... ein N dimensionaler Vektor der die gegebenen Werte für den jeweiligen Punkt beinhaltet&lt;br /&gt;
 M ... eine NxN Matrix welche die t(Px)^y beinhaltet&lt;br /&gt;
 F ... ein N dimensionaler Vektor der die zu berechnenden Faktoren erhält&lt;br /&gt;
 und N ... wie gehabt die Anzahl der gegebenen Punkte und n = N - 1&lt;br /&gt;
&lt;br /&gt;
Dies kann man nun umformen in:&lt;br /&gt;
 M^-1 * P = F&lt;br /&gt;
Wobei:&lt;br /&gt;
 M^-1 ... die inverse von M ist&lt;br /&gt;
&lt;br /&gt;
Dadurch erhält man alle Werte Fy die man benötigt und kann somit für ein gegebenes t wiederum in die allgemeine Form:&lt;br /&gt;
  I = (t^n)*Fn + (t^(n-1))*F(n-1) + ... + t*F1 + F0&lt;br /&gt;
einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Rechenbeispiel ===&lt;br /&gt;
Wir wollen über 4 Punkte eine Polynominterpolation im 2 dimensionalen Raum. Diese sind:&lt;br /&gt;
 P0: (5|3)&lt;br /&gt;
 P1: (1|4)&lt;br /&gt;
 P2: (4|2)&lt;br /&gt;
 P3: (1|2)&lt;br /&gt;
Wir legen nun zuerst wieder die t-Werte für die Punkte fest, und sagen:&lt;br /&gt;
 P0 bei t=0&lt;br /&gt;
 P1 bei t=1/3&lt;br /&gt;
 P2 bei t=2/3&lt;br /&gt;
 P3 bei t=1&lt;br /&gt;
Und berechnen uns nun die Matrix M mit diesen t-Werten:&lt;br /&gt;
     |   0^3    0^2   0^1 1 |&lt;br /&gt;
 M = | 0.33^3 0.33^2 0.33 1 |&lt;br /&gt;
     | 0.66^3 0.66^2 0.66 1 |&lt;br /&gt;
     |   1^3    1^2   1^1 1 |&lt;br /&gt;
Und berechnen uns nun die inverse M^-1:&lt;br /&gt;
        | -4.5  13.5 -13.5  4.5 |&lt;br /&gt;
 M^-1 = |   9  -22.5   18  -4.5 |&lt;br /&gt;
        | -5.5   9    -4.5   1  |&lt;br /&gt;
        |   1    0      0    0  |&lt;br /&gt;
Nun nehmen wir den P-Vektor der ersten Dimension:&lt;br /&gt;
 Px = (5|1|4|1)&lt;br /&gt;
und multiplizieren ihn mit der Matrix wodurch wir&lt;br /&gt;
 Fx = M^-1 * Px = (-58.5|90|35.5|5)&lt;br /&gt;
erhalten. Nun das selbe für die zweite Dimension:&lt;br /&gt;
 Py = (3|4|2|2)&lt;br /&gt;
und wiederum&lt;br /&gt;
 Fy = M^-1 * Py = (22.5|-36|12.5|3)&lt;br /&gt;
&lt;br /&gt;
Somit ist unsere endgültige Formel für die Interpolation:&lt;br /&gt;
 Ix = -58.5 * t^3 + 90 * t^2 - 35.5 * t + 5&lt;br /&gt;
 Iy = 22.5 * t^3 - 36 * t^2 + 12.5 * t + 3&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationBsp2.png]]&lt;br /&gt;
&lt;br /&gt;
''Oben angegebenes Beispiel grafisch dargestellt. Die Punkte P0 bis P3 sind rot dargestellt. Die Kurve beinhaltet alle Punkte der gegebenen Funktionen für ( Ix , Iy ) mit t im Wertebereich [0|1].''&lt;br /&gt;
&lt;br /&gt;
=Kurven mit gegebenen Tangenten=&lt;br /&gt;
Wir haben die oben gegebene Polynom-Gleichung für N Punkte. Wenn wir nun zusätzlich J Tangenten angeben möchten, so haben wir natürlich J zusätzliche Gleichungen und benötigen ein Polynom (N+K-1)ten Grades. Als erstes stellen wir wiederum eine derartige Polynom-Gleichung auf, jedoch mit dem Unterschied das wir dies gleich mit dem (N+J-1)ten Grad machen. Des weiteren müssen wir für jede Tangente Festlegen bei welchem t^x wir sie einbrigen möchten. Der Einfachheit halber wird hier die Reihung: zuerst die Punkte (also einem t^x mit höherem x) und danach die Tangenten (also einem t^x mit niedrigerem x als die Punkte bis hin zu x=0) verwendet. Daraus ergibt sich die allgemeine Form für die Punkte:&lt;br /&gt;
 P0 = t(P0)^(n+J) * F(n+J) + t(P0)^(n+J-1) * F(n+J) + ... + t(P0)^(J+1) * F(J+1) + t(P0)^J * F(J) + t(P0)^(J-1) * F(J-1) + t(P0)^(J-2) * F(J-2) + ... + t(P0) * F1 + F0&lt;br /&gt;
 P1 = t(P1)^(n+J) * F(n+J) + t(P1)^(n+J-1) * F(n+J) + ... + t(P1)^(J+1) * F(J+1) + t(P1)^J * F(J) + t(P1)^(J-1) * F(J-1) + t(P1)^(J-2) * F(J-2) + ... + t(P1) * F1 + F0&lt;br /&gt;
 ...&lt;br /&gt;
 Pn = t(Pn)^(n+J) * F(n+J) + t(Pn)^(n+J-1) * F(n+J) + ... + t(Pn)^(J+1) * F(J+1) + t(Pn)^J * F(J) + t(Pn)^(J-1) * F(J-1) + t(Pn)^(J-2) * F(J-2) + ... + t(Pn) * F1 + F0&lt;br /&gt;
Wobei:&lt;br /&gt;
 Px ... der x-te Punkt&lt;br /&gt;
 t(Px) ... der t-Wert für den x-ten Punkt&lt;br /&gt;
 F(n+J) bis F(J) ... der zu berechnende Faktor für den (N-1)ten Punkt&lt;br /&gt;
 F(J-1) bis F(0) ... der zu berechnende Faktor für die J-te Tangente&lt;br /&gt;
Nun benötigen wir natürlich noch weitere Gleichungen für die Tangenten um das Gleichungssystem eindeutig lösbar zu machen. Eine Tangente K (hier wird bewusst K und nicht T gewählt) für den Xten Punkt lässt sich durch eine Ableitung nach t berechnen:&lt;br /&gt;
 K(Px) = (n+J) * t(Px)^(n+J-1) * F(n+J) + (n+J-1) * t(Px)^(n+J-2) * F(n+J-1) + ... + (J+1) * t(Px)^(J) * F(J+1) + J * t(Px)^(J-1) * F(J) + (J-1) * t(Px)^(J-2) * F(J-1) + (J-2) * t(Px)^(J-3) * F(J-2) + ... + t(Px) * F2 + F1 + ( 0 * F0 )&lt;br /&gt;
Mit diesen Gleichungssystemen können wir wiederum eine Matrix formen, diese invertieren und los legen. Aber (meines Erachtens) erklärt sich dies am besten an einem Beispiel.&lt;br /&gt;
&lt;br /&gt;
=== Hermite Kurven ===&lt;br /&gt;
Hermite Kurven sind Interpolationsfunktionen wo der Anfangs- und Endpunkt eine bestimmte Tangente aufweist. Üblicherweise werden Hermite Kurven zusätzlich noch auf 2 gegebene Punkte beschränkt, was wir hier der Einfachheit halber beibehalten wollen. Wir haben 2 Punkte, 2 Tangenten wodurch wir auf ein Polynom (N+J-1) = (2+2-1) = 3ten Grades kommen. Alse stellen wir eine Polynomgleichung für 2 gegebene Punkte auf, wobei der erste Punkt den Zeitpunkt 0 und der zweite Punkt den Zeitpunkt 1 erhält. Dadurch kommen wir auf zwei triviale Gleichungen:&lt;br /&gt;
 P0 = 0 * F(3) + 0 * F(2) + 0 * F(1) + 1 * F(0)&lt;br /&gt;
 P1 = 1 * F(3) + 1 * F(2) + 1 * F(1) + 1 * F(0)&lt;br /&gt;
Nun noch die Tangentengleichungen die sich aus der oben angegebenen K(Px) - Formel ergeben:&lt;br /&gt;
 K0 = 0 * F(3) + 0 * F(2) + 1 * F(1) + 0 * F(0)&lt;br /&gt;
 K1 = 3 * F(3) + 2 * F(2) + 1 * F(1) + 0 * F(0)&lt;br /&gt;
Dies ist unser lineares Gleichungssystem woraus wir wiederum unsere Matrix gewinnen:&lt;br /&gt;
     | 0 0 0 1 |&lt;br /&gt;
 M = | 1 1 1 1 |&lt;br /&gt;
     | 0 0 1 0 |&lt;br /&gt;
     | 3 2 1 0 |&lt;br /&gt;
Und natürlich die Formel:&lt;br /&gt;
 W = M * F&lt;br /&gt;
Wobei:&lt;br /&gt;
 W ... ein Vektor ist der die Werte P0, P1, K0, K1 (in dieser Reihenfolge) beinhaltet&lt;br /&gt;
 M ... die oben gegebene Matrix&lt;br /&gt;
 F ... der Vektor der die zu berechnenden Werte beinhaltet.&lt;br /&gt;
Diese Matrix invertiert ergibt:&lt;br /&gt;
        |  2 -2  1  1 |&lt;br /&gt;
 M^-1 = | -3  3 -2 -1 |&lt;br /&gt;
        |  0  0  1  0 |&lt;br /&gt;
        |  1  0  0  0 |&lt;br /&gt;
Somit können wir den F-Vektor berechnen durch&lt;br /&gt;
 M^-1 * W = F&lt;br /&gt;
Wenn wir nun also für W die Werte (2,3,-1,1) hätten, wobei hier&lt;br /&gt;
 2 ... der erste Punkt&lt;br /&gt;
 3 ... der zweite Punkt&lt;br /&gt;
 -1 ... die Tangente für den ersten Punkt&lt;br /&gt;
 1 ... die Tangente für den zweiten Punkt&lt;br /&gt;
so ergeben sich daraus die Faktoren:&lt;br /&gt;
 F = M^-1 * W = (-2,4,-1,2)&lt;br /&gt;
Wodruch wir für unsere Kurve folgende Formel erhalten:&lt;br /&gt;
 f(t) = t^3 * (-2) + t^2 * 4 + t * (-1) + 2&lt;br /&gt;
Da die Dimensionen hier ebenfalls unabhängig sind, können Hermit-Kurven auf beliebig viele Dimensionen erweitert werden.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationBsp3.PNG]]&lt;br /&gt;
&lt;br /&gt;
''Oben angegebenes Beispiel grafisch dargestellt. Die beiden Punkte sind rot dargestellt, die beiden Tangenten sind als blaue Geraden eingezeichnet. Die Kurve beinhaltet alle Punkte der gegebenen Funktionen für t im Wertebereich [0|1].''&lt;br /&gt;
&lt;br /&gt;
=Tangenten von Kurven=&lt;br /&gt;
Besitzt man die Funktion für eine Kurve so lässt sich die Tangente durch das differenzieren dieser Funktion ermitteln. Aus unserem vorigen Beispiel wäre dies:&lt;br /&gt;
 f(t) = t^3 * (-2) + t^2 * 4 + t * (-1) + 2&lt;br /&gt;
 f'(t) = -6 * t^2 + 8 * t - t&lt;br /&gt;
Da die Dimensionen einer derartigen Kurve wie gesagt unabhängig voneinander behandelt werden können, kann man dadurch die Tangente in der entsprechenden Dimension erhalten.&lt;br /&gt;
&lt;br /&gt;
= Interpolation mit anderen Funktionen =&lt;br /&gt;
Bisher wurden nur Interpolationen gezeigt, bei denen der t-Wert potenziert wurde. Es wurde immer ein Anfangspunkt verwendet, für den der t-Wert 0 sein sollte, und ein Endpunkt für den der t-Wert 1 sein sollte. Wir können natürlich jede beliebige Funktion für die Interpolation verwenden wo dies zutrifft. Wenn wir möchten können wir natürlich auch eine Funktion verwenden wo der Anfangspunkt bei t=X und der Endpunkt bei t=Y zu finden ist, denn eine derartige Funktion können wir wiederum umformen zu einer Funktion für die wir einen Anfangspunkt mit t=0 und einen Endpunkt mit t=1 haben.&lt;br /&gt;
&lt;br /&gt;
Andere Funktionen werden meistens (nicht immer) bei nur 2 gegebenen Punkten verwendet. Hier wird meistens aus einem t-Wert im Bereich [0|1] ein neuer Wert u im Bereich [1|0] berechnet, welcher danach ähnlich wie bei der linearen Interpolation verwendet wird. Also:&lt;br /&gt;
 u = f(t)&lt;br /&gt;
 Interpolierter_Wert = I(t) = u * Startwert + (1-u) * Endwert&lt;br /&gt;
Wobei:&lt;br /&gt;
 f(t) ... die Interpolationsfunktion, welche bei t=0 1 zurück liefert und bei t=1 0 ist.&lt;br /&gt;
 Interpolierter_Wert ... das Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Mögliche andere Funktionen sind nun beispielsweise:&lt;br /&gt;
&lt;br /&gt;
== Cosinus ähnliche Interpolation ==&lt;br /&gt;
&lt;br /&gt;
===Cosinus Interpolation===&lt;br /&gt;
Der Cosinus liefert Werte zwischen -1 und 1. Wir wollen einen eindeutigen y-Wert für y=Cos(t), somit verwenden wir nur t-Werte im Wertebereich von 0 bis 180 Grad (bzw. 0 bis Pi Radianten), denn bei t=181 Grad würden wir ja den selben Wert erhalten wie für t=179 Grad.&lt;br /&gt;
&lt;br /&gt;
Der t-Wert wird für den Cosinus im Wertebereich [0|Pi] bzw. [0|180Grad] benötigt. Um nun einen t-Wert (wie zuvor) im Wertebereicheich von [0|1] verwenden zu können, multiplizieren wir ihn einfach mit Pi. Also verwenden wir einfach&lt;br /&gt;
 t2 = t * Pi&lt;br /&gt;
bzw. das Ganze mit Grad:&lt;br /&gt;
 t2 = t * 180&lt;br /&gt;
&lt;br /&gt;
Der Ausgabewert von Cosinus ist im Wertebereich [1|-1]. Um ihn auf den Wertebereich [1|0] zu bringen, müssen wir ihn transformieren. Dafür formen wir um:&lt;br /&gt;
 f(t2) = Cos(t2)&lt;br /&gt;
 g(t2) = f(t2)/2 + 1/2 = ( 1 + f(t2) ) / 2 = ( 1 + Cos(t2) ) / 2&lt;br /&gt;
Und nun noch t2 durch t ersetzt:&lt;br /&gt;
 g(t) = ( 1 + Cos(t*Pi) ) / 2&lt;br /&gt;
bzw. das Ganze mit Grad:&lt;br /&gt;
 g(t) = ( 1 + Cos(t*180) ) / 2&lt;br /&gt;
&lt;br /&gt;
Wir haben nun eine Formel die uns bei t=0 einen Wert von 1 liefert und bei t=1 einen Wert von 0. Dies können wir in unsere allgemeine Funktion einsetzen:&lt;br /&gt;
 Interpolierter_Wert = I(t) = g(t) * Startwert + ( 1 - g(t) ) * Endwert&lt;br /&gt;
Und für g(t) eingesetzt:&lt;br /&gt;
 Interpolierter_Wert = I(t) = ( (1+Cos(t*Pi))/2 ) * Startwert + ( 1 - (1+Cos(t*Pi))/2 ) * Endwert&lt;br /&gt;
bzw. das Ganze mit Grad:&lt;br /&gt;
 Interpolierter_Wert = I(t) = ( (1+Cos(t*180))/2 ) * Startwert + ( 1 - (1+Cos(t*180))/2 ) * Endwert&lt;br /&gt;
&lt;br /&gt;
Nun die Frage warum der ganze Aufwand, also warum nicht linear interpolieren? Um dies zu beantworten müssen wir die Steigungen dieser Funktion betrachten, wofür wir die Ableitung der Funktion berechnen:&lt;br /&gt;
 I'(t) = 1/2 * Endwert * Pi * Sin( t * Pi ) - 1/2 * Startwert * Pi * Sin( t * Pi )&lt;br /&gt;
Sieht kompliziert aus, aber wenn wir nun t=0 annehmen so erhalten wir für Sin( t * Pi ) ebenfalls 0. Wenn wir für t=1 annehmen so erhalten wir für Sin( t * Pi ) wiederum 0. Und dadurch erhalten wir an beiden Enden eine Steigung von 0.&lt;br /&gt;
&lt;br /&gt;
Was können wir machen mit einer Funktion die an beiden Enden eine Steigung von 0 aufweist? Ganz einfach: wir können mehrere dieser Funktionen aneinander reihen, ohne das man einen übergang erkennt. Somit können wir sagen:&lt;br /&gt;
 Bei t im Bereich [0|1] verwende als Startwert 3 und als Endwert 1&lt;br /&gt;
 Bei t im Bereich ]1|2] verwende als Startwert 1 und als Endwert 7&lt;br /&gt;
 Bei t im Bereich ]2|3] verwende als Startwert 7 und als Endwert 8&lt;br /&gt;
Und wenn wir alle 3 Funktionen mit dem Wertebereich [0|1] verwenden (oder mathematisch ausgedrückt: I2(t) = I(t modulo 1) ), so erhalten wir eine Kurve ohne Kanten, oder um es etwas mathematischer auszudrücken: diese Funktion ist im Wertebereich ]0|3[ ableitbar, also in diesem Wertebereich auch stetig.&lt;br /&gt;
&lt;br /&gt;
Und um die Ästhetik hinter diesen Formeln zu zeigen, ein Vergleich von linearer- zu cosinus-Interpolation:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Interpolation.png]]&lt;br /&gt;
&lt;br /&gt;
=== Quadratische Annäherung der Cosinus Interpolation ===&lt;br /&gt;
Da die Berechnung des Cosinus eine etwas aufwändigere Angelegenheit ist, wünscht man sich hin und wieder eine Funktion die ähnlich aussieht und die gleichen Bedingungen (also eine Steigung von 0 an Start- und Endpunkt) erfüllt. Hierfür kann man 2 quadratische Funktionen verwenden die folgendes erfüllen müssen:&lt;br /&gt;
#Beide Kurven müssen einen gemeinsamen Punkt besitzen, also I1(t) = I2(t) für t im Wertebereich [0|1]&lt;br /&gt;
#An diesem Punkt müssen beide Kurven die selbe Steigung besitzen, also es existiert ein ( I1(X) = I2(X) wo auch gilt I1'(X) = I2'(X) ).&lt;br /&gt;
#Steigung (also Ableitung) bei t=0 und t=1 soll 0 sein&lt;br /&gt;
#Die Kurve sollte symmetrisch sein bezogen auf t=0.5, so das gilt: I1(t) = 1-I2(1-t). Somit muss gleichzeitig der Punkt wo gilt I1(t) = I2(t) bei 0.5 liegen.&lt;br /&gt;
&lt;br /&gt;
Wir können uns nun aus der ersten und dritten Bedinung einfach die beiden Formeln herleiten, aber um es kurz zu machen:&lt;br /&gt;
 Wenn t &amp;lt;= 0.5 dann I1(t) = -2*t^2 + 1&lt;br /&gt;
 Wenn t &amp;gt; 0.5 dann I2(t) = 2*t^2 - 4*t + 2 = 2 * (1-t)^2&lt;br /&gt;
Nun zeigen wir, dass die oben angegebenen Bedingungen erfüllt sind:&lt;br /&gt;
#I1(0.5) = -2*0.5^2 + 1 = 0.5; I2(0.5) = 2 * (1-0.5)^2) = 0.5&lt;br /&gt;
#I1'(t) = -4t, I1'(0.5) = -2; I2'(t) = 4*t - 4, I2'(0.5) = -2&lt;br /&gt;
#I1'(0) = -4*0 = 0; I2'(1) = 4*1 - 4) = 0&lt;br /&gt;
#I1(t) = 1-I2(1-t) '''=&amp;gt;''' -2*t^2 + 1 = 1 - (2*(1-t)^2 - 4*(1-t) + 2) '''=&amp;gt;''' -2*t^2 + 1 = 1 - (2 - 4*t + 2*t^2 - 4 + 4*t + 2) '''=&amp;gt;''' -2*t^2 + 1 = -2*t^2 + 1&lt;br /&gt;
&lt;br /&gt;
=== Cosinus ähnliche Interpolation durch Polynominterpolation ===&lt;br /&gt;
Wenn wir eine Polynominterpolation mit den beiden Endtangenten 0 berechnen wollen, so verwenden wir eine Hermite Kurve. Hierbei verwenden wir die Werte:&lt;br /&gt;
 1 ... Startpunkt&lt;br /&gt;
 0 ... Endpunkt&lt;br /&gt;
 0 ... Steigung bei Startpunkt&lt;br /&gt;
 0 ... Steigung bei Endpunkt&lt;br /&gt;
Mit der unter Hermit Kurven angegebenen Matrix M^-1 können wir uns nun die dazugehörige Funktion berechnen und erhalten:&lt;br /&gt;
 I(t) = 2*t^3 - 3*t^2 + 1&lt;br /&gt;
Die ersten beiden Bedingungen von vorher sind automatisch erfüllt, da es sich nur um eine Funktion handelt. Für die 3. und 4. Bedingung lässt sich ebenfalls verhältnismäßig einfach zeigen das sie erfüllt sind.&lt;br /&gt;
&lt;br /&gt;
=== Vergleich der Cosinus ähnlichen Interpolationsarten ===&lt;br /&gt;
Und zu guter letzt hier noch die grafische Veranschaulichung der etwas zahlenbeladenen Funktionen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:InterpolationCosAnnaeherung.png]]&lt;br /&gt;
&lt;br /&gt;
''Die 3 Cosinus ähnlichen Funktionen graphisch dargestellt:&lt;br /&gt;
*Grün: Cos-Interpolation&lt;br /&gt;
*Rot: Polynom-Interpolation&lt;br /&gt;
*Blau: Quadratische Annäherung''&lt;br /&gt;
&lt;br /&gt;
=Interpolierte Flächen=&lt;br /&gt;
Bisher wurden ausschließlich Kurven betrachtet. Aus Kurven lassen sich jedoch ohne größere Umstände auch Flächen bilden. Hier hat man zwei (unterschiedliche) t-Werte und eine Matrix von Punkten gegeben, wobei jeder Punkt gegebenenfalls noch 1 oder 2 Tangenten besitzen kann. Um einen Punkt einer Fläche zu berechnen interpoliert man zuerst die Punkte für jede Zeile der Punktmatrix. Nachdem man nun die interpolierten Punkte für jede Zeile besitzt kann man sich mit diesen Punkten ein neues Gleichungssystem aufstellen und wiederum eine Kurve bilden. Diese Kurve interpoliert man wiederum mit dem zweiten gegebenen t-Wert. Dies lässt sich auf beliebig viele Dimensionen nach dem gleichen Schema erweitern, üblicherweise wird dies jedoch nur für Oberflächen (also 2D) benötigt.&lt;br /&gt;
&lt;br /&gt;
==Normalvektoren==&lt;br /&gt;
Besitzt man Flächen und berechnet sie nach dem gegebenen Schema, so berechnet man sich zuerst auch mehrere Kurven von denen man die Tangenten berechnen kann. Interpoliert man nun diese Tangenten mit der gleichen Kurvenfunktion wie die resultierenden Punkte, und berechnet sich aus der resultierenden Kurvenfunktion ebenfalls die Tangente, so erhält man 2 Tangenten. Aus diesen beiden Tangenten kann nun mit einem Kreuzprodukt ein Normalvektor errechnet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
'''ACHTUNG: auf Richtigkeit überprüfen'''&lt;br /&gt;
&lt;br /&gt;
=Kurvenlängen-Interpolation=&lt;br /&gt;
Es könnte erwünscht sein (beispielsweise für Kamerafahrten, Keyframe Interpolationen jeglicher Art oder auch bei der Interpolation von Positionsangaben die man beispielsweise über ein Netzwerk erhält), dass man über keine fixe Achse t interpolieren möchte, sondern über die Kurvenlänge.&lt;br /&gt;
&lt;br /&gt;
Bei den typischen physikalischen Beispielen besitzt man meist eine Geschwindigkeit welche durch Beschleunigung verändert wird. Also wenn man einen Ball senkrecht hoch wirft, so gibt es einen Punkt an dem er komplett stehen bleibt. Für diese Art von physikalischen Berechnungen wird man also kaum eine Kurvenlängen-Interpolation benötigen.&lt;br /&gt;
&lt;br /&gt;
Wenn man jedoch sehr langsame Geschwindigkeiten besitzt, also beispielsweise zu fuß geht, so haben wir eine nahezu konstante Gehgeschwindigkeit, egal ob wir eine Kurve gehen oder nicht. Wenn wir noch weiter gehen und auf einer Straße oder einer Rennstrecke alle 100 Meter ein Längenangabenschild hin stellen möchten, so ist uns Beschleunigung und auch die Geschwindigkeit vollkommen egal. Wir hätten also am liebsten eine Funktion P(s), welche uns den Punkt der Kurve für für Kilometer (oder Meter) s liefert.&lt;br /&gt;
&lt;br /&gt;
==Der eindimensionale Fall==&lt;br /&gt;
Dieser Teil soll lediglich als Erklärung dienen, besitzt in der Praxis aber kaum Relevanz.&lt;br /&gt;
&lt;br /&gt;
Im Eindimensionalen Fall kann man sich dies noch sehr gut veranschaulichen. Wenn ich eine gerade Strecke besitze und meine 1D-Koordinaten kenne, so kann ich ganz einfach sagen: zum Zeitpunkt t bin ich Betrag( f(t) - f(t0) ) Meter (allg. Einheiten) gegangen. Interessant wir es noch mal wenn ich die Richtung ändere, also wenn ich bei Kilometer 4 merke das ich etwas zu Hause vergessen habe, noch einmal umdrehe und dann weiter fahre. In diesem Fall kann ich nicht sagen: ich befinde mich an Position 10 Kilometer entfernt =&amp;gt; ich bin 10 Kilometer gegangen, sondern in Wirklichkeit habe ich noch zusätzlich 8 Kilometer umweg hinter mir.&lt;br /&gt;
&lt;br /&gt;
Dieses simple beispiel mathematisch ausgedrückt:&lt;br /&gt;
&lt;br /&gt;
 wenn f(t) monoton steigend oder monoton fallend ist: Kurvenlänge(t) = | f(t) - f(t0) | &lt;br /&gt;
 Sonnst: Kurvenlänge = Integral[t0 bis t]( f'(t) )&lt;br /&gt;
Beim Integrieren müssen wir nun aufpassen, ob unsere Stammfunktion 0-Stellen besitzt. Bei jeder solchen 0-Stelle Zx zerteilen wir die Wertebereiche:&lt;br /&gt;
 W = [t0, Z1, Z2, Z3, ..., Zn, t]&lt;br /&gt;
&lt;br /&gt;
 Kurvenlänge(t) = Summe[ n=1 bis Elemente von W ]( Integral[W[n-1] bis W[n]]( f'(t) )&lt;br /&gt;
Da wir nun in der Stammfunktion alle 0-Stellen berücksichtigt haben können wir das Integral &amp;quot;kürzen&amp;quot;, also&lt;br /&gt;
 Kurvenlänge(t) = Summe[ n=1 bis Elemente von W ]( | f(w[n]) - f(w[n-1]) | )&lt;br /&gt;
&lt;br /&gt;
Das Integral macht hier also nichts anderes als Richtungswechsel zu erkennen, denn bei einem Richtungswechsel in 1D ändert sich das Vorzeichen der Ableitung einer Funktion, und für jeden Vorzeichenwechsel muss es auch einen 0-Punkt geben wenn es sich um eine stetige Funktion handelt.&lt;br /&gt;
&lt;br /&gt;
Wir kennen nun also den Weg den wir zu einem bestimmten Zeitpunkt zurückgelegt haben. Wir wollen jedoch den Zeitpunkt wissen an dem wir eine bestimmte Weglänge zurückgelegt haben, um die Funktion f(t) durch f(t(s)) = g(s) wodurch g(s) eine Funktion ist wo wir die Position für einen bestimmte Kurvenlänge erhalten.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also ein t finden für das gilt&lt;br /&gt;
 Kurvenlänge(t) = s&lt;br /&gt;
und können danach dieses t in unsere Ursprüngliche Kurvengleichung einsetzen.&lt;br /&gt;
&lt;br /&gt;
Und nun mit voller Wucht: warum bringt uns das alles ganz und gar nichts?&lt;br /&gt;
Wenn wir eine Eindimensionale &amp;quot;Kurve&amp;quot; besitzen und wir wollen diese über die Kurvenlänge parametrisieren, so sagen wir schlicht und ergreifend:&lt;br /&gt;
 x = x0 +/- s&lt;br /&gt;
wenn wir nicht mehrere Fälle besitzen. Wenn wir Fallunterscheidungen bekommen, so gibt es (wie im mehrdimensionalen Fall noch verdeutlicht wird) natürlich auch Methoden mit denen wir diese Fallunterscheidungen umgehen können (namentlich: numerische Integration). Dennoch ist die Funktion wohl in nahezu allen Fällen einfacher mit derartigen Fallunterscheidungen zu berechnen.&lt;br /&gt;
&lt;br /&gt;
===Beispiel===&lt;br /&gt;
Ein Beispiel noch am Rande, wie man unschwer erahnen kann, gibt es eher wenig alltäglichere Beispiele die nicht zu trivial und von Interesse wären:&lt;br /&gt;
&lt;br /&gt;
Wir besitzen eine gedämpfte Schwingung mit der Formel&lt;br /&gt;
 f(t) = e^(-t) * sin(t)&lt;br /&gt;
und möchten aus unerfindlichen Gründen wissen wo sich der schwingende Körper befindet wenn er den Weg s zurückgelegt hat.&lt;br /&gt;
&lt;br /&gt;
Wir berechnen uns die Ableitung&lt;br /&gt;
 f'(t) = e^(-t) * cos(t) - e^(-t) * sin(t)&lt;br /&gt;
und nun die 0-Stellen, also&lt;br /&gt;
 f'(t) = 0&lt;br /&gt;
davon gibt es aber natürlich jede Menge ... aber wir begnügen und mit den ersten 3:&lt;br /&gt;
 f'(PI/4) = 0   | f(PI/4) ~= 0.322&lt;br /&gt;
 f'(~3.927) = 0 | f(3.927) ~= -0.014&lt;br /&gt;
 f'(~7.069) = 0 | f(7.069) ~= 0.0006&lt;br /&gt;
Da der Startpunkt (t=0) natürlich auch bei 0 liegt, erhalten wir also jetzt für unsere Position in Abhängigkeit der Weglänge s:&lt;br /&gt;
 g(s) = s für s im Bereich [0,0.322]&lt;br /&gt;
 g(s) = 2*0.322-s für s im Bereich ]0.322|0.658] wobei 0.658 = 0.322 + | 0.322-0.014 |&lt;br /&gt;
 g(s) = s-2*0.322-2*0.014 für s im Bereich ]0.658|0.6585] wobei 0.6586 = 0.322 + | 0.322 - (-0.014) | + | -0.014 - 0.0006 |&lt;br /&gt;
 &lt;br /&gt;
==Kurven in höheren Dimensionen==&lt;br /&gt;
Im allgemeinen Fall kann eine Kurve in einer bestimmten Dimension als Vektor von Funktionen dargestellt werden:&lt;br /&gt;
        | x(t) |&lt;br /&gt;
 P(t) = | y(t) |&lt;br /&gt;
        | z(t) |&lt;br /&gt;
        | ...  |&lt;br /&gt;
wir können die Tangente berechnen indem wir in jeder Dimensionen die Funktion ableiten:&lt;br /&gt;
        | x'(t) |&lt;br /&gt;
 T(t) = | y'(t) |&lt;br /&gt;
        | z'(t) |&lt;br /&gt;
        | ...   |&lt;br /&gt;
und natürlich handelt es sich nun nicht um irgendeine Tangente, sondern um die Tangente welche auch die Änderungsgeschwindigkeit der Kurve abhängig von t beschreibt. Wir können die Länge dieser Tangente also als Geschwindigkeit der Kurve betrachten. Die Länge eines Vektors ist ein skalarer Wert, also erhalten wir für die Geschwindigkeit zu einem Zeitpunkt t die Funktion:&lt;br /&gt;
 Geschwindigkeit(t) = | T(t) |&lt;br /&gt;
Der Betrag der Tangente wir nun folgendermaßen gebildet:&lt;br /&gt;
 Geschwindigkeit(t) = Wurzel( x'(t)^2 + y'(t)^2 + z'(t)^2 + ... )&lt;br /&gt;
Nun besitzen wir eine Funktion für die Geschwindigkeit der Kurve welche uns integriert die Länge der Kurve bis zum Zeitpunkt t angibt. Im Gegensatz zum eindimensionalen Fall (wo dies eher wenig Sinn hatte) quadrieren wir hier jeden verwendeten Wert, wodurch diese Funktion niemals &amp;lt; 0 werden kann, somit müssen wir beim integrieren auch nicht auf 0-Stellen aufpassen.&lt;br /&gt;
&lt;br /&gt;
Wir Integrieren nun:&lt;br /&gt;
 Kurvenlänge(t) = Integral[t0 bis t]( Geschwindigkeit(t) )&lt;br /&gt;
&lt;br /&gt;
Und hier stoßen wir an einen unangenehmen Punkt. Nehmen wir ein &amp;quot;einfaches&amp;quot; Polynom für x(t), y(t) und z(t). An einem Integral wie aus unserem Polynom-Beispiel:&lt;br /&gt;
 Integral[t0 bis t]( Wurzel( (-58.5*t^3 + 90*t^2 - 35.5*t + 5)^2 + (22.5*t^3 - 36*t^2 + 12.5*t + 3)^2 ) )&lt;br /&gt;
scheitern sogar gute Mathematik-Bibliotheken, und von normalsterblichen Menschen ganz zu schweigen.&lt;br /&gt;
&lt;br /&gt;
Doch noch ist nicht alles Verloren, wir können uns der Lösung recht gut annähern. Bestimmte Integrale können wir mit numerischen Verfahren lösen, wodurch es zumindest möglich ist ein entsprechendes t anzunähern und mit entsprechenden Näherungsverfahren können wir uns auch verhältnismäßig schnell und gut annähern.&lt;br /&gt;
&lt;br /&gt;
===Numerische Integration===&lt;br /&gt;
Da dieser Teil wohl etwas zu ausschweifend wäre möchte ich hier nur die Grundlegende Idee und eine sehr einfache Methode erwähnen.&lt;br /&gt;
&lt;br /&gt;
Bei numerischen Verfahren wählt man üblicherweise ein paar Punkte der zu integrierenden Funktion aus und berechnet den Flächeninhalt des Kurvenstückes indem man häufig sehr grobe Annäherungen verwendet. Die wohl naivste Methode ist, wenn man sagt:&lt;br /&gt;
 Integral[a bis b]( f(x) ) ~= | (b-a) * f( (b+a)/2 ) |&lt;br /&gt;
Also man berechnet sich den Flächeninhalt des Rechtecks, mit der Breite des entsprechenden Kurvenstückes und einem Punkt der Kurve (in diesem Fall der Punkt in der Mitte des Stückes).&lt;br /&gt;
&lt;br /&gt;
Eine andere sehr bekannte Methode verwendet statt Rechtecken Trapeze und benötigt dafür natürlich bereits 2 Punkte der Kurve:&lt;br /&gt;
 Integral[a bis b]( f(x) ) ~= | (b-a) * ( f(a) + f(b) )/2 |&lt;br /&gt;
&lt;br /&gt;
Da eine solche Annäherung natürlich erfolgversprechender wird, desto kleiner der Abstand zwischen a und b ist, wird man üblicherweise einen größeren Bereich in mehrere (oder sogar sehr viele) kleinere Bereiche unterteilen:&lt;br /&gt;
 Integral[a bis b]( f(x) ) = Integral[a bis k1]( f(x) ) + Integral[k1 bis k2]( f(x) ) + ... + Integral[kn bis b]( f(x) )&lt;br /&gt;
Je kleiner die Teilbereiche werden, umso genauer wird das Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Generell kann man wohl sagen, dass bei komplexeren Integralen ein guter Mittelweg zu finden ist zwischen Genauigkeit und Rechenaufwand, sofwohl was die Anzahl der Teilstücke, als auch die Qualität der Berechnung der Teilstücke betrifft.&lt;br /&gt;
&lt;br /&gt;
===Näherungsverfahren===&lt;br /&gt;
Auch hier gibt es mehrere Varianten, da es sich jedoch um eine monoton wachsende Funktion handelt, sind wohl alle Varianten brauchbar, wenn einige davon aber dennoch endlos um das Ziel herum oszillieren können. Wir besitzen nun eine Methode mit der wir beispielsweise das oben problematische Integral ganz gut annähern können. Wir können also jetzt bestimmten:&lt;br /&gt;
 Im Zeitraum t0 bis t hat die Kurve eine Länge s.&lt;br /&gt;
Wir möchten aber nun für einen Länge s einen Zeitpunkt t (in Abhängigkeit von t0) finden. Dies erreichen wir, indem wir uns möglichst schnell an dieses t annähern. Ein Beispiel dafür ist das Newtonsche Näherungsverfahren. Wiederum soll jedoch nur ein grober Überblick über die Materie gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir einen Zielwert (der Einfachheit halber immer f(x) = 0 ) besitzen, einen aktuellen Wert X1 und f(X1) = k, so wissen wir bei einer monoton steigenden Funktion bereits ob wir nach links oder nach rechts müssen. Ist k größer als 0 so müssen wir nach links. Ist k kleiner 0, so müssen wir nach rechts. Des weiteren können wir uns noch die Steigung der Funktion am Punkt X1 berechnen, wodurch wir auch eine recht gute Ahnung davon bekommen wie weit wir uns bewegen sollen. Dafür nehmen wir an, dass die Steigung annähernd gleich bleibt. Nun berechnen wir uns wie weit wir bei gleich bleibender Steigung gehen müssen und erhalten so unser X2. Diesen Vorgang wiederholen wir so lange bis wir einen genügend genauen Wert besitzen, oder der Wert längere Zeit nicht mehr genauer wird. Die Formel dafür lautet:&lt;br /&gt;
 X(n+1) = Xn - f(Xn) / f'(Xn)&lt;br /&gt;
Und somit haben wir alle Werkzeuge zur Verfügung die wir benötigen, denn nun können wir den 0-Punkt der Funktion&lt;br /&gt;
 Integral[t0 bis t]( f(x) ) - s = 0&lt;br /&gt;
annähern, so dass wir ein t erhalten welches die gesuchte Weglänge gut annähert. Diese t können wir danach in unsere Formel ganz normal einsetzen und somit erhalten wir die Position und bei Bedarf natürlich auch wieder die Tangente oder einen Normalvektor.&lt;br /&gt;
&lt;br /&gt;
===Beispiel===&lt;br /&gt;
Wir verwenden hier wieder eine Kurve im 2D-Raum welches wie unter &amp;quot;Polynome höheren Grades&amp;quot; aus 4 Punkten erstellt wurde. Ohne große Umschweife hier die beiden Formeln:&lt;br /&gt;
 Ix = -31.5*t^3 + 58.5*t^2 - 28*t + 5&lt;br /&gt;
 Iy = 22.5*t^3 - 36*t^2 + 12.5*t + 3&lt;br /&gt;
&lt;br /&gt;
Wir implementieren diese direkt (also hardgecodet) um den Quellcode eher kurz und einfach zu halten (bisher C-Code):&lt;br /&gt;
 /* x Wert der Kurve in Abhängigkeit der Zeit */&lt;br /&gt;
 double func_x( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return 5.0 - 28.0*t + 58.5*t*t - 31.5*t*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* func_x'(t) also func_x abgeleitet. Ein Polynom lässt sich sehr einfach&lt;br /&gt;
  * ableiten, der Einfachheit halber jedoch auch hier direkt angegeben.&lt;br /&gt;
  */&lt;br /&gt;
 double func_dx( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return -28.0 + 117.0*t - 94.5*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* y Wert der Kurve in Abhängigkeit der Zeit */&lt;br /&gt;
 double func_y( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return 3.0 + 12.5*t - 36.0*t*t + 22.5*t*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* func_y'(t) also func_y abgeleitet */&lt;br /&gt;
 double func_dy( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return 12.5 - 72.0*t + 67.5*t*t;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /* Weg in Abhängigkeit der Zeit abgeleitet. */&lt;br /&gt;
 double func_ds( double t )&lt;br /&gt;
 {&lt;br /&gt;
     return sqrt( func_dx(t)*func_dx(t) + func_dy(t)*func_dy(t) );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Nun der erste etwas interessantere Teil, das numerische integrieren von func_ds:&lt;br /&gt;
 /* Liefert eine Annäherung an das Integral von func mit den Schranken a und b.&lt;br /&gt;
  * Parameter:&lt;br /&gt;
  * a: untere Schranke&lt;br /&gt;
  * b: obere Schranke&lt;br /&gt;
  * sections: Anzahl der verwendeten Trapeze zur Annäherung, je höher desto genauer die Annäherung&lt;br /&gt;
  * Wenn b kleiner als a ist, so wird ein negativer Wert zurück gegeben.&lt;br /&gt;
  */&lt;br /&gt;
 double NIntegrate( double a, double b, int sections )&lt;br /&gt;
 {&lt;br /&gt;
     int d;&lt;br /&gt;
     double sum = 0.0;&lt;br /&gt;
     double pos = a;&lt;br /&gt;
     double pos2 = a + (b-a)/(double)sections;&lt;br /&gt;
     double f = func_ds( pos );&lt;br /&gt;
     double f2;&lt;br /&gt;
     &lt;br /&gt;
     for( d=0; d&amp;lt;sections; d++ )&lt;br /&gt;
     {&lt;br /&gt;
         f2 = func_ds( pos2 );&lt;br /&gt;
     &lt;br /&gt;
         sum += fabs( (f+f2)*0.5*(b-a)/(double)sections );&lt;br /&gt;
     &lt;br /&gt;
         pos = pos2;&lt;br /&gt;
         pos2 += (b-a)/(double)sections;&lt;br /&gt;
     &lt;br /&gt;
         f = f2;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Ist die untere Schranke a größer als die obere Schranke b, so negiere den Wert&lt;br /&gt;
     if( a &amp;gt; b )&lt;br /&gt;
         return -sum;&lt;br /&gt;
     else&lt;br /&gt;
         return sum;&lt;br /&gt;
 }&lt;br /&gt;
Mit dieser Funktion können wir uns nun bereits berechnen wie viel Weg zu einem Zeitpunkt t zurück gelegt wurde. Ein Beispiel hierfür folgt noch weiter unten. Um uns für einen gegebenen Weg s an einen Zeitpunkt t anzunähern an dem wir den Weg zurück gelegt haben, verwenden wir nun ein Näherungsverfahren. Wir wollen die Funktion&lt;br /&gt;
 f(x) = Integral[0 bis t]( func_ds(x) ) - s&lt;br /&gt;
an 0 annähern. Für das Newton-Verfahren benötigen wir noch die Ableitung von f(x):&lt;br /&gt;
 f'(x) = func_ds(x)&lt;br /&gt;
und nun können wir folgende Formel verwenden:&lt;br /&gt;
 Xn+1 = Xn - (Integral[ 0 bis Xn ]( func_ds(x) ) - s) / func_ds(Xn)&lt;br /&gt;
Und genau das machen wir in folgender Funktion:&lt;br /&gt;
 /* Nähert den Wert t für&lt;br /&gt;
  * Integral[0 bis t]( func_ds(x) ) = Value&lt;br /&gt;
  * an.&lt;br /&gt;
  * Parameter:&lt;br /&gt;
  * start: ein möglichst genau geschätzter Wert mit dem die Annäherung begonnen werden soll.&lt;br /&gt;
  * Value: Zielwert nach obiger Formel.&lt;br /&gt;
  * depth: Anzahl der Iterationen (bzw. um genau zu sein der Rekursionen) je höher dieser Wert desto genauer das Ergebnis&lt;br /&gt;
  * sections: Wird an NIntegrate weitergereicht, je höher dieser Wert desto genauer das Ergebnis&lt;br /&gt;
  */&lt;br /&gt;
 double FindValue( double start, double Value, int depth, int sections )&lt;br /&gt;
 {&lt;br /&gt;
 	double newval;&lt;br /&gt;
 	double f = func_ds( start );&lt;br /&gt;
 &lt;br /&gt;
 	if( depth &amp;lt;= 0 )&lt;br /&gt;
 		return start;&lt;br /&gt;
 &lt;br /&gt;
 	// verhindert Division durch 0. Extrem kleine Werte _könnten_ auch problematisch sein.&lt;br /&gt;
 	if( f &amp;lt; 0.0000001 &amp;amp;&amp;amp; f &amp;gt; -0.0000001)&lt;br /&gt;
 	{&lt;br /&gt;
 		if( f &amp;gt;= 0.0f )&lt;br /&gt;
 			newval = start - (NIntegrate( 0.0, start, sections ) - Value);&lt;br /&gt;
 		else&lt;br /&gt;
 			newval = start + (NIntegrate( 0.0, start, sections ) - Value);&lt;br /&gt;
 	}&lt;br /&gt;
 	else&lt;br /&gt;
 	{&lt;br /&gt;
 		// die Unterscheidung ob start &amp;gt; 0 ist wird bereits von NIntegrate durchgeführt&lt;br /&gt;
 		newval = start - (NIntegrate( 0.0, start, sections ) - Value) / f;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	return FindValue( newval, Value, --depth, sections );&lt;br /&gt;
 }&lt;br /&gt;
Nun noch das ein oder andere Beispiel wie wir diese Funktionen verwenden:&lt;br /&gt;
 /* Beispielshafte Verwendung der Funktionen */&lt;br /&gt;
 void main()&lt;br /&gt;
 {&lt;br /&gt;
     double FullKurveLength = NIntegrate( 0.0, 1.0, 100 );&lt;br /&gt;
     double TforS;&lt;br /&gt;
     double KurveLength;&lt;br /&gt;
     &lt;br /&gt;
     printf( &amp;quot;Die gesamte Kurvenlaenge (von Zeitpunkt 0 bis 1) betraegt ziemlich genau: %f\n&amp;quot;, FullKurveLength );&lt;br /&gt;
     &lt;br /&gt;
     printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
     &lt;br /&gt;
     /* Parameter:&lt;br /&gt;
      * a = 0.0: Wir möchten den zurückgelegten Weg angefangen von Zeitpunkt 0.0&lt;br /&gt;
      * b = 0.5: Wir möchten den zurückgelegten Weg bis zum Zeitpunkt 0.5, also von 0.0 bis 0.5&lt;br /&gt;
      * sections = 10: liefert wahrscheinlich ein eher ungenaues Ergebnis.&lt;br /&gt;
      */&lt;br /&gt;
     KurveLength = NIntegrate( 0.0, 0.5, 10 );&lt;br /&gt;
     printf( &amp;quot;Ungeneau: in der haelfte der Zeit wurde %f Weg zurueck gelegt.\n&amp;quot;, KurveLength );&lt;br /&gt;
     &lt;br /&gt;
     KurveLength = NIntegrate( 0.0, 0.5, 20 );&lt;br /&gt;
     printf( &amp;quot;Etwas geneauer: in der haelfte der Zeit wurde %f Weg zurueck gelegt.\n&amp;quot;, KurveLength );&lt;br /&gt;
     &lt;br /&gt;
     KurveLength = NIntegrate( 0.0, 0.5, 100 );&lt;br /&gt;
     printf( &amp;quot;Recht geneau: in der haelfte der Zeit wurde %f Weg zurueck gelegt.\n&amp;quot;, KurveLength );&lt;br /&gt;
     &lt;br /&gt;
     printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
     &lt;br /&gt;
     /* Parameter:&lt;br /&gt;
      * start = 0.5: wir schätzen das der halbe Weg zum Zeitpunkt 0.5 zurück gelegt wurde&lt;br /&gt;
      * Value = FullKurveLength * 0.5: wir möchten wissen zu welchem Zeitpunkt der halbe Weg zurück gelegt wurde&lt;br /&gt;
      * depth &amp;amp; sections = 0: liefert wahrscheinlich ein eher ungenaues Ergebnis.&lt;br /&gt;
      */&lt;br /&gt;
     TforS = FindValue( 0.5, FullKurveLength * 0.5, 5, 10 );&lt;br /&gt;
     printf( &amp;quot;Ungenau: zum Zeitpunkt %f wurde der halbe Weg zurueck gelegt.\n&amp;quot;, TforS );&lt;br /&gt;
     &lt;br /&gt;
     TforS = FindValue( 0.5, FullKurveLength * 0.5, 10, 20 );&lt;br /&gt;
     printf( &amp;quot;Etwas genauer: zum Zeitpunkt %f wurde der halbe Weg zurueck gelegt.\n&amp;quot;, TforS );&lt;br /&gt;
     &lt;br /&gt;
     TforS = FindValue( 0.5, FullKurveLength * 0.5, 50, 100 );&lt;br /&gt;
     printf( &amp;quot;Recht genau: zum Zeitpunkt %f wurde der halbe Weg zurueck gelegt.\n&amp;quot;, TforS );&lt;br /&gt;
 };&lt;br /&gt;
Als ausgabe dieses Tests erhalten wir:&lt;br /&gt;
 Die gesamte Kurvenlaenge (von Zeitpunkt 0 bis 1) betraegt ziemlich genau: 9.201214&lt;br /&gt;
&lt;br /&gt;
 Ungeneau: in der haelfte der Zeit wurde 5.582572 Weg zurueck gelegt.&lt;br /&gt;
 Etwas geneauer: in der haelfte der Zeit wurde 5.558352 Weg zurueck gelegt.&lt;br /&gt;
 Recht geneau: in der haelfte der Zeit wurde 5.550576 Weg zurueck gelegt.&lt;br /&gt;
&lt;br /&gt;
 Ungenau: zum Zeitpunkt 0.376217 wurde der halbe Weg zurueck gelegt.&lt;br /&gt;
 Etwas genauer: zum Zeitpunkt 0.378924 wurde der halbe Weg zurueck gelegt.&lt;br /&gt;
 Recht genau: zum Zeitpunkt 0.379795 wurde der halbe Weg zurueck gelegt.&lt;br /&gt;
Wir können uns nun auch die Zeitpunkte ausrechnen an denen 10%, 20%, ... des Weges zurück gelegt wurde und uns die Punkte auf der Kurve einzeichnen um auch einen visuelleren Vergleich zu erhalten:&lt;br /&gt;
&lt;br /&gt;
[[Bild:KurvenlaengenInterpolation.gif]]&lt;br /&gt;
&lt;br /&gt;
Rot: Die Punkte zu den Zeitpunkten 0.0, 0.1, 0.2, ..., 0.9, 1.0&lt;br /&gt;
&lt;br /&gt;
Blau: Die Punkte zu denen 0%, 10%, 20%, ..., 90%, 100% des Weges zurück gelegt wurde angenähert durch FindValue(...) mit depth = 5 und sections = 10&lt;br /&gt;
&lt;br /&gt;
Grün: Die Punkte zu denen 0%, 10%, 20%, ..., 90%, 100% des Weges zurück gelegt wurde angenähert durch FindValue(...) mit depth = 50 und sections = 100&lt;br /&gt;
&lt;br /&gt;
Gut zu erkennen ist auf diesem Bild auch, dass 10 Unterteilungen für einen das Integrieren von 0 bis 0.1 noch ganz gute Ergebnisse liefert, jedoch bei einem Wertebereich von 0 bis 1 schon ziemlich ungenau wird, somit macht es durchaus Sinn die Anzahl der Unterteilungen auch abhängig von der Größe des Bereiches zu machen.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:KurvenlaengenInterpolation.gif&amp;diff=18219</id>
		<title>Datei:KurvenlaengenInterpolation.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:KurvenlaengenInterpolation.gif&amp;diff=18219"/>
				<updated>2006-06-17T17:04:00Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Vergleich Kurvenlängeninterpolation und Interpolation über die Zeit.

Rot: Die Punkte zu den Zeitpunkten 0.0, 0.1, 0.2, ..., 0.9, 1.0

Blau: Die Punkte zu denen 0%, 10%, 20%, ..., 90%, 100% des Weges zurück gelegt wurde angenähert durch FindValue(...)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vergleich Kurvenlängeninterpolation und Interpolation über die Zeit.&lt;br /&gt;
&lt;br /&gt;
Rot: Die Punkte zu den Zeitpunkten 0.0, 0.1, 0.2, ..., 0.9, 1.0&lt;br /&gt;
&lt;br /&gt;
Blau: Die Punkte zu denen 0%, 10%, 20%, ..., 90%, 100% des Weges zurück gelegt wurde angenähert durch FindValue(...) mit depth = 5 und sections = 10&lt;br /&gt;
&lt;br /&gt;
Grün: Die Punkte zu denen 0%, 10%, 20%, ..., 90%, 100% des Weges zurück gelegt wurde angenähert durch FindValue(...) mit depth = 50 und sections = 100&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=18173</id>
		<title>Kategorie Diskussion:Exzellent</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=18173"/>
				<updated>2006-06-15T05:02:41Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Kandidatenliste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Vorraussetzungen für Exzellente Artikel=&lt;br /&gt;
Hier könnt ihr Artikel vorschlagen welche ihr als &amp;quot;exzellenten Artikel&amp;quot; einstufen würdet.&lt;br /&gt;
&lt;br /&gt;
Folgende Punkte '''müssen''' erfüllt sein:&lt;br /&gt;
* Kein Sackgassenartikel - Artikel muss auf andere Artikel direkt (nicht über Code) verlinken&lt;br /&gt;
* Kein Plain Text - Artikel muss eine einheitliche Formatierung aufweisen&lt;br /&gt;
* Bilder - Artikel muss mindestens ein Bild/Grafik besitzen&lt;br /&gt;
* Vollständig - Der Artikel muss das Thema umfassend behandeln&lt;br /&gt;
* Kein Tutorial - Der Artikel darf nicht der [[:Kategorie:Tutorial|Kategorie Tutorial]] angehören.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit ein Artikel als '''exezellent''' eingestuft wird müssen:&lt;br /&gt;
* 5 Wiki-User der Wahl zustimmen darunter mindestens ein Moderator,&lt;br /&gt;
* keine Gegenstimmen bestehen,&lt;br /&gt;
* die Vorraussetzungen von oben gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=Kandidatenliste=&lt;br /&gt;
Um einen Artikel zur Kandidatenliste hinzuzufügen bitte den Nachfolgenden Code vor dem Ende (&amp;quot;&amp;lt;nowiki&amp;gt;|}&amp;lt;/nowiki&amp;gt;&amp;quot;) der Tabelle einfügen:&lt;br /&gt;
&lt;br /&gt;
 |&amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
Um eine Stimme abzugeben, kopiert ihr bitte den Wiki-Code &amp;quot;&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&amp;quot; in die entsprechende Spalte. Das Wiki generiert daraus eure Unterschrift (Signatur).&lt;br /&gt;
&lt;br /&gt;
Falls ihr eine Gegenstimme abgebt, muss eine Begründung dazu gegeben werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Vorgeschlagener Artikel&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Beführworter&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Gegner&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Begründung für Gegenstimme / Diskussion&lt;br /&gt;
|-&lt;br /&gt;
|[[Skybox]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Wenn hier noch jemand ein Codebeispiel liefern könnte wäre der Artikel auch Excellent. So ist er etwas Kurz. (Kriterium der Vollständigkeit ;))&lt;br /&gt;
|-&lt;br /&gt;
|[[glBegin]]&lt;br /&gt;
| --[[Benutzer:Lyr|Lyr]] 17:14, 7. Apr 2006 (CEST),&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 11:53, 2. Mai 2006 (CEST),&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 01:47, 3. Mai 2006 (CEST)&lt;br /&gt;
| &lt;br /&gt;
| Dieser Artikel wäre sicherlich auch ein Kandidat. Was mich bei ihm noch etwas zögerlich stimmt ist die Beschreibung. Diese ist realtiv weit weg vom Orginal. Das ist nicht sodnerlich schlimm, nur muss halt sichergestellt werden, dass alle Infos der orginal Spezifikation enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Scheint mir (zumindest was OGL 1.1 betrifft) vollständ und sieht auch ganz nett aus.&lt;br /&gt;
&lt;br /&gt;
Habe ihn nochmal gecheckt. Ist soweit ich das sehe vollständig.&lt;br /&gt;
|-&lt;br /&gt;
|[[DelphiGL]]&lt;br /&gt;
| --[[Benutzer:Luketheduke|luketheduke]] 12:06, 2. Apr 2006 (CEST),&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 19:37, 10. Apr 2006 (CEST),&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 01:47, 3. Mai 2006 (CEST)&lt;br /&gt;
| --[[Benutzer:Lyr|Lyr]] 07:02, 15. Jun 2006 (CEST)&lt;br /&gt;
| Phobeus hat die Anfänge ergänzt -&amp;gt; jetzt bin ich auch ein Fan. --[[Benutzer:Flash|Flash]] 19:37, 10. Apr 2006 (CEST)&lt;br /&gt;
Gegenstimme: obwohl dieser Artikel informell aufgebaut ist, fällt er für mich in die Kategorie Werbung oder zumindest in die Kategorie: Beschreibung was hier zu finden ist, bzw. wer dies zustande gebracht hat. In meinen Augen sollte ein Beitrag darüber was auf einer Seite gemacht wird - oder wer diese verfasst hat - ''niemals'' hervorgehoben werden. Entweder die Seite ist so gut dass sie ohne entsprechende Hervorhebung ihrer Leistungen auskommt, oder eine derartige Hervorhebung (auf der Seite selbst) kann auch nichts daran ändern. Im Endeffekt: als Information gut gebrauchbar, aber lesenswert ... nur für die die es interessiert, also für die die dieses Wiki anpsrechend finden und diejenigen informieren sich darüber wer dies geschaffen hat ... oder auch nicht. Für alle anderen (wenn ich hier von meiner Perspektive sprechen darf) klingt ein derartiger &amp;quot;lesenswerter&amp;quot; Artikel wie Heuchelei. Um den (hier vielleicht zu häufig verwendeten) Vergleich zu Wikipedia zu ziehen: damals als ein solcher Artikel noch einer der besten war hätte sich keiner dafür interessiert. Und jetzt wo die Entstehungsgeschichte von Wikipedia vielleicht eine Erwähnung hier und da Wert wäre gibt es in Wikipedia bereits viele viele Artikel die bei weitem lesenswerter sind als dessen Entstehungsgeschichte.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 07:02, 15. Jun 2006 (CEST)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswahlkriterien ==&lt;br /&gt;
&lt;br /&gt;
Ich finde die Asuwahlkriterien etwas strange. Schließlich sind Tutorials auch Artikel und in den meisten Fällen noch dazu ziemlich gute. Warum sollten diese also ausgeschlossen werden? Vermitteln ja schließlich meist recht anschaulich viel Information. Also exakt das, was nen guten Artikel ausmacht.&lt;br /&gt;
--[[Benutzer:Frase|Frase]] 18:48, 18. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tutorials sind einzelarbeiten die von einer Person gemacht wurden und die eigentlich auch nur von dieser zu Verantworten/Verbessern sind. Die Auszeichnung soll gerade dafür sorgen die &amp;quot;graue Maus&amp;quot; Artikel aufzuwerten. Das unsere Tutorials alle Exzellent sind steht außer Frage. Die Auszeichnung heißt aber nicht um sonst &amp;quot;Exzellente Artikel&amp;quot; und nicht &amp;quot;Exzellente Tutorials&amp;quot;. Außerdem soll die Auzeichnung erreichen, dass die Nutzer einfach mal ins Wiki reinlesen. Tutorials sind in sich geschlossen und verlinken kaum auf andere Artikel. Sie behandeln ein Thema, und das ist gut so.&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 01:11, 19. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und es kann die Leute animieren die Artikel den Kritierie anzupassen bzw. eigene Artikel einzustellen.&lt;br /&gt;
So hat es zumindest bei mir funktioniert. Ich habe jetzt sogar Bilder! :lol:&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 04:35, 19. Mär 2006 (CET)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenGL_Smooth&amp;diff=17969</id>
		<title>OpenGL Smooth</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenGL_Smooth&amp;diff=17969"/>
				<updated>2006-05-21T06:25:10Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenGL]] besitzt eine weitere Möglichkeit Kanten-Antialiasing zu realisieren. Diese können mit [[glEnable]] mit den Parametern GL_POINT_SMOOTH, GL_LINE_SMOOTH bzw. GL_POLYGON_SMOOTH aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=Technik=&lt;br /&gt;
Wenn der Smooth-Wert für ein [[Primitive]] aktiviert ist, so werden im Fall von Punkten und Linien bereits andere Pixel vom [[Rasterisierung|Rasterizer]] generiert. Zusätzlich wird für jedes generierte [[Fragment]] noch ein Deckungs-Wert berechnet, welcher angibt wie viel Prozent des Fragmentes von dem entsprechenden [[Primitive]] bedeckt werden.&lt;br /&gt;
&lt;br /&gt;
Dieser Deckungs-Wert wird nach allen anderen Berechnungen mit dem Alpha-Wert des Fragmentes multipliziert. Aus diesem Grund hängt diese Art von Antialiasing auch mit [[Blending]] zusammen, wodurch das Zeichnen üblicherweise mit Tiefensortierung erfolgen muss (was gleichzeitig der größte Nachteil an dieser Methode ist).&lt;br /&gt;
&lt;br /&gt;
==Punkte==&lt;br /&gt;
Werden (größere) Punkte mit aktiviertem GL_POINT_SMOOTH gerendert, so wird offensichtlich aus dem Quadrat ein richtiger Kreis. Auch ohne aktiviertem [[Blending]] (mittels [[glEnable]]( GL_BLEND ) ) hätte man hier also bereits ein Kreisform, aber natürlich ohne geglätteten Rand.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GL_POINT_SMOOTH_deaktiviert.png]] [[Bild:GL_POINT_SMOOTH_aktiviert.png]]&lt;br /&gt;
&lt;br /&gt;
''4-Fach vergrößterter Punkt links ohne und recht mit GL_POINT_SMOOTH.''&lt;br /&gt;
&lt;br /&gt;
==Linien==&lt;br /&gt;
Werden Linien mit aktiviertem GL_LINE_SMOOTH gerendert, so wird offensichtlich aus dem Trapez (mehrere 1-Pixel Linien entweder nebeneinander oder übereinander) ein Quader. Dies hat (vor allem bei breiteren Linien) ebenfalls auch Auswirkungen wenn [[Blending]] deaktiviert ist.&lt;br /&gt;
&lt;br /&gt;
[[Bild:GL_LINE_SMOOTH_deaktiviert.png]] [[Bild:GL_LINE_SMOOTH_aktiviert.png]]&lt;br /&gt;
&lt;br /&gt;
''4-Fach vergrößterte Linie links ohne und recht mit GL_LINE_SMOOTH.''&lt;br /&gt;
&lt;br /&gt;
==Polygone==&lt;br /&gt;
Polygone (also Triangles, Quads, Triangle-Strips, Triangle-Fans und Polygone) verändern ihr Erscheinungsbild mit deaktivierten [[Blending]] kaum. Mit aktiviertem [[Blending]] werden aber natürlich die Kanten geglättet.&lt;br /&gt;
&lt;br /&gt;
=Probleme=&lt;br /&gt;
Bei Polygonen tauchen die größten Problem auf, und zwar so große, dass es von vielen Grafikkarten gar nicht unterstützt wird. Vor allem bei aktiviertem GL_POLYGON_SMOOTH kommt es also des öfteren vor, dass in den Softwaremodus umgeschalten wird, und nicht einmal dann kann man sicher sein dass es funktioniert. Und wenn es doch funktioniert so erwartet einem häufig bereits die nächste Überraschung.&lt;br /&gt;
&lt;br /&gt;
Das Problem ist, dass zwei aneinanderliegende Dreiecke häufig einen Spalt aufweisen. Da die [[Primitive]]n GL_QUADS, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN und GL_POLYGON üblicherweise ebenfalls in Dreiecke aufgeteilt werden, entsteht dieser Spalt auch dort. Und wäre dies nicht schon genug so kann ein einzelnes Dreieck an einer [[Clipping Plane]] oder dem [[Frustum]] ebenfalls noch in 4 kleiner Dreiecke aufgesplittet werden, wo wir wiederum diesen Spalt antreffen.&lt;br /&gt;
&lt;br /&gt;
Also GL_POLYGON_SMOOTH ist mit äusserster Vorsicht zu geniesen.&lt;br /&gt;
&lt;br /&gt;
=OpenGL Funktionen=&lt;br /&gt;
*[[glEnable]] um GL_POINT_SMOOTH, GL_LINE_SMOOTH bzw. GL_POLYGON_SMOOTH zu aktivieren.&lt;br /&gt;
*[[glHint]] um den [[OpenGL]]-Treiber zu bitten eine schnellere oder eine schönere Berechnungsmethode zu verwenden.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glEnable&amp;diff=17968</id>
		<title>glEnable</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glEnable&amp;diff=17968"/>
				<updated>2006-05-21T06:19:21Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* GL_LINE_SMOOTH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glEnable, glDisable =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''gEnable, glDisable''' - Aktiviert bzw. deaktiviert eine server-seitige Fähigkeit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
procedure '''glEnable'''(''cap'' : TGLEnum);&amp;lt;br&amp;gt;&lt;br /&gt;
procedure '''glDisable'''(''cap'' : TGLEnum);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&amp;lt;table border=1 rules=all&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &lt;br /&gt;
 &amp;lt;td&amp;gt;''cap''&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;Symbolische Konstante der zu (de)aktivierenden GL-Fähigkeit.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glEnable''' und '''glDisable''' aktivieren bzw. deaktivieren verschiedene Fähigkeiten, deren momentane Einstellung entweder mit [[glIsEnabled]] oder [[glGet]] ermittelt werden kann. Die Vorgabe für alle Einstellungen (Ausgenommen GL_DITHER und GL_FALSE, die beide GL_TRUE sind) ist GL_FALSE.&lt;br /&gt;
&lt;br /&gt;
Beide Befehle bekommen als Argument die symbolische Konstante der OpenGL-Fähigkeit übergeben die umgeschaltet werden soll. Gültig sind dabei folgende Werte :&lt;br /&gt;
&lt;br /&gt;
=== GL_ALPHA_TEST ===&lt;br /&gt;
Wenn aktiviert, wird der Alphatest ausgeführt. Siehe [[glAlphaFunc]].&lt;br /&gt;
&lt;br /&gt;
=== GL_AUTO_NORMAL ===&lt;br /&gt;
Wenn aktiviert, werden automatisch Normalen generiert wenn [[GL_MAP2_VERTEX_3]] oder [[GL_MAP2_VERTEX_4]] zur Erstellung von Vertices genutzt werden. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_BLEND ===&lt;br /&gt;
Wenn aktiviert werden ankommenden RGBA-Farben mit den Werten die sich im Farbpuffer befinden vermischt. Siehe [[glBlendFunc]].&lt;br /&gt;
&lt;br /&gt;
=== GL_CLIP_PLANEi ===&lt;br /&gt;
Wenn aktiviert, wird die Geometrie gegen die nutzerdefinierte Schnittfläche ''i'' geschnitten. Siehe [[glClipPlane]].&lt;br /&gt;
&lt;br /&gt;
=== GL_COLOR_LOGIC_OP ===&lt;br /&gt;
Wenn aktiviert, werden die momentan gewählten logischen Operationen auf ankommenden RGBA-Farben und Farbpuffer-Werte angewendet. Siehe [[glLogicOp]].&lt;br /&gt;
&lt;br /&gt;
=== GL_COLOR_MATERIAL ===&lt;br /&gt;
Wenn aktiviert, benutzen einer oder mehrere Materialparameter die aktuelle Farbeinstellung. Siehe [[glColorMaterial]].&lt;br /&gt;
&lt;br /&gt;
=== GL_COLOR_TABLE_EXT ===&lt;br /&gt;
Wenn aktiviert, werden Farbbild-Komponenenten auf eine Farbtabelle verteilt die vor einer Windiung stattfindet. Siehe [[glColorTableEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_CONVOLUTION_1D_EXT ===&lt;br /&gt;
Wenn aktiviert, wird die ein-dimensionale Windung während des Pixeltransfers durchgeführt. Siehe [[glConvolutionFilter1DEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_CONVOLUTION_2D_EXT ===&lt;br /&gt;
Wenn aktiviert, wird die zwei-dimensionale Windung während des Pixeltransfers durchgeführt. Siehe [[glConvolutionFilter2DEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_CULL_FACE ===&lt;br /&gt;
Wenn aktiviert, werden Polygone entsprechend ihrer Zeichnungsrichtung (Wicklung wäre der korrekt Ausdruck --[[Benutzer:Sascha Willems|Sascha Willems]] 13:05, 9. Jul 2004 (CEST)) (in Fensterkoordinaten) ausgeschlossen. Siehe [[glCullFace]].&lt;br /&gt;
&lt;br /&gt;
=== GL_DEPTH_TEST ===&lt;br /&gt;
Wenn aktiviert werden Tiefenvergleiche getätigt und der Tiefenpuffer aktualisiert. Man beachte das selbst dann, wenn ein Tiefenpuffer existiert und die Tiefenmaske ungleich null ist, der Tiefenpuffer nicht aktiviert wird wenn der Teifentest inaktiv ist. Siehe [[glDepthFunc]] und [[glDepthRange]].&lt;br /&gt;
&lt;br /&gt;
=== GL_DITHER ===&lt;br /&gt;
Wenn aktiviert, werden Farbkomponenten oder -indizes gedithert (siehe [[Dithering]])&lt;br /&gt;
&lt;br /&gt;
=== GL_FOG ===&lt;br /&gt;
Wenn aktiviert, wird die Nebelfarbe in den Farbwert nach der Texturierung gemischt. Siehe [[glFog]].&lt;br /&gt;
&lt;br /&gt;
=== GL_FOG_OFFSET_EXT ===&lt;br /&gt;
Wenn aktiviert wird ein Versatz zum Z-Wert, der zur Berechnung des Nebels genutzt wird, addiert. Siehe [[glFog]].&lt;br /&gt;
&lt;br /&gt;
=== GL_INDEX_LOGIC_OP === &lt;br /&gt;
Wenn aktiviert, werden die momentan gewählten logischen Operationen auf einkommende Index- und Farbpufferindizes angewandt. Siehe [[glLogicOp]].&lt;br /&gt;
&lt;br /&gt;
=== GL_INTERLACE_EXT ===&lt;br /&gt;
Wenn aktiviert, wird ein Bild als interlaced (zu Deutsch : verschachtelt) angesehen. Jede Reihe ''m'' des Bildes wird behandelt als wäre sie Reihe 2 * ''m''. Wenn das Quellbild also eine Höhe von ''h'' Reihen hat, erweitert dies die Höhe des Bildes effektiv auf 2 * ''h'' - 1. Wo Fehler durch die Angabe ungültiger Bilddimensionen entstehen (z.B. [[glTexImage2D]], wird die resultierende Dimension geprüft, nicht die Dimension des Quellbildes. Dieses Token hat keinen Effekt auf Bild-Leseoperationen (Siehe [[GL_INTERLACE_READ_I3D]].&lt;br /&gt;
&lt;br /&gt;
=== GL_INTERLACE_READ_I3D ===&lt;br /&gt;
Wenn aktiviert, werden Bilder im Framepuffer als interlaced angesehen. Jede Reihe ''m'' des Bildes wird behandelt als wäre sie Reihe 2 * ''m''. Wenn das Bild im Framepuffer eine Höhe von ''h'' Reiehen hat, wird dieses effektiv auf eine Höhe von 2 * ''h'' - 1 vergrößert. Dieses Token betrifft nur [[glReadPixels]] und [[glCopyPixels]].&lt;br /&gt;
&lt;br /&gt;
=== GL_LIGHTi ===&lt;br /&gt;
Wenn aktiviert, wird die Lichtquelle ''i'' in die Berechnung der Beleuchtungsgleichung mit einbezogen. Siehe [[glLightModel]] und [[glLight]].&lt;br /&gt;
&lt;br /&gt;
=== GL_LIGHTING ===&lt;br /&gt;
Wenn aktiviert, werden die aktuellen Beleuchtungsparameter genutzt um die Vertex- oder Indexfarbe zu berechnen. Ansonsten wird einfach die aktuelle Farbe zw. der aktuelle Index zugewiesen. Siehe [[glMaterial]], [[glLightModel]] und [[glLight]].&lt;br /&gt;
&lt;br /&gt;
=== GL_LINE_SMOOTH ===&lt;br /&gt;
Wenn aktiviert, werden Linien mit dem korrekten rechtwinkligen &amp;quot;Eecken&amp;quot; gerendert. Dieser Effekt ist nur bei [[glLineWidth|breiten Linen]] von Bedeutung.&lt;br /&gt;
{|&lt;br /&gt;
! Aktiviert&lt;br /&gt;
! Deaktiviert&lt;br /&gt;
|-&lt;br /&gt;
|[[Bild:GL LINE SMOOTH_aktiviert.png]]&lt;br /&gt;
|[[Bild:GL LINE SMOOTH deaktiviert.png]]&lt;br /&gt;
|}&lt;br /&gt;
''In vierfacher Vergrößerung''&lt;br /&gt;
&lt;br /&gt;
=== GL_LINE_STIPPLE ===&lt;br /&gt;
Wenn aktiviert, wird das aktuelle Punktierungsmuster für das Zeichnen von Linien verwendet. Siehe [[glLineStipple]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_COLOR_4 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] RGBA-Werte. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_INDEX ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] Farb-Indizes. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_NORMAL ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] Normalen. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_TEXTURE_COORD_1 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] s-Texturkoordinaten. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_TEXTURE_COORD_2 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] s- und t-Texturkoordinaten. Siehe [[glMap1]].&lt;br /&gt;
=== GL_MAP1_TEXTURE_COORD_3 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] s-, t- und r-Texturkoordinaten. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_TEXTURE_COORD_4 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] s-, t-, r- und q-Texturkoordianten. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_VERTEX_3 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] x-, y- und z-Vertexkoordinaten. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP1_VERTEX_4 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord1]], [[glEvalMesh1]] und [[glEvalPoint1]] x-, y-, z- und w-Vertexkoordinaten. Siehe [[glMap1]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_COLOR_4 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] RGBA-Werte. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_INDEX ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] Farb-Indizes. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_NORMAL ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] Normale. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_TEXTURE_COORD_1 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] s-Texturkoordinaten. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_TEXTURE_COORD_2 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] s- und t-Texturkoordinaten. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_TEXTURE_COORD_3 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] s-, t- und r-Texturkoordinaten. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_TEXTURE_COORD_4 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] s-, t-, r- und q-Texturkoordinaten. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_VERTEX_3 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] x, y und z-Vertexkoordinaten. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MAP2_VERTEX_4 ===&lt;br /&gt;
Wenn aktiviert, generieren Aufrufe an [[glEvalCoord2]], [[glEvalMesh2]] und [[glEvalPoint2]] x, y, z- und w-Vertexkoordinaten. Siehe [[glMap2]].&lt;br /&gt;
&lt;br /&gt;
=== GL_MULTISAMPLE_EXT ===&lt;br /&gt;
Wenn aktiviert, bekommt jeder Pixel im Framepuffer GL_SAMPLES_EXT-Samplepunkte zugewiesen. with it.&lt;br /&gt;
&lt;br /&gt;
=== GL_NORMALIZE ===&lt;br /&gt;
Wenn aktiviert, werden via [[glNormal]] angegebene Normalen nach ihrer Transformation auf Einheitslänge skaliert. Siehe [[glNormal]].&lt;br /&gt;
&lt;br /&gt;
=== GL_OCCLUSION_TEST_EXT ===&lt;br /&gt;
Wenn aktiviert, wird der Ausschluß-Status (Occlusion, Deutsche Übersetzung ist leider nicht gebräuchlich --[[Benutzer:Sascha Willems|Sascha Willems]] 13:05, 9. Jul 2004 (CEST)) je nach Tiefentest aktualisiert (siehe [[glDepthFunc]]). Der Ausschluß-Status kann mit [[glGetBooleanv]] ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== GL_PIXEL_TEX_GEN_EXT ===&lt;br /&gt;
Wenn aktiviert, werden die RGBA-Farben des Bildes genutzt um Texturkoordinaten für das Fragment zu generieren. Siehe [[glPixelTexGenEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_POINT_SMOOTH ===&lt;br /&gt;
Wenn aktiviert, werden Punkte gefiltert gezeichnet. Ansonsten werden ungefilterte Punkte gerendert. Siehe [[glPointSize]].&lt;br /&gt;
&lt;br /&gt;
=== GL_POLYGON_OFFSET_FILL ===&lt;br /&gt;
Wenn aktiviert und das Polygon im GL_FILL-Modus gerendert wird, wird ein Versatz zum Tiefenwert der Fragmente des Polygons addiert, bevor der Tiefentest stattfindet. Siehe [[glPolygonOffset]].&lt;br /&gt;
&lt;br /&gt;
=== GL_POLYGON_OFFSET_LINE ===&lt;br /&gt;
Wenn aktiviert und das Polygon im GL_LINE-Modus gerendert wird, wird ein Versatz zum Tiefenwert der Fragmente des Polygons addiert, bevor der Tiefentest stattfindet. Siehe [[glPolygonOffset]].&lt;br /&gt;
&lt;br /&gt;
=== GL_POLYGON_OFFSET_POINT ===&lt;br /&gt;
Wenn aktiviert, wird ein Versatz zu den Tiefenwerten der Fragmente eines Polygons addiert, bevor der Tiefentest stattfindet, wenn es im GL_POINT-Modus gerendert wird. Siehe [[glPolygonOffset]].&lt;br /&gt;
&lt;br /&gt;
=== GL_POLYGON_SMOOTH ===&lt;br /&gt;
Wenn aktiviert, werden Polygone mit korrekter Filterung gezeichnet, indem der Alphawert eines [[Fragment]]es entsprechend der Deckung gesetzt wird. [[Blenden|Blending]] muss ebenfalls aktiviert sein um korrekte Resultate zu erhalten. &lt;br /&gt;
{{Hinweis|Funktion ist meist nicht in Hardware verfügbar, es wird häufig auf Softwaremodus umgeschalten und auch dort nicht immer korrekt gezeichnet.}}&lt;br /&gt;
&lt;br /&gt;
=== GL_POLYGON_STIPPLE ===&lt;br /&gt;
Wenn aktiviert, wird das aktuelle Polygon-Punktierungs-Muster zum Rendern der Polygone genutzt. Siehe [[glPolygonStipple]].&lt;br /&gt;
&lt;br /&gt;
=== GL_POST_COLOR_MATRIX_COLOR_TABLE_EXT ===&lt;br /&gt;
Wenn aktiviert, werden Farbbild-Komponentne in die Farbtabelle gelegt die nach der Farbmatrix kommt. Siehe [[glColorTableEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_POST_CONVOLUTION_COLOR_TABLE_EXT ===&lt;br /&gt;
Wenn aktiviert, werden Farbbild-Komponenten in eine Farbtabelle gelegt die nach der Windung, aber vor der Farbmatrix kommt. Siehe [[glColorTableEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_RESCALE_NORMAL_EXT ===&lt;br /&gt;
Wenn aktiviert, werden Normalen mit einem Reskalierungsfaktor multipliziert, nachdem sie in den Augenraum transformiert wurden und befor sie normalisiert werden. Dieser Faktor wird aus der obersten Reihe der inversen umgestellten Modelansichtsmatrix berechnet.&lt;br /&gt;
&lt;br /&gt;
=== GL_SAMPLE_ALPHA_TO_MASK_EXT ===&lt;br /&gt;
Wenn aktiviert, wird der Alphawert eines Fragmentes genutzt um einen temporären Maskenwert zu erstellen, welcher mit dem Maskenwert des Fragmentes verUNDet wird.&lt;br /&gt;
&lt;br /&gt;
=== GL_SAMPLE_ALPHA_TO_ONE_EXT ===&lt;br /&gt;
Wenn aktiviert, wird der Alphawert der Fragmente durch den maximal verfügbaren Alphawert ersetzt.&lt;br /&gt;
&lt;br /&gt;
=== GL_SAMPLE_MASK_EXT ===&lt;br /&gt;
Wenn aktiviert, wird der Wert von GL_SAMPLE_MASK_VALUE_EXT genutzt um temporäre Maskenwerte zu erstellen, die dann mit den Maskenwerten der Fragmente geUNDet werden. (AND-Verknüpft werden)&lt;br /&gt;
&lt;br /&gt;
=== GL_SCISSOR_TEST ===&lt;br /&gt;
Wenn aktiviert, werden Fragmente verworfen die ausserhalb des Scissor-Rechtecks liegen. Siehe [[glScissor]].&lt;br /&gt;
&lt;br /&gt;
=== GL_SEPARABLE_2D_EXT ===&lt;br /&gt;
Wenn aktiviert und GL_CONVOLUTION_2D_EXT deaktiviert ist, wird zweidimensionale Wicklung mit separierbarem Filter während des Pixeltransfers durchgeführt. Siehe [[glSeparableFilter2DEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_STENCIL_TEST ===&lt;br /&gt;
Wenn aktiviert, werden Stempeltests durchgeführt und der Stencilpuffer aktualisiert. Siehe [[glStencilFunc]] und [[glStencilOp]]..&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_1D ===&lt;br /&gt;
Wenn aktiviert, wird eindimensionale Texturierung angewandt (es sei denn zweidimensionale Texturierung wurde auch aktiviert). Siehe [[glTexImage1D]].&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_2D ===&lt;br /&gt;
Wenn aktiviert, wird zweidimensionale Texturierung angewandt (es sei denn dreidimensionale Texturierung wurde auch aktiviert). Siehe [[glTexImage2D]].&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_3D(''_EXT'') ===&lt;br /&gt;
Wenn aktiviert, wird dreidimensionale Texturierung angewandt. Siehe [[glTexImage3DEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_COLOR_TABLE_EXT ===&lt;br /&gt;
Wenn aktiviert, wird die gefilterte Texturenfarbe an die Farbtabelle für Texturen angepasst, bevor die Umgebung mit der Fragmentfarbe vermischt wird. Siehe [[glColorTableEXT]].&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_GEN_Q ===&lt;br /&gt;
Wenn aktiviert, wird die q-Texturkoordinate anhand der via [[glTexGen]] definierten Funktion zur Texturgenerierung berechnet. Ansonsten wird die aktuell angegebene q-Texturkoordinate genutzt. Siehe [[glTexGen]].&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_GEN_R ===&lt;br /&gt;
Wenn aktiviert, wird die r-Texturkoordinate anhand der via [[glTexGen]] definierten Funktion zur Texturgenerierung berechnet. Ansonsten wird die aktuell angegebene r-Texturkoordinate genutzt. Siehe [[glTexGen]].&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_GEN_S ===&lt;br /&gt;
Wenn aktiviert, wird die s-Texturkoordinate anhand der via [[glTexGen]] definierten Funktion zur Texturgenerierung berechnet. Ansonsten wird die aktuell angegebene s-Texturkoordinate genutzt. Siehe [[glTexGen]].&lt;br /&gt;
&lt;br /&gt;
=== GL_TEXTURE_GEN_T ===&lt;br /&gt;
Wenn aktiviert, wird die t-Texturkoordinate anhand der via [[glTexGen]] definierten Funktion zur Texturgenerierung berechnet. Ansonsten wird die aktuell angegebene t-Texturkoordinate genutzt. Siehe [[glTexGen]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterungen ==&lt;br /&gt;
Einige Routinen und Konstanten für diese Funktion sind Teil einer Erweiterung, also nicht Teil des GL-Kerns. Die folgenden Erweiterungen müssen in der durch [[glGetString]] mit dem Argument GL_EXTENSIONS gelieferten Zeichenkette enthalten sein, damit diese genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_color_table ===&lt;br /&gt;
'''GL_COLOR_TABLE_EXT''', '''GL_POST_CONVOLUTION_COLOR_TABLE_EXT''' und '''GL_POST_COLOR_MATRIX_COLOR_TABLE_EXT''' sind Teil der Erweiterung [[GL_EXT_color_table]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_convolution ===&lt;br /&gt;
'''GL_CONVOLUTION_1D_EXT''', '''GL_CONVOLUTION_2D_EXT''' und '''GL_SEPARABLE_2D_EXT''' sind Teil der Erweiterung [[GL_EXT_convolution]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_fog_offset ===&lt;br /&gt;
'''GL_FOG_OFFSET_EXT''' ist Teil der Erweiterung [[GL_EXT_fog_offset]].&lt;br /&gt;
&lt;br /&gt;
=== EXT_interlace ===&lt;br /&gt;
'''GL_INTERLACE_EXT''' ist Teil der Erweiterung [[GL_EXT_interlace]].&lt;br /&gt;
 &lt;br /&gt;
=== EXT_interlace_read ===&lt;br /&gt;
'''GL_INTERLACE_READ_I3D''' ist Teil der Erweiterung [[GL_EXT_interlace_read]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_multisample ===&lt;br /&gt;
'''GL_MULTISAMPLE_EXT''', '''GL_SAMPLE_ALPHA_TO_MASK_EXT''', '''GL_SAMPLE_ALPHA_TO_ONE_EXT''' und '''GL_SAMPLE_MASK_EXT''' sind Teil der Erweiterung  [[GL_EXT_multisample]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_occlusion_test ===&lt;br /&gt;
'''GL_OCCLUSION_TEST_EXT''' ist Teil der Erweiterung [[GL_EXT_occlusion_test]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_pixel_texture ===&lt;br /&gt;
'''GL_PIXEL_TEX_GEN_EXT''' ist Teil der Erweiterung [[GL_EXT_pixel_texture]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_rescale_normal ===&lt;br /&gt;
'''GL_RESCALE_NORMAL_EXT''' ist Teil der Erweiterung [[GL_EXT_rescale_normal]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_texture3D ===&lt;br /&gt;
'''GL_TEXTURE_3D_EXT''' ist Teil der Erweiterung [[GL_EXT_texture3D]].&lt;br /&gt;
&lt;br /&gt;
=== GL_EXT_texture_color_table ===&lt;br /&gt;
'''GL_TEXTURE_COLOR_TABLE_EXT''' ist Teil der Erweiterung [[GL_EXT_texture_color_table]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
GL_INVALID_ENUM wird generiert wenn ''cap'' kein gültiges Token ist.&lt;br /&gt;
&lt;br /&gt;
GL_INVALID_OPERATION wird generiert wenn [[glPixelTransfer]] zwischen [[glBegin]] und dem passenden [[glEnd]] aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Zugehörige Wertrückgaben ==&lt;br /&gt;
[[glGet]]&lt;br /&gt;
[[glIsEnabled]]&lt;br /&gt;
&lt;br /&gt;
(Die zu übergebenden Argumente können in der Beschreibung zu den beiden Funktionen nachgelesen werden.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glAlphaFunc]], [[glBitmap]], [[glBlendFunc]], [[glClipPlane]], [[glColorMaterial]], [[glColorTableEXT]], [[glCopyColorTableEXT]], [[glCopyPixels]], [[glCopyTexImage1D]], [[glCopyTexImage2D]], [[glCopyTexSubImage1D]], [[glCopyTexSubImage2D]], [[glCopyTexSubImage3DEXT]], [[glCullFace]], [[glDepthFunc]], [[glDepthRange]], [[glDrawPixels]], [[glEnableClientState]], [[glFog]], [[glGet]], [[glGetString]], [[glIsEnabled]], [[glLight]], [[glLightModel]], [[glLineWidth]], [[glLineStipple]], [[glLogicOp]], [[glMap1]], [[glMap2]], [[glMaterial]], [[glNormal]], [[glPointSize]], [[glPolygonMode]], [[glPolygonOffset]], [[glPolygonStipple]], [[glSampleMaskEXT]], [[glScissor]], [[glStencilFunc]], [[glStencilOp]], [[glTexGen]], [[glTexImage1D]], [[glTexImage2D]], [[glTexImage3DEXT]], [[glTexSubImage1D]], [[glTexSubImage2D]], [[glTexSubImage3DEXT]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|Enable]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:GL_POINT_SMOOTH_aktiviert.png&amp;diff=17967</id>
		<title>Datei:GL POINT SMOOTH aktiviert.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:GL_POINT_SMOOTH_aktiviert.png&amp;diff=17967"/>
				<updated>2006-05-21T06:14:10Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: 4-Fach Vergrößerung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;4-Fach Vergrößerung&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:GL_POINT_SMOOTH_deaktiviert.png&amp;diff=17966</id>
		<title>Datei:GL POINT SMOOTH deaktiviert.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:GL_POINT_SMOOTH_deaktiviert.png&amp;diff=17966"/>
				<updated>2006-05-21T06:13:54Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: 4-Fach Vergrößerung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;4-Fach Vergrößerung&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Antialiasing&amp;diff=17965</id>
		<title>Antialiasing</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Antialiasing&amp;diff=17965"/>
				<updated>2006-05-21T06:11:03Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: + OpenGL Smooth, keine Ahnung ob eine andere Bezeichnung existiert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter Antialiasing versteht man verschiedene Techniken um die Effekte von [[Aliasing]] zu reduzieren. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt für die verschiedenen Aliasingeffekte auch entsprechend verschiedene Antialiasing Methoden.&lt;br /&gt;
&lt;br /&gt;
== Antialiasing bei Texturen ==&lt;br /&gt;
Bei [[Texturen]] werden hauptsächlich &lt;br /&gt;
:[[MipMaps]] &lt;br /&gt;
:[[anisotrophisch|anisotrophisches Filtern]] &lt;br /&gt;
verwendet.&lt;br /&gt;
&lt;br /&gt;
== Antialiasing an Kanten ==&lt;br /&gt;
Um die Treppenbildung an den [[Kante]]n von [[Polygon]]en zu verringen benutzt man &lt;br /&gt;
:[[Supersampling]]&lt;br /&gt;
:[[Multisampling]]&lt;br /&gt;
:[[Jittering]]&lt;br /&gt;
:[[OpenGL Smooth]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Frustum_Culling&amp;diff=17957</id>
		<title>Frustum Culling</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Frustum_Culling&amp;diff=17957"/>
				<updated>2006-05-21T03:36:45Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Unvollständig}}&lt;br /&gt;
=Was ist das?=&lt;br /&gt;
'''Frustum Culling''' ist eine Optimierungsmethode, bei der all die Objekte vom Zeichnen ausgeschlossen werden, die außerhalb des Sichtbereichs (des [[Frustum]]s) liegen.&lt;br /&gt;
&lt;br /&gt;
=Wozu brauch ich es?=&lt;br /&gt;
'''Frustum Culling''' sorgt dafür, dass akzeptable Frameraten auch bei großen Szenen möglich sind. Denn durch '''Frustum Culling''' werden viele der Teile der Szene nicht gezeichnet, die man ohnehin nicht sehen kann.&lt;br /&gt;
&lt;br /&gt;
=Wie funktioniert es?=&lt;br /&gt;
&lt;br /&gt;
==Anwendungsspezifisches==&lt;br /&gt;
Für eine Anwendung kann Frustum Culling sehr ähnlich wie eine Kollisionsabfrage behandelt werden. Meist wird hier keine exakte Kollisionsabfrage durchgeführt (wie es beispielsweise mit dem Seperation Axis - Algorithmus gemacht werden könnte), sondern es wird lediglich eine eher pessimistische Variante verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:FurstumKollision.GIF]]&lt;br /&gt;
&lt;br /&gt;
''Frustum von oben''&lt;br /&gt;
&lt;br /&gt;
''Links: Eine Kugel die bei der pessimistischen Variante als teilweise innerhalb erkannt wird tatsächlich jedoch ausserhalb liegt.''&lt;br /&gt;
&lt;br /&gt;
''Rechts: Vergleich pessimistische und exakte Kollisionsabfrage mit einer Kugel.''&lt;br /&gt;
&lt;br /&gt;
Für die pessimistische Variante benötigen wir lediglich die 6 Ebenengleichungen des [[Frustum]]s. Danach prüfen wir, ob ein Objekt komplett oder teilweise ausserhalb eines der 6 Halbräume ist, also ob sich das Objekt hinter der entsprechenden Ebene befindet. Nun gibt es 3 Möglichkeiten:&lt;br /&gt;
# Objekt komplett hinter mindestens einer Ebene =&amp;gt; Objekt überhaupt nicht sichtbar.&lt;br /&gt;
# Objekt vor allen 6 Ebenen =&amp;gt; Objekt komplett sichtbar&lt;br /&gt;
# Objekt mindestens durch eine Ebene teilweise &amp;quot;abgeschnitten&amp;quot;, also weder davor noch dahinter.&lt;br /&gt;
Im 3. Fall hängt es nun davon ab ob wir eine hierarchische Abfrage durchführen wollen. Also beispielsweise:&lt;br /&gt;
* Ein [[Octree]] wo jeder Würfel in bis zu 8 kleinere unterteilt werden kann.&lt;br /&gt;
* Gruppen von Objekten (beispielsweise ein Sonnensystem bildet eine Gruppe), wo die einzelnen Objekte noch getrennt abgefragt werden können.&lt;br /&gt;
* Der Extremfall wäre das man jedes Dreieck eines Objektes untersucht (was beispielsweise für Raytracer sinnvoll sein ''könnte'').&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun einen hierarchischen Aufbau besitzen, so bedeutet der 3. Fall, dass wir eine Hierarchiestufe weiter nach unten gehen müssen um die Objekte oder Volumen dieser Stufe zu testen.&lt;br /&gt;
&lt;br /&gt;
Wenn wir keinen hierarchischen Aufbau (oder keine weitere Hierarchiestufe mehr) besitzen, so muss natürlich das gesamte Objekt - bzw. alle Dreiecke die sich innerhalb des geprüften Volumen befinden - gezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Angemerkt sei noch, dass &amp;quot;vor&amp;quot; und &amp;quot;hinter&amp;quot; der Ebene natürlich vom Normalvektor (der für die Ebenengleichung verwendet wird) abhängig ist. Hier wird davon ausgegangen, dass die Normalvektoren in das innere des [[Frustum]]s zeigen.&lt;br /&gt;
&lt;br /&gt;
Je nach Objekttyp lässt sich verhältnismäßig einfach Prüfen ob das Objekt hinter oder vor einer Ebene ist:&lt;br /&gt;
*'''Punkt:''' prüfen ob die Ebenengleichung ein positives oder negatives Ergebnis liefert.&lt;br /&gt;
*'''Kugel:''' liefert die Ebenengleichung (mit einem normierten [[Normale|Normalvektor]]) für das Zentrum der Kugel einen absoluten Wert (Vorzeichen weg lassen) der kleiner als der Radius der Kugel ist, so schneidet die Kugel die Ebene. Ansonnsten wird gleich wie bei einem Punkt verfahren.&lt;br /&gt;
*'''Quader:''' liefern manche Eckpunte ein positives Ergebnis und andere ein Negatives wenn man sie in die Ebenengleichung einsetzt, so schneidet der Quader die Ebene. Liefern alle Punkte ein positives, oder alle Punkte ein negatives Ergebnis, so liegt der Quader gänzlich vor bzw. hinter der Ebene.&lt;br /&gt;
*'''Dreieck:''' gleich wie bei einem Quader werden einfach alle Eckpunkte betrachtet, hier natürlich nur 3 statt 8 Eckpunkte.&lt;br /&gt;
&lt;br /&gt;
==Hardwareunterstützung==&lt;br /&gt;
===Standard===&lt;br /&gt;
[[OpenGL]] teilt automatisch alle Dreiecke welche nicht oder nur teilweise sichtbar sind in einen sichtbaren und eine nicht sichtbaren Bereich ein. Es wird dann nur noch der sichtbare Bereich gezeichnet, oder ggf. natürlich auch gar nichts gezeichnet wenn das Dreieck komplett ausserhalb des [[Frustum]]s liegt. Siehe auch: [[Clipping Plane]].&lt;br /&gt;
&lt;br /&gt;
===[[GL ARB occlusion query|Occlusion Query]] Extension===&lt;br /&gt;
Die Extension [[GL ARB occlusion query]] bietet die Möglichkeit abzufragen wieviele [[Pixel]] gezeichnet wurden. Diese Extension wird häufig für Sichtbarkeitsabfragen verwendet, indem man bevor man ein komplexeres Objekt zeichnet nur dessen Bounding Volumen (meist einen Quader) zeichnet und prüft ob davon ein [[Pixel]] auf den Bildschirm landen würde. Ein netter Nebeneffekt an diesen Sichtbarkeitsabfragen ist natürlich, dass auch alle Dreiecke die ausserhalb des [[Frustum]]s liegen keine [[Pixel]] auf den Bildschirm bringen, somit kann man beide Test vereinen. Es kann aber natürlich dennoch hilfreich sein wenn man selbst diese einfacheren Tests etwas gruppiert, um so größere Bereiche die weg fallen gleich von der CPU erkennen zu lassen. Vor allem sehr große Bereiche werden von diesem Test auch nicht erkannt. Man stelle sich hierfür einen Quader vor, der den gesamte [[Frustum]] beinhaltet. Dieser würde ebenfalls kein einziges [[Pixel]] auf dem Bildschirm &amp;quot;wert&amp;quot; sein.&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
[[Frustum]], [[Clipping Plane]]&lt;br /&gt;
&lt;br /&gt;
=Ressourcen=&lt;br /&gt;
[http://delphigl.de/tutorials/frustumcull_de.html Sehr nützliches Tutorial zum Thema Frustum Culling]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:FurstumKollision.GIF&amp;diff=17956</id>
		<title>Datei:FurstumKollision.GIF</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:FurstumKollision.GIF&amp;diff=17956"/>
				<updated>2006-05-21T03:35:55Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Kollisionsabfrage einer Kugel mit der Viewfrustum und Problemfall dabei. Und Vergleich zwischen exakter und pessimistischer Kollisionsabfrage.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kollisionsabfrage einer Kugel mit der Viewfrustum und Problemfall dabei. Und Vergleich zwischen exakter und pessimistischer Kollisionsabfrage.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Dijkstra&amp;diff=17133</id>
		<title>Dijkstra</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Dijkstra&amp;diff=17133"/>
				<updated>2006-04-09T04:46:46Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Erstellung des Graphen */ Fehler im Algorithmus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dijkstra ist eine spezielle Form des Pathfinding. Hier geht es darum, für beliebig viele Agenten (oder &amp;quot;interessierte&amp;quot; computergesteuerte Einheiten) den kürzesten Weg zu einem bestimmten Ziel zu finden. Dieser Algorithmus ähnelt sehr dem Sprichwort: &amp;quot;Alle Wege führen nach Rom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise=&lt;br /&gt;
Ausgehend von Rom (oder einem beliebigen anderen Zielort) erhält ein Graph in alle Richtungen die Kostenangaben (bzw. die Anzahl der Knoten die durchlaufen wurden). Dieser rekursive Vorgang wird so lange durchgeführt bis alle Knoten die Kosten zum Ziel besitzen. Wenn man nun von einem konkreten Knoten zu dem vorgegebenen Ziel möchte, so muss man sich nur den Nachbarknoten mit dem geringsten Wert raus suchen.&lt;br /&gt;
&lt;br /&gt;
=Algorithmus=&lt;br /&gt;
==Erstellung des Graphen==&lt;br /&gt;
Für diesen Algorithmus müssen die &amp;quot;Kosten_zum_Ziel&amp;quot;-Werte für alle Knoten mit dem maximalen Wert initialisiert werden (zB FFFF Hex für 16 Bit Integer ohne Vorzeichen).&lt;br /&gt;
 Dijkstra( Knoten Aktuell, Integer Bisherige_Kosten )&lt;br /&gt;
   Wenn Bisherige_Kosten + Kosten( Aktuell, K ) &amp;lt; K.Kosten_zum_Ziel&lt;br /&gt;
     K.Kosten_zum_Ziel = Bisherige_Kosten + Kosten( Aktuell, K )&lt;br /&gt;
 &lt;br /&gt;
   Wenn Knoten Aktuell bisher noch nicht besucht wurde&lt;br /&gt;
     Für K=alle Nachbarknoten von Aktuell&lt;br /&gt;
       Dijkstra( K, Bisherige_Kosten + Kosten( Aktuell, K ) )&lt;br /&gt;
Die Abfrage &amp;quot;Knoten Aktuell bisher noch nicht besucht&amp;quot; kann entweder über einen eigenen boolean-Wert überprüft werden, oder aber durch einen speziellen Wert für die &amp;quot;Kosten_zum_Ziel&amp;quot; welcher maximial initialisiert wurde, also beispielsweise bei einem 16 Bit Integer ohne Vorzeichen mit FFFF Hex.&lt;br /&gt;
&lt;br /&gt;
Die Erstellung des Graphen benötigt eine Laufzeit von [[O-Notation|O]](n^2) wobei n die Anzahl der Knoten ist. Der Speicherbedarf für diesen Algorithmus (sowohl zur Generierung als auch die fertig generierte Tabelle) ist [[O-Notation|O]](n).&lt;br /&gt;
&lt;br /&gt;
==Suchen eines Weges==&lt;br /&gt;
Zum suchen eines Weges von einem gegebenen Startpunkt zum Ziel muss man wie bereits erwähnt für jeden Knoten den Nachbarknoten suchen, welcher am nähesten beim Ziel liegt. Dies geschieht folgendermaßen:&lt;br /&gt;
 Suche_Weg( Knoten Aktuell )&lt;br /&gt;
   Wenn Aktuell.Kosten_zum_Ziel = 0&lt;br /&gt;
     Ziel gefunden&lt;br /&gt;
 &lt;br /&gt;
   Für K = Knoten mit den geringsten Kosten_zum_Ziel&lt;br /&gt;
     Suche_Weg( K )&lt;br /&gt;
Dieser Algorithmus besitzt eine maximale Laufzeit von [[O-Notation|O]](t*v) wobei t die Tiefe (oder Entfernung) in Knoten des Zieles vom Startpunkt ist, und v der durchschnittliche Verzweigungsgrad des Graphen. Der Speicherbedarf für diesen Algorithmus ist im Idealfall [[O-Notation|O]](1) bzw. O(t) um den gesamten Pfad vom Start bis zum Ziel zu speichern, jedoch benötigt man natürlich die Tabelle von vorher welche einen Speicherbedarf von [[O-Notation|O]](n) besitzt.&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=16885</id>
		<title>Kategorie Diskussion:Exzellent</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Kategorie_Diskussion:Exzellent&amp;diff=16885"/>
				<updated>2006-04-07T15:14:46Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Kandidatenliste */ glBegin Kommentar &amp;amp; Stimme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Vorraussetzungen für Exzellente Artikel=&lt;br /&gt;
Hier könnt ihr Artikel vorschlagen welche ihr als &amp;quot;exzellenten Artikel&amp;quot; einstufen würdet.&lt;br /&gt;
&lt;br /&gt;
Folgende Punkte '''müssen''' erfüllt sein:&lt;br /&gt;
* Kein Sackgassenartikel - Artikel muss auf andere Artikel direkt (nicht über Code) verlinken&lt;br /&gt;
* Kein Plain Text - Artikel muss eine einheitliche Formatierung aufweisen&lt;br /&gt;
* Bilder - Artikel muss mindestens ein Bild/Grafik besitzen&lt;br /&gt;
* Vollständig - Der Artikel muss das Thema umfassend behandeln&lt;br /&gt;
* Kein Tutorial - Der Artikel darf nicht der [[:Kategorie:Tutorial|Kategorie Tutorial]] angehören.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit ein Artikel als '''exezellent''' eingestuft wird müssen:&lt;br /&gt;
* 5 Wiki-User der Wahl zustimmen darunter mindestens ein Moderator,&lt;br /&gt;
* keine Gegenstimmen bestehen,&lt;br /&gt;
* die Vorraussetzungen von oben gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=Kandidatenliste=&lt;br /&gt;
Um einen Artikel zur Kandidatenliste hinzuzufügen bitte den Nachfolgenden Code vor dem Ende (&amp;quot;&amp;lt;nowiki&amp;gt;|}&amp;lt;/nowiki&amp;gt;&amp;quot;) der Tabelle einfügen:&lt;br /&gt;
&lt;br /&gt;
 |&amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
Um eine Stimme abzugeben, kopiert ihr bitte den Wiki-Code &amp;quot;&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&amp;quot; in die entsprechende Spalte. Das Wiki generiert daraus eure Unterschrift (Signatur).&lt;br /&gt;
&lt;br /&gt;
Falls ihr eine Gegenstimme abgebt, muss eine Begründung dazu gegeben werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Vorgeschlagener Artikel&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Beführworter&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;|Gegner&lt;br /&gt;
!width=&amp;quot;45%&amp;quot;|Begründung für Gegenstimme / Diskussion&lt;br /&gt;
|-&lt;br /&gt;
|[[Skybox]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Wenn hier noch jemand ein Codebeispiel liefern könnte wäre der Artikel auch Excellent. So ist er etwas Kurz. (Kriterium der Vollständigkeit ;))&lt;br /&gt;
|-&lt;br /&gt;
|[[glBegin]]&lt;br /&gt;
| --[[Benutzer:Lyr|Lyr]] 17:14, 7. Apr 2006 (CEST)&lt;br /&gt;
| &lt;br /&gt;
| Dieser Artikel wäre sicherlich auch ein Kandidat. Was mich bei ihm noch etwas zögerlich stimmt ist die Beschreibung. Diese ist realtiv weit weg vom Orginal. Das ist nicht sodnerlich schlimm, nur muss halt sichergestellt werden, dass alle Infos der orginal Spezifikation enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Scheint mir (zumindest was OGL 1.1 betrifft) vollständ und sieht auch ganz nett aus.&lt;br /&gt;
|-&lt;br /&gt;
|[[DelphiGL]]&lt;br /&gt;
| --[[Benutzer:Luketheduke|luketheduke]] 12:06, 2. Apr 2006 (CEST)&lt;br /&gt;
| --[[Benutzer:Flash|Flash]] 17:37, 2. Apr 2006 (CEST)&lt;br /&gt;
| Meine Gegenstimme, weil die Anfänge der Historie noch immer nicht vernünftig reingeschrieben wurden. Anonsten bin ich natürlich auch Fan des Artikels. ;)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswahlkriterien ==&lt;br /&gt;
&lt;br /&gt;
Ich finde die Asuwahlkriterien etwas strange. Schließlich sind Tutorials auch Artikel und in den meisten Fällen noch dazu ziemlich gute. Warum sollten diese also ausgeschlossen werden? Vermitteln ja schließlich meist recht anschaulich viel Information. Also exakt das, was nen guten Artikel ausmacht.&lt;br /&gt;
--[[Benutzer:Frase|Frase]] 18:48, 18. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tutorials sind einzelarbeiten die von einer Person gemacht wurden und die eigentlich auch nur von dieser zu Verantworten/Verbessern sind. Die Auszeichnung soll gerade dafür sorgen die &amp;quot;graue Maus&amp;quot; Artikel aufzuwerten. Das unsere Tutorials alle Exzellent sind steht außer Frage. Die Auszeichnung heißt aber nicht um sonst &amp;quot;Exzellente Artikel&amp;quot; und nicht &amp;quot;Exzellente Tutorials&amp;quot;. Außerdem soll die Auzeichnung erreichen, dass die Nutzer einfach mal ins Wiki reinlesen. Tutorials sind in sich geschlossen und verlinken kaum auf andere Artikel. Sie behandeln ein Thema, und das ist gut so.&lt;br /&gt;
--[[Benutzer:Flash|Flash]] 01:11, 19. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und es kann die Leute animieren die Artikel den Kritierie anzupassen bzw. eigene Artikel einzustellen.&lt;br /&gt;
So hat es zumindest bei mir funktioniert. Ich habe jetzt sogar Bilder! :lol:&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 04:35, 19. Mär 2006 (CET)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

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

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=16858</id>
		<title>glBegin</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=16858"/>
				<updated>2006-04-07T13:31:30Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Beschreibung */ Kleiner Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glBegin, glEnd =&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glBegin, glEnd''' - Umschliessen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher [[Primitiv]]en.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glBegin'''(''mode'' : GLEnum);&lt;br /&gt;
 procedure '''glEnd''';&lt;br /&gt;
&lt;br /&gt;
== 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 valign=&amp;quot;top&amp;quot; width=&amp;quot;80px&amp;quot;&amp;gt;&lt;br /&gt;
''mode''&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Bestimmt die [[Primitive]] bzw. Gruppe von [[Primitive|Primitiven]] die aus den von '''glBegin''' und '''glEnd''' umschlossenen [[Eckpunkt|Eckpunkten (Vertices)]] erstellt werden.&lt;br /&gt;
Erlaubt sind hier die folgenden zehn symbolischen Konstanten :&lt;br /&gt;
'''GL_POINTS''', '''GL_LINES''', '''GL_LINE_STRIP''', '''GL_LINE_LOOP''', '''GL_TRIANGLES''', '''GL_TRIANGLE_STRIP''', '''GL_TRIANGLE_FAN''', '''GL_QUADS''', '''GL_QUAD_STRIP''', und '''GL_POLYGON'''.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glBegin''' und '''glEnd''' umschliessen eine Liste von [[Eckpunkt|Eckpunkten (Vertices)]] die eine [[Primitive]] oder Gruppe von [[Primitive|Primitiven]] darstellt. '''glBegin''' erhält ein einzelnes Argument (''mode'') das angibt auf welche Art und Weise die [[Eckpunkt|Eckpunkte (Vertices)]] interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Unter der Annahme ''n'' sei ein Integerwert der bei Eins beginnt und ''N'' als Integerwert der die Gesamtanzahl der übergebenen Eckpunkte angibt, ergeben sich folgende Interpretationen :&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!mode&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Einschätzung&lt;br /&gt;
!Bild&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POINTS'''&lt;br /&gt;
|Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt ''n'' definiert Punkt ''n'', und ''N'' Punkte werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|langsam&lt;br /&gt;
|[[Bild:Glbegin_points.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINES'''&lt;br /&gt;
|Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*''n''-1 und 2*''n'' beschreiben Linie n. N/2 Linien werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|mittel&lt;br /&gt;
|[[Bild:Glbegin_lines.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_STRIP'''&lt;br /&gt;
|Rendert eine Gruppe von miteinander verbundenen Liniensegmenten, beginnend beim ersten Eckpunkt bis zum letzten. Eckpunkte ''n'' und ''n+1'' beschreiben dabei Linie ''n''. ''N-1'' Linien werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_linestrip.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_LOOP'''&lt;br /&gt;
|Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschliessend zurück zum ersten. Eckpunkte ''n'' und ''n+1'' definieren Linie ''n''. Die letzte Linie wird jedoch durch die Eckpunkte ''N'' und 1 definiert. ''N'' Linien werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_lineloop.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLES'''&lt;br /&gt;
|Behandelt jedes Eckpunkt-Trio als unabhängiges Dreieck. Eckpunkte 3*''n''-2, 3*''n''-1 und 3*''n'' beschreiben Dreieck ''n''. ''N''/3 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke bestehen aus jeweils 3 Vertices, die ausschließlich nur zu diesem Dreieck gehören.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_triangles.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_STRIP'''&lt;br /&gt;
|Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt der nach den beiden ersten Eckpunkten definiert wird gerendert. Für ein ungerades ''n'' definieren die Eckpunkte ''n'', ''n''+1 und ''n''+2 Dreieck ''n'', für gerade ''n''s definieren die Eckpunkte ''n''+1, ''n'' und ''n''+2 ein Dreieck. ''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|am schnellsten&lt;br /&gt;
|[[Bild:Glbegin_trianglestrip.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_FAN'''&lt;br /&gt;
|Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt gerendert der nach den ersten beiden definiert wird. Eckpunkte 1, ''n''+1 und ''n''+2 definieren Dreieck ''n''. ''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke haben mindestens einen gemeinsamen Punkt (Vertex1).&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_trianglefan.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUADS'''&lt;br /&gt;
|Behandelt jeweils vier Eckpunkte als unabhängiges Viereck. Eckpunkte 4*''n''-3, 4*''n''-2, 4*''n''-1 und 4*''n'' beschreiben Viereck ''n''. ''N''/4 Vierecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Vierecke bestehen aus jeweils 4 Vertices, die ausschließlich nur zu diesem Viereck gehören.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_quads.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUAD_STRIP'''&lt;br /&gt;
|Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*''n''-1, 2*''n'', 2*''n''+2 und 2*''n''+1 beschreiben Viereck ''n''. ''N''/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, das die Reihenfolge der Eckpunkte die genutzt werden um Vierecke aus einem Streifen zu generieren unterschiedlich ggü. der unabhängigen Konstruktion sind.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Vierecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Vierecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_quadstrip.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POLYGON'''&lt;br /&gt;
|Rendert eine einzelnes, [[konvex|konvexes]] Polygon (=Vieleck). Eckpunkte 1 bis ''N'' definieren dieses Polygon.&lt;br /&gt;
{{Hinweis|GL_POLYGON scheint für Anfänger meist die &amp;quot;beste Lösung&amp;quot; zu sein, denn man kann alle möglichen (konvexen) Polygone erzeugen. Dies ist soweit richtig, allerdings ist GL_POLYGON um ein vielfaches langsamer als GL_TRIANGLES! Dies hat die folgenden Gründe: &amp;lt;br&amp;gt;&lt;br /&gt;
1. sind moderne Grafikkarten auf die Darstellung von Dreiecken optimiert und &amp;lt;br&amp;gt;&lt;br /&gt;
2. müssen die Polygone bevor sie von den Grafikkarten verwendet werden können, erst in Dreiecke zerlegt werden (siehe [[Triangulation]]). &amp;lt;br&amp;gt;&lt;br /&gt;
Vorallem der letzte Punkt sorgt für niedrige Frameraten im Vergleich zu dreiecksbasierten Strukturen.}}&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|langsam&lt;br /&gt;
|[[Bild:Glbegin_polygon.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nur eine Untergruppe von GL Befehlen kann zwischen '''glBegin''' und '''glEnd''' genutzt werden. Die Befehle sind [[glVertex]], [[glColor]], [[glIndex]], [[glNormal]], [[glTexCoord]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], und [[glEdgeFlag]]. Ausserdem ist es erlaubt  [[glCallList]] oder [[glCallLists]] zu nutzen um [[Displaylisten]] auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen '''glBegin''' und '''glEnd''' ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert.&lt;br /&gt;
&lt;br /&gt;
Unabhängig des für ''mode'' übergebenen Wertes gibt es '''keine''' Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen '''glBegin''' und '''glEnd''' definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügenden beschrieben wurden werden nicht gerendert.&lt;br /&gt;
Ungenügende Beschreibung bedeutet entweder dass zu wenige Eckpunkte angegeben wurden um eine einzelne [[Primitive]] zu beschreiben, oder ein inkorrektes Vielfaches and Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet.&lt;br /&gt;
&lt;br /&gt;
Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt :&lt;br /&gt;
*1 für einen Punkt&lt;br /&gt;
*2 für eine Linie&lt;br /&gt;
*3 für ein Dreieck&lt;br /&gt;
*4 für ein Viereck und &lt;br /&gt;
*3 für ein Polygon. &lt;br /&gt;
Modi die ein festgelegtes Vielfaches an Eckpunkten brauchen sind '''GL_LINES''' (2), '''GL_TRIANGLES''' (3), '''GL_QUADS''' (4), und '''GL_QUAD_STRIP''' (2).&lt;br /&gt;
&lt;br /&gt;
Wenn Flächen gemeinsame Punkte haben (z.B. bei '''GL_TRIANGLE_FAN''') ist es nicht möglich die Eigenschaften dieser Vertices für jede Fläche individuell zu bestimmen. Wenn dies nötig sein sollte, müssen die entsprechenden Flächen aus individuellen Vertices zusammengestellt werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_ENUM''' wird ausgelöst wenn ''mode'' einen ungültigen Wert besitzt.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn zwischen '''glBegin''' und dem zugehörigen '''glEnd''' ein weiteres '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn '''glEnd''' ohne ein vorhergehendes '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird aufgerufen, wenn ein anderer Befehl als [[glVertex]], [[glColor]], [[glIndex]], [[glNormal]], [[glTexCoord]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], [[glEdgeFlag]], [[glCallList]], oder [[glCallLists]] zwischen '''glBegin''' und dem zugehörigen '''glEnd''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]],  [[glPushClientAttrib]],  [[glPopClientAttrib]], [[glEdgeFlagPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glInterleavedArrays]], oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst.&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&amp;lt;pascal&amp;gt;glBegin(GL_TRIANGLES);&lt;br /&gt;
    glVertex3f(1,0,0);&lt;br /&gt;
    glVertex3f(0,1,0);&lt;br /&gt;
    glVertex3f(0,0,1);&lt;br /&gt;
glEnd;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen glBegin und glEnd können natürlich auch &amp;quot;nicht OpenGL&amp;quot;-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;glBegin(GL_LINE_STRIP);&lt;br /&gt;
  for i:=0 to 50 do&lt;br /&gt;
   begin&lt;br /&gt;
    glVertex3f(0,i,sin(i/50)*20);&lt;br /&gt;
   end;&lt;br /&gt;
glEnd;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glArrayElement]], [[glCallList]], [[glCallLists]], [[glColor]], [[glEdgeFlag]], [[glEvalCoord]], [[glEvalPoint]], [[glIndex]], [[glMaterial]], [[glNormal]], [[glTexCoord]], [[glVertex]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|Begin]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=16856</id>
		<title>glBegin</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=glBegin&amp;diff=16856"/>
				<updated>2006-04-07T13:19:57Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Fehlermeldungen */ + glPushClientAttrib; + glPopClientAttrib&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= glBegin, glEnd =&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
'''glBegin, glEnd''' - Umschliessen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher [[Primitiv]]en.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delphi-Spezifikation ==&lt;br /&gt;
 procedure '''glBegin'''(''mode'' : GLEnum);&lt;br /&gt;
 procedure '''glEnd''';&lt;br /&gt;
&lt;br /&gt;
== 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 valign=&amp;quot;top&amp;quot; width=&amp;quot;80px&amp;quot;&amp;gt;&lt;br /&gt;
''mode''&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Bestimmt die [[Primitive]] bzw. Gruppe von [[Primitive|Primitiven]] die aus den von '''glBegin''' und '''glEnd''' umschlossenen [[Eckpunkt|Eckpunkten (Vertices)]] erstellt werden.&lt;br /&gt;
Erlaubt sind hier die folgenden zehn symbolischen Konstanten :&lt;br /&gt;
'''GL_POINTS''', '''GL_LINES''', '''GL_LINE_STRIP''', '''GL_LINE_LOOP''', '''GL_TRIANGLES''', '''GL_TRIANGLE_STRIP''', '''GL_TRIANGLE_FAN''', '''GL_QUADS''', '''GL_QUAD_STRIP''', und '''GL_POLYGON'''.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beschreibung == &lt;br /&gt;
'''glBegin''' und '''glEnd''' umschliessen eine Liste von [[Eckpunkt|Eckpunkten (Vertices)]] die eine [[Primitive]] oder Gruppe von [[Primitive|Primitiven]] darstellt. '''glBegin''' erhält ein einzelnes Argument (''mode'') das angibt auf welche Art und Weise die [[Eckpunkt|Eckpunkte (Vertices)]] interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Unter der Annahme ''n'' sei ein Integerwert der bei Eins beginnt und ''N'' als Integerwert der die Gesamtanzahl der übergebenen Eckpunkte angibt, ergeben sich folgende Interpretationen :&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable_B1}}&lt;br /&gt;
!mode&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Einschätzung&lt;br /&gt;
!Bild&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POINTS'''&lt;br /&gt;
|Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt ''n'' definiert Punkt ''n'', und ''N'' Punkte werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|langsam&lt;br /&gt;
|[[Bild:Glbegin_points.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINES'''&lt;br /&gt;
|Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*''n''-1 und 2*''n'' beschreiben Linie n. N/2 Linien werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|mittel&lt;br /&gt;
|[[Bild:Glbegin_lines.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_STRIP'''&lt;br /&gt;
|Rendert eine Gruppe von miteinander verbundenen Liniensegmenten, beginnend beim ersten Eckpunkt bis zum letzten. Eckpunkte ''n'' und ''n+1'' beschreiben dabei Linie ''n''. ''N-1'' Linien werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_linestrip.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_LINE_LOOP'''&lt;br /&gt;
|Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschliessend zurück zum ersten. Eckpunkte ''n'' und ''n+1'' definieren Linie ''n''. Die letzte Linie wird jedich durch die Eckpunkte ''N'' und 1 definiert. ''N'' Linien werden gerendert.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_lineloop.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLES'''&lt;br /&gt;
|Behandelt jedes Eckpunkt-Trio als unabhängiges Dreieck. Eckpunkte 3*''n''-2, 3*''n''-1 und 3*''n'' beschreiben Dreieck ''n''. ''N''/3 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke bestehen aus jeweils 3 Vertices, die ausschließlich nur zu diesem Dreieck gehören.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_triangles.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_STRIP'''&lt;br /&gt;
|Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt der nach den beiden ersten Eckpunkten definiert wird gerendert. Für ein ungerades ''n'' definieren die Eckpunkte ''n'', ''n''+1 und ''n''+2 Dreieck ''n'', für gerade ''n''s definieren die Eckpunkte ''n''+1, ''n'' und ''n''+2 ein Dreieck. ''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|am schnellsten&lt;br /&gt;
|[[Bild:Glbegin_trianglestrip.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_TRIANGLE_FAN'''&lt;br /&gt;
|Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt gerendert der nach den ersten beiden definiert wird. Eckpunkte 1, ''n''+1 und ''n''+2 definieren Dreieck ''n''. ''N''-2 Dreiecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Dreiecke haben mindestens einen gemeinsamen Punkt (Vertex1).&lt;br /&gt;
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_trianglefan.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUADS'''&lt;br /&gt;
|Behandelt jeweils vier Eckpunkte als unabhängiges Viereck. Eckpunkte 4*''n''-3, 4*''n''-2, 4*''n''-1 und 4*''n'' beschreiben Viereck ''n''. ''N''/4 Vierecke werden gerendert.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Alle Vierecke bestehen aus jeweils 4 Vertices, die ausschließlich nur zu diesem Viereck gehören.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|schnell&lt;br /&gt;
|[[Bild:Glbegin_quads.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_QUAD_STRIP'''&lt;br /&gt;
|Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*''n''-1, 2*''n'', 2*''n''+2 und 2*''n''+1 beschreiben Viereck ''n''. ''N''/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, das die Reihenfolge der Eckpunkte die genutzt werden um Vierecke aus einem Streifen zu generieren unterschiedlich ggü. der unabhängigen Konstruktion sind.&lt;br /&gt;
&lt;br /&gt;
'''Eigenschaften''':&lt;br /&gt;
* Nacheinander erstellte Vierecke haben eine gemeinsame Kante.&lt;br /&gt;
* Nacheinander erstellte Vierecke benutzen 2 gemeinsame Vertices.&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|sehr schnell&lt;br /&gt;
|[[Bild:Glbegin_quadstrip.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|'''GL_POLYGON'''&lt;br /&gt;
|Rendert eine einzelnes, [[konvex|konvexes]] Polygon (=Vieleck). Eckpunkte 1 bis ''N'' definieren dieses Polygon.&lt;br /&gt;
{{Hinweis|GL_POLYGON scheint für Anfänger meist die &amp;quot;beste Lösung&amp;quot; zu sein, denn man kann alle möglichen (konvexen) Polygone erzeugen. Dies ist soweit richtig, allerdings ist GL_POLYGON um ein vielfaches langsamer als GL_TRIANGLES! Dies hat die folgenden Gründe: &amp;lt;br&amp;gt;&lt;br /&gt;
1. sind moderne Grafikkarten auf die Darstellung von Dreiecken optimiert und &amp;lt;br&amp;gt;&lt;br /&gt;
2. müssen die Polygone bevor sie von den Grafikkarten verwendet werden können, erst in Dreiecke zerlegt werden (siehe [[Triangulation]]). &amp;lt;br&amp;gt;&lt;br /&gt;
Vorallem der letzte Punkt sorgt für niedrige Frameraten im Vergleich zu dreiecksbasierten Strukturen.}}&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|langsam&lt;br /&gt;
|[[Bild:Glbegin_polygon.jpg|350px|thumb|right]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nur eine Untergruppe von GL Befehlen kann zwischen '''glBegin''' und '''glEnd''' genutzt werden. Die Befehle sind [[glVertex]], [[glColor]], [[glIndex]], [[glNormal]], [[glTexCoord]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], und [[glEdgeFlag]]. Ausserdem ist es erlaubt  [[glCallList]] oder [[glCallLists]] zu nutzen um [[Displaylisten]] auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen '''glBegin''' und '''glEnd''' ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert.&lt;br /&gt;
&lt;br /&gt;
Unabhängig des für ''mode'' übergebenen Wertes gibt es '''keine''' Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen '''glBegin''' und '''glEnd''' definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügenden beschrieben wurden werden nicht gerendert.&lt;br /&gt;
Ungenügende Beschreibung bedeutet entweder dass zu wenige Eckpunkte angegeben wurden um eine einzelne [[Primitive]] zu beschreiben, oder ein inkorrektes Vielfaches and Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet.&lt;br /&gt;
&lt;br /&gt;
Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt :&lt;br /&gt;
*1 für einen Punkt&lt;br /&gt;
*2 für eine Linie&lt;br /&gt;
*3 für ein Dreieck&lt;br /&gt;
*4 für ein Viereck und &lt;br /&gt;
*3 für ein Polygon. &lt;br /&gt;
Modi die ein festgelegtes Vielfaches an Eckpunkten brauchen sind '''GL_LINES''' (2), '''GL_TRIANGLES''' (3), '''GL_QUADS''' (4), und '''GL_QUAD_STRIP''' (2).&lt;br /&gt;
&lt;br /&gt;
Wenn Flächen gemeinsame Punkte haben (z.B. bei '''GL_TRIANGLE_FAN''') ist es nicht möglich die Eigenschaften dieser Vertices für jede Fläche individuell zu bestimmen. Wenn dies nötig sein sollte, müssen die entsprechenden Flächen aus individuellen Vertices zusammengestellt werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlermeldungen ==&lt;br /&gt;
'''GL_INVALID_ENUM''' wird ausgelöst wenn ''mode'' einen ungültigen Wert besitzt.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn zwischen '''glBegin''' und dem zugehörigen '''glEnd''' ein weiteres '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn '''glEnd''' ohne ein vorhergehendes '''glBegin''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
'''GL_INVALID_OPERATION''' wird aufgerufen, wenn ein anderer Befehl als [[glVertex]], [[glColor]], [[glIndex]], [[glNormal]], [[glTexCoord]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], [[glEdgeFlag]], [[glCallList]], oder [[glCallLists]] zwischen '''glBegin''' und dem zugehörigen '''glEnd''' aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]],  [[glPushClientAttrib]],  [[glPopClientAttrib]], [[glEdgeFlagPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glInterleavedArrays]], oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst.&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&amp;lt;pascal&amp;gt;glBegin(GL_TRIANGLES);&lt;br /&gt;
    glVertex3f(1,0,0);&lt;br /&gt;
    glVertex3f(0,1,0);&lt;br /&gt;
    glVertex3f(0,0,1);&lt;br /&gt;
glEnd;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen glBegin und glEnd können natürlich auch &amp;quot;nicht OpenGL&amp;quot;-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;glBegin(GL_LINE_STRIP);&lt;br /&gt;
  for i:=0 to 50 do&lt;br /&gt;
   begin&lt;br /&gt;
    glVertex3f(0,i,sin(i/50)*20);&lt;br /&gt;
   end;&lt;br /&gt;
glEnd;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[glArrayElement]], [[glCallList]], [[glCallLists]], [[glColor]], [[glEdgeFlag]], [[glEvalCoord]], [[glEvalPoint]], [[glIndex]], [[glMaterial]], [[glNormal]], [[glTexCoord]], [[glVertex]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:GL|Begin]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:OpenGL-Funktions%C3%BCbersicht&amp;diff=16801</id>
		<title>Diskussion:OpenGL-Funktionsübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:OpenGL-Funktions%C3%BCbersicht&amp;diff=16801"/>
				<updated>2006-04-05T00:07:07Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Versionskritik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DGLOpenGL.pas ==&lt;br /&gt;
In der DGLOpenGL.pas sind mehr als 1200 &amp;quot;GL&amp;quot; Funktionen eingetragen!!!&lt;br /&gt;
Das heißt jetzt aber nicht das wir im Wiki noch 1000 Funktionen beschreiben müssen da viele Funktionen in der DGLOpenGL.pas sich nur durch die Parameter unterscheiden. Allerdings dürfte das verdammt viel Arbeit sein die OpenGL Funktioen &amp;quot;von Hand&amp;quot; zu vergleichen ob sie im Wiki sind oder nicht. Darum würde ich vorschlagen dies von einem Programm machen zu lassen.&lt;br /&gt;
&lt;br /&gt;
MfG&lt;br /&gt;
Flo&lt;br /&gt;
----&lt;br /&gt;
Also ich kenn mich mit PHP net gut genug aus, um hier nen Parser zu schreiben. Sicherlich einfacher wärs direkt die Datenbank abzugrasen. Aber ich glaube bei meinem Wiki gesehn zu haben, dass in den DB-Spalten die gesamten Zeilen als Wikicode gespeichert sind. Parsen muss man also wahrscheinlich immer. Die Idee vom Programm ansich ist aber durchaus gut. Das Programm müsste dann also Bot-Like die Funktionsübersicht updaten.&lt;br /&gt;
--[[Benutzer:Flash (Kevin Fleischer)|Flash (Kevin Fleischer)]] 18:50, 24. Apr 2005 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welche Funktionen wollen wir im Wiki auflisten? ==&lt;br /&gt;
&lt;br /&gt;
In der DGLOpenGL.pas stehen OpenGL Funktionen mit den verschiedensten Endungen wie: ARB, EXT, ATI, NV, SGIS, APPLE, SUN und MESA. Welche davon sollen wir bei GL auflisten?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Alle. Die ARB und EXT können direkt bei den GL Funktionen (wenns denn glXxxxARB sind) eingetragen werden. Die Herstellerspezifischen haben ne Extrakategorie am Ende der Seite. Sollten aber erstmal weniger Priorität haben. Wichtig ist erstmal der GL-Kern + die fast zum Kern gehören.&lt;br /&gt;
--[[Benutzer:Flash (Kevin Fleischer)|Flash (Kevin Fleischer)]] 18:50, 24. Apr 2005 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Versionskritik ==&lt;br /&gt;
glDeleteTextures ... wirklich erst ab 1.1? GenTextures (das Gegenstück) war ja wie ich meinen möchte bereits in 1.0 drinnen, somit würde ich mich ziemlich wundern wenn DeleteTextures erst in 1.1 gekommen ist.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ... ich glaube dies schon mal angesprochen zu haben, also wenn 1.3 ok ist dann füge ich mich :-), aber eigentlich war das eine 1.2.1 (sogar die einzige) wenn ich mich nicht irre.&lt;br /&gt;
&lt;br /&gt;
Vertex Arrays ... ist ne 1.1 Geschichte wenn ich mich nicht irre, habe ich auch korrigiert, aber ich bin mir nur zu 99,9% sicher also Kritik willkommen. Darunter fallen: ArrayElement, ColorPointer, DisableClientState, DrawArrays, DrawElements, EdgeFlagPointer, EnableClientState, IndexPointer, NormalPointer, TexCoordPointer und VertexPointer.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 03:41, 3. Apr 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
glDeleteTextures ist bei 1.0 dabei. Ich würde aber aktuell sowieso auf die [[testseite2]] verweisen, die diese hier langfristig ersetzen soll. &lt;br /&gt;
&lt;br /&gt;
Die Vertex Arrays sind nicht erst bei 1.1 hinzugekommen, soweit ich verstanden habe nur die aktuellen Funktionen:&lt;br /&gt;
&lt;br /&gt;
'Arrays of vertex data may be transferred to the GL with many fewer commands than were previously necessary.'&lt;br /&gt;
&lt;br /&gt;
Daher existierten Vertex Arrays auch in 1.0. Wobei ich mir in den Punkt unsicher bin.&lt;br /&gt;
&lt;br /&gt;
Zum Multitexturing:&lt;br /&gt;
In 1.2.1 ist Multitexturing als ARB-Erweiterung von SGIS_multitexture hinzugekommen.&lt;br /&gt;
Erst bei 1.3 wurde es eine Kernfunktion.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:I0n0s|I0n0s]] 11:34, 3. Apr 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;quot;In 1.2.1 ist Multitexturing als ARB-Erweiterung von SGIS_multitexture hinzugekommen.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mein Fehler, wurde auch damals schon erwähnt, ich war nur zu blöd mich daran zu erinnern.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;'Arrays of vertex data may be transferred to the GL with many fewer commands than were previously necessary.'&lt;br /&gt;
Daher existierten Vertex Arrays auch in 1.0.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wenn man den gesamten Text liest auf den du dich beziehst (übrigens hier zu finden: [http://www.opengl.org/documentation/specs/version1.1/glspec1.1/index.html OGL-1.1 Spezifikation], Unterpunkt [http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node133.html#SECTION001200000000000000000 C: Version 1.1], der Teil über [http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node134.html#SECTION001210000000000000000 Vertex Arrays] damit andere auch mit reden können), so macht dies auf mich doch eher den Eindruck, dass diese Funktionen erst in 1.1 verfügbar waren. Vor allem der Satz: &amp;quot;The primary goal was to decrease the number of subroutine calls required to transfer non-display listed geometry data to the GL.&amp;quot; lässt mich vermuten dass diese Funktionen vorher überhaupt nicht definiert waren, denn wenn sie definiert gewesen wären, dann bräuchte man keine Extension dafür, sondern hätte einfach den/die Grafikkartentreiber entsprechend geändert. Aber es ist natürlich etwas blöd dass man kaum noch (bis gar keine) OGL 1.0 Spezifikationen in die Hand bekommt. Vielleicht ne blöde Idee, aber man könnte ja die Jungs von SGI fragen ob sie sowas noch haben :-).&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 02:07, 5. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:OpenGL-Funktions%C3%BCbersicht&amp;diff=16782</id>
		<title>Diskussion:OpenGL-Funktionsübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:OpenGL-Funktions%C3%BCbersicht&amp;diff=16782"/>
				<updated>2006-04-03T01:45:47Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* Versionskritik */  DrawElements vergessen ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DGLOpenGL.pas ==&lt;br /&gt;
In der DGLOpenGL.pas sind mehr als 1200 &amp;quot;GL&amp;quot; Funktionen eingetragen!!!&lt;br /&gt;
Das heißt jetzt aber nicht das wir im Wiki noch 1000 Funktionen beschreiben müssen da viele Funktionen in der DGLOpenGL.pas sich nur durch die Parameter unterscheiden. Allerdings dürfte das verdammt viel Arbeit sein die OpenGL Funktioen &amp;quot;von Hand&amp;quot; zu vergleichen ob sie im Wiki sind oder nicht. Darum würde ich vorschlagen dies von einem Programm machen zu lassen.&lt;br /&gt;
&lt;br /&gt;
MfG&lt;br /&gt;
Flo&lt;br /&gt;
----&lt;br /&gt;
Also ich kenn mich mit PHP net gut genug aus, um hier nen Parser zu schreiben. Sicherlich einfacher wärs direkt die Datenbank abzugrasen. Aber ich glaube bei meinem Wiki gesehn zu haben, dass in den DB-Spalten die gesamten Zeilen als Wikicode gespeichert sind. Parsen muss man also wahrscheinlich immer. Die Idee vom Programm ansich ist aber durchaus gut. Das Programm müsste dann also Bot-Like die Funktionsübersicht updaten.&lt;br /&gt;
--[[Benutzer:Flash (Kevin Fleischer)|Flash (Kevin Fleischer)]] 18:50, 24. Apr 2005 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welche Funktionen wollen wir im Wiki auflisten? ==&lt;br /&gt;
&lt;br /&gt;
In der DGLOpenGL.pas stehen OpenGL Funktionen mit den verschiedensten Endungen wie: ARB, EXT, ATI, NV, SGIS, APPLE, SUN und MESA. Welche davon sollen wir bei GL auflisten?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Alle. Die ARB und EXT können direkt bei den GL Funktionen (wenns denn glXxxxARB sind) eingetragen werden. Die Herstellerspezifischen haben ne Extrakategorie am Ende der Seite. Sollten aber erstmal weniger Priorität haben. Wichtig ist erstmal der GL-Kern + die fast zum Kern gehören.&lt;br /&gt;
--[[Benutzer:Flash (Kevin Fleischer)|Flash (Kevin Fleischer)]] 18:50, 24. Apr 2005 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Versionskritik ==&lt;br /&gt;
glDeleteTextures ... wirklich erst ab 1.1? GenTextures (das Gegenstück) war ja wie ich meinen möchte bereits in 1.0 drinnen, somit würde ich mich ziemlich wundern wenn DeleteTextures erst in 1.1 gekommen ist.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ... ich glaube dies schon mal angesprochen zu haben, also wenn 1.3 ok ist dann füge ich mich :-), aber eigentlich war das eine 1.2.1 (sogar die einzige) wenn ich mich nicht irre.&lt;br /&gt;
&lt;br /&gt;
Vertex Arrays ... ist ne 1.1 Geschichte wenn ich mich nicht irre, habe ich auch korrigiert, aber ich bin mir nur zu 99,9% sicher also Kritik willkommen. Darunter fallen: ArrayElement, ColorPointer, DisableClientState, DrawArrays, DrawElements, EdgeFlagPointer, EnableClientState, IndexPointer, NormalPointer, TexCoordPointer und VertexPointer.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 03:41, 3. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenGL-Funktions%C3%BCbersicht&amp;diff=16781</id>
		<title>OpenGL-Funktionsübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenGL-Funktions%C3%BCbersicht&amp;diff=16781"/>
				<updated>2006-04-03T01:45:13Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: /* D */  DrawElements vergessen ....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was hier hinein gehört  ==&lt;br /&gt;
&lt;br /&gt;
Um eine Funktionsübersicht aller OpenGL Funktionen zu erreichen die inhaltlich korrekt ist, sollten die [http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz  orginal Spezifikationen] von OpenGL.org übersetzt werden([[Link#OpenGL_Funktionen|Alternative Quellen]]).  &lt;br /&gt;
&lt;br /&gt;
Allerdings sind hier auch glu-/wgl- und glx-Funktionen erlaubt. Konstanten bitte nicht hier im Inhaltsverzeichnis einfügen, genausowenig wie [[OpenGL-Extensions]].&lt;br /&gt;
&lt;br /&gt;
Die Funktionen sind bereits nach Gruppen sortiert (GL/GLU/etc.). Sollten Funktionen noch nicht in der Übersicht auftauchen, welche aber definitiv existieren, können diese nachgetragen werden. Funktionen die es in verschiedenen Ausprägungen gibt, werden ohne Parameterangabe eingetragen (also glVertex statt glVertex3f).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bitte haltet euch bei der Formatierung der Befehlsbeschreibung an die [[Funktionsvorlage]] (ich führe hier mal glBegin als Beispiel an), und erklärt nicht mehr als nötig. &lt;br /&gt;
Wenn ihr also einen Befehl habt der etwas mit VertexArrays zu tun hat, dann gehört dort '''nicht''' hinein was ein VertexArray ist oder bringt. Das gehört dann nach [[Techniken und Algorithmen]] oder [[Hintergrundwissen]] (je nach Thematik) und sollte dann in der Funktionsbeschreibung als ''interner Link'' untergebracht werden.&lt;br /&gt;
&lt;br /&gt;
'''Zu aller erst sollte die Orginalspezifikation übersetzt werden''' und erst dann eigene Hinweise untergebracht werden (z.B. Erfahrungen, typische Fehler etc.)&lt;br /&gt;
&lt;br /&gt;
==Artikel-Vorlage==&lt;br /&gt;
'''Wichtiger Hinweis ''' : Bei der Funktionsübersicht ist v.a. eine einheitliche Gliederung der Artikel wichtig. Deshalb haltet euch bitte an '''[[Funktionsvorlage|folgende Vorlage]]'''!&lt;br /&gt;
&lt;br /&gt;
==Kategorisieren von Artikeln==&lt;br /&gt;
Das Wiki ermöglicht es einen Artikel einer Kategorie zuzuordnen. Diese Möglichkeit sollte von Artikelschreibern genutzt werden.&lt;br /&gt;
Man ordnet einen Artikel einer Kategorie zu, in dem man '''am Ende des Artikels einen Link zu der Kategrie erstellt''' der er zugeordnet werden soll:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+Beispiel&lt;br /&gt;
|&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;4&amp;quot;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;[[Kategorie:GL|Name ohne &amp;quot;gl&amp;quot;]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Das sind die neuen Kategorien:&lt;br /&gt;
*[[:Kategorie:GL]]&lt;br /&gt;
*[[:Kategorie:GLU]]&lt;br /&gt;
*[[:Kategorie:GLX]]&lt;br /&gt;
*[[:Kategorie:WGL]]&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:GL|GL]] ==&lt;br /&gt;
Abkürzung für '''G'''raphics '''L'''ibrary, hierunter fallen alle Funktionen die direkter Bestandteil (entweder als Kernfunktion oder über Extensions) der OpenGL sind.&lt;br /&gt;
&lt;br /&gt;
=== A ===&lt;br /&gt;
[[glAccum]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glActiveTexture]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glAddSwapHintRectWIN]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glAlphaFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glAreTexturesResident]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glArrayElement]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glAttachObject]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glAttachShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B ===&lt;br /&gt;
[[glBegin]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBeginQuery]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindAttribLocationARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindBuffer]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindProgrammARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindTexture]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBitmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendColor]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendEquation]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendFuncSeparate]] {{Version_1_4}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBufferData]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glBufferSubData]] {{Version_1_5}}&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
[[glCallList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCallLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClear]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearAccum]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearColor]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearDepth]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearIndex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearStencil]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClientActiveTexture]] {{Version_1_3}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glClipPlane]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColor]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorMaterial]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorSubTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorTableParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCompileShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCompressedTexSubImage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCompressedTexImage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glConvolutionFilter1D]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glConvolutionFilter2D]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glConvolutionParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyColorSubTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyColorTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyConvolutionFilter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyPixels]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyTexImage1D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyTexImage2D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyTexSubImage]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCreateProgramObject]] {{Version_2_0}} [[glCreateProgramObjectARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCreateShaderObject]] {{Version_2_0}} [[glCreateShaderObjectARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCullFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCurrentPaletteMatrixARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[glDeleteLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteObject]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDetachObject]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDetachShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteBuffers]] {{Version_1_5}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glDeleteProgram]] {{Version_2_0}} [[glDeleteProgramsARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteQueries]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteTextures]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDepthFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDepthMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDepthRange]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDisable]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDisableClientState]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDisableVertexAttribArrayARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawArrays]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawElements]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawPixels]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawRangeElements]] {{Version_1_2}}&lt;br /&gt;
&lt;br /&gt;
=== E ===&lt;br /&gt;
[[glEdgeFlag]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEdgeFlagPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnable]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnableClientState]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnableVertexAttribArrayARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnd]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEndList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEndQuery]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glEvalCoord]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEvalMesh]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEvalPoint]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== F ===&lt;br /&gt;
[[glFeedbackBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFinish]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFlush]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFogCoord]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glFogCoordPointer]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glFrontFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFrustum]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== G ===&lt;br /&gt;
[[glGenBuffers]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenTextures]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenProgramsARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenQueries]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetActiveAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetActiveUniform]] {{Version_2_0}} [[glGetActiveUniformARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetAttachedObjects]] {{Version_2_0}} [[glGetAttachedObjectsARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetAttachedShaders]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetAttribLocationARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBooleanv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBufferParameteriv]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBufferPointerv]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBufferSubData]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetClipPlane]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetColorTable]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetColorTableParameter]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetCompressedTexImage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetConvolutionFilter]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetConvolutionParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetDoublev]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetError]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetFloatv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetHandle]] {{Version_2_0}} [[glGetHandleARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetHistogram]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetHistogramParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetInfoLog]] {{Version_2_0}} [[glGetInfoLogARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetIntegerv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetLight]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetMap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetMaterial]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetMinmax]] {{Version_1_2}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glGetMinmaxParameter]] {{Version_1_2}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glGetObjectParameter]] {{Version_2_0}} [[glGetObjectParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetPixelMap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetPointerv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetPolygonStipple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramEnvParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramLocalParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramStringARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetQueryiv]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetQueryObject]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetSeparableFilter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetShaderSource]] {{Version_2_0}} [[glGetShaderSourceARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexEnv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexGen]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexImage]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexLevelParameter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexParameter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetUniform]] {{Version_2_0}} [[glGetUniformARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetUniformLocation]] {{Version_2_0}} [[glGetUniformLocationARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetVertexAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetVertexAttribPointervARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== H ===&lt;br /&gt;
[[glHint]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glHistogram]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== I ===&lt;br /&gt;
[[glIndex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIndexMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIndexPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glInitNames]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glInterleavedArrays]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsBuffer]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsEnabled]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsProgram]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsQuery]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsShader]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsTexture]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== L ===&lt;br /&gt;
[[glLight]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLightModel]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLineStipple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLineWidth]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLinkProgram]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glListBase]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadIdentity]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadName]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadTransposeMatrix]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glLogicOp]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== M ===&lt;br /&gt;
[[glMap1]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMap2]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMapBuffer]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMapGrid]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMaterial]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMatrixIndexARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMatrixIndexPointerARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMatrixMode]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMinMax]]{{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultiDrawArrays]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultiDrawElements]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultiTexCoord]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultTransposeMatrix]] {{Version_1_3}}&lt;br /&gt;
&lt;br /&gt;
=== N ===&lt;br /&gt;
[[glNewList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glNormal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glNormalPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 0 ===&lt;br /&gt;
[[glOrtho]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== P ===&lt;br /&gt;
[[glPassThrough]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelMap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelStore]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelTransfer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelZoom]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPointParameter]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glPointSize]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPolygonMode]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPolygonOffset]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPolygonStipple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopClientAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopName]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPrioritizeTextures]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glProgramEnvParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glProgramLocalParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glProgramStringARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushClientAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushName]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R ===&lt;br /&gt;
[[glRasterPos]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glReadBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glReadPixels]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glRect]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glRenderMode]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glResetHistogram]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glResetMinmax]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glRotate]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== S ===&lt;br /&gt;
[[glSampleCoverage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glScale]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glScissor]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glSecondaryColor]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glSecondaryColorPointer]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glSelectBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glSeparableFilter2D]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glShadeModel]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glShaderSource]] {{Version_2_0}} [[glShaderSourceARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glStencilFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glStencilMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glStencilOp]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== T ===&lt;br /&gt;
[[glTexCoord]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexCoordPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexEnv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexGen]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexImage|glTexImage1D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexImage|glTexImage2D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexImage|glTexImage3D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexParameter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexSubImage1D]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexSubImage2D]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexSubImage3D]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTranslate]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== U ===&lt;br /&gt;
[[glUniform]] {{Version_2_0}} [[glUniformARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glUniformMatrix]] {{Version_2_0}} [[glUniformMatrixARB]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glUseProgramObject]] {{Version_2_0}} [[glUseProgramObjectARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glUnmapBuffer]] {{Version_1_5}}&lt;br /&gt;
&lt;br /&gt;
=== V ===&lt;br /&gt;
[[glValidateProgram]] {{Version_2_0}} [[glValidateProgramARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexAttribPointerARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexBlendARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glViewport]]&lt;br /&gt;
&lt;br /&gt;
=== W ===&lt;br /&gt;
[[glWeightARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glWeightPointerARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glWindowPos]] {{Version_1_4}}&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:GLU|GLU]] ==&lt;br /&gt;
(Was ist die [[GLU]]?)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B ===&lt;br /&gt;
[[gluBeginCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBeginPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBeginSurface]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBeginTrim]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBuild1DMipmaps]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBuild2DMipmaps]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
[[gluCylinder]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[gluDeleteNurbsRenderer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluDeleteQuadric]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluDeleteTess]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluDisk]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== E ===&lt;br /&gt;
[[gluEndCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluEndPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluEndSurface]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluEndTrim]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluErrorString]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== G ===&lt;br /&gt;
[[gluGetNurbsProperty]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluGetString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluGetTessProperty]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== L ===&lt;br /&gt;
[[gluLoadSamplingMatrices]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluLookAt]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== N ===&lt;br /&gt;
[[gluNewNurbsRenderer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNewQuadric]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNewTess]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNextContour]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsCallback]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsProperty]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsSurface]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== O ===&lt;br /&gt;
[[gluOrtho2D]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== P ===&lt;br /&gt;
[[gluPartialDisk]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluPerspective]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluPickMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluProject]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluPwlCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Q ===&lt;br /&gt;
[[gluQuadricCallback]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricDrawStyle]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricNormals]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricOrientation]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricTexture]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== S ===&lt;br /&gt;
[[gluScaleImage]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluSphere]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== T ===&lt;br /&gt;
[[gluTessBeginContour]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessBeginPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessCallback]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessEndContour]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessEndPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessNormal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessProperty]] {{icpIcon}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessVertex]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== U ===&lt;br /&gt;
[[gluUnProject]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:GLX|GLX]] ==&lt;br /&gt;
(Was ist die [[GLX]] {{icpIcon}}?)&amp;lt;br&amp;gt;&lt;br /&gt;
=== C ===&lt;br /&gt;
[[glXChooseVisual]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXCopyContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXCreateContext]]&amp;lt;br&amp;gt; &lt;br /&gt;
[[glXCreateGLXPixmap]]&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[glXDestroyContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXDestroyGLXPixmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== F ===&lt;br /&gt;
[[glXFreeContextEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== G ===&lt;br /&gt;
[[glXGetClientString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXGetConfig]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXGetCurrentContextIDEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxGetCurrentContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxGetCurrentDisplay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxGetCurrentDrawable]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== I ===&lt;br /&gt;
[[glXImportContextEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXIntro]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxIsDirect]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== M ===&lt;br /&gt;
[[glXMakeCurrent]]&amp;lt;br&amp;gt;  &lt;br /&gt;
=== Q ===&lt;br /&gt;
[[glXQueryContextInfoEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxQueryExtension]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXQueryExtensionsString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXQueryServerString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXQureyVersion]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== S ===&lt;br /&gt;
[[glxSwapBuffers]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== U ===&lt;br /&gt;
[[glXUseXFont]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== W ===&lt;br /&gt;
[[glXWaitGL]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXWaitX]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:WGL|WGL]] ==&lt;br /&gt;
(Was ist die [[WGL]]?)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
[[wglChoosePixelFormatARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCopyContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreateContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreateBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreateLayerContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreatePbufferARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[wglDeleteBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglDeleteContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglDestroyPbufferARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglDescribeLayerPlane]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== G ===&lt;br /&gt;
[[wglGetCurrentContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetCurrentDC]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetCurrentReadDC]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetExtensionsStringARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetLayerPaletteEntries]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetPbufferDCARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetPixelFormatAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetPixelFormatAttribEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetProcAddress]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== M ===&lt;br /&gt;
[[wglMakeCurrent]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglMakeCurrentContextEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Q ===&lt;br /&gt;
[[wglQueryPbufferARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R ===&lt;br /&gt;
[[wglRealizeLayerPalette]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglReleasePbufferDCARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglRestoreBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== S ===&lt;br /&gt;
[[wglSaveBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglSetLayerPaletteEntries]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglShareLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglSwapIntervalEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglSwapLayerBuffers]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== U ===&lt;br /&gt;
[[wglUseFontBitmaps]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglUseFontOutlines]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Externe Funktionen ==&lt;br /&gt;
Hier sind alle Funktionen zu finden, die zwar direkt nichts mit OpenGL zu tun haben, aber trotzdem im Normalfall zur Nutzung der GL benötigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Win32 Funktionen ===&lt;br /&gt;
[[ChoosePixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[DescribePixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GetPixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[SetPixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[SwapBuffers]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Unix Funktionen ===&lt;br /&gt;
[[XCloseDisplay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[XDefaultScreen]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[XOpenDisplay]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Siehe auch===&lt;br /&gt;
[[SDL-Funktionsübersicht]]&lt;br /&gt;
&lt;br /&gt;
== OpenGL Parameter-Tabellen ==&lt;br /&gt;
Hier gehören alle Parameter-Tabellen hin. Dies sind Listen von Parametern, die bei vielen OpenGL-Funktionen immer wieder auftauchen.&lt;br /&gt;
&lt;br /&gt;
[[internes Pixelformat|interne Pixelformate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Pixelformat|Pixelformate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Pixeldatentyp|Datentypen für Pixel]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Diskussion:OpenGL-Funktions%C3%BCbersicht&amp;diff=16780</id>
		<title>Diskussion:OpenGL-Funktionsübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Diskussion:OpenGL-Funktions%C3%BCbersicht&amp;diff=16780"/>
				<updated>2006-04-03T01:41:50Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DGLOpenGL.pas ==&lt;br /&gt;
In der DGLOpenGL.pas sind mehr als 1200 &amp;quot;GL&amp;quot; Funktionen eingetragen!!!&lt;br /&gt;
Das heißt jetzt aber nicht das wir im Wiki noch 1000 Funktionen beschreiben müssen da viele Funktionen in der DGLOpenGL.pas sich nur durch die Parameter unterscheiden. Allerdings dürfte das verdammt viel Arbeit sein die OpenGL Funktioen &amp;quot;von Hand&amp;quot; zu vergleichen ob sie im Wiki sind oder nicht. Darum würde ich vorschlagen dies von einem Programm machen zu lassen.&lt;br /&gt;
&lt;br /&gt;
MfG&lt;br /&gt;
Flo&lt;br /&gt;
----&lt;br /&gt;
Also ich kenn mich mit PHP net gut genug aus, um hier nen Parser zu schreiben. Sicherlich einfacher wärs direkt die Datenbank abzugrasen. Aber ich glaube bei meinem Wiki gesehn zu haben, dass in den DB-Spalten die gesamten Zeilen als Wikicode gespeichert sind. Parsen muss man also wahrscheinlich immer. Die Idee vom Programm ansich ist aber durchaus gut. Das Programm müsste dann also Bot-Like die Funktionsübersicht updaten.&lt;br /&gt;
--[[Benutzer:Flash (Kevin Fleischer)|Flash (Kevin Fleischer)]] 18:50, 24. Apr 2005 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welche Funktionen wollen wir im Wiki auflisten? ==&lt;br /&gt;
&lt;br /&gt;
In der DGLOpenGL.pas stehen OpenGL Funktionen mit den verschiedensten Endungen wie: ARB, EXT, ATI, NV, SGIS, APPLE, SUN und MESA. Welche davon sollen wir bei GL auflisten?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Alle. Die ARB und EXT können direkt bei den GL Funktionen (wenns denn glXxxxARB sind) eingetragen werden. Die Herstellerspezifischen haben ne Extrakategorie am Ende der Seite. Sollten aber erstmal weniger Priorität haben. Wichtig ist erstmal der GL-Kern + die fast zum Kern gehören.&lt;br /&gt;
--[[Benutzer:Flash (Kevin Fleischer)|Flash (Kevin Fleischer)]] 18:50, 24. Apr 2005 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Versionskritik ==&lt;br /&gt;
glDeleteTextures ... wirklich erst ab 1.1? GenTextures (das Gegenstück) war ja wie ich meinen möchte bereits in 1.0 drinnen, somit würde ich mich ziemlich wundern wenn DeleteTextures erst in 1.1 gekommen ist.&lt;br /&gt;
&lt;br /&gt;
Multitexturing ... ich glaube dies schon mal angesprochen zu haben, also wenn 1.3 ok ist dann füge ich mich :-), aber eigentlich war das eine 1.2.1 (sogar die einzige) wenn ich mich nicht irre.&lt;br /&gt;
&lt;br /&gt;
Vertex Arrays ... ist ne 1.1 Geschichte wenn ich mich nicht irre, habe ich auch korrigiert, aber ich bin mir nur zu 99,9% sicher also Kritik willkommen. Darunter fallen: ArrayElement, ColorPointer, DisableClientState, DrawArrays, EdgeFlagPointer, EnableClientState, IndexPointer, NormalPointer, TexCoordPointer und VertexPointer.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Lyr|Lyr]] 03:41, 3. Apr 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=OpenGL-Funktions%C3%BCbersicht&amp;diff=16779</id>
		<title>OpenGL-Funktionsübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=OpenGL-Funktions%C3%BCbersicht&amp;diff=16779"/>
				<updated>2006-04-03T01:38:56Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: Vertex Arrays erst ab 1.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was hier hinein gehört  ==&lt;br /&gt;
&lt;br /&gt;
Um eine Funktionsübersicht aller OpenGL Funktionen zu erreichen die inhaltlich korrekt ist, sollten die [http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL.tar.gz  orginal Spezifikationen] von OpenGL.org übersetzt werden([[Link#OpenGL_Funktionen|Alternative Quellen]]).  &lt;br /&gt;
&lt;br /&gt;
Allerdings sind hier auch glu-/wgl- und glx-Funktionen erlaubt. Konstanten bitte nicht hier im Inhaltsverzeichnis einfügen, genausowenig wie [[OpenGL-Extensions]].&lt;br /&gt;
&lt;br /&gt;
Die Funktionen sind bereits nach Gruppen sortiert (GL/GLU/etc.). Sollten Funktionen noch nicht in der Übersicht auftauchen, welche aber definitiv existieren, können diese nachgetragen werden. Funktionen die es in verschiedenen Ausprägungen gibt, werden ohne Parameterangabe eingetragen (also glVertex statt glVertex3f).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bitte haltet euch bei der Formatierung der Befehlsbeschreibung an die [[Funktionsvorlage]] (ich führe hier mal glBegin als Beispiel an), und erklärt nicht mehr als nötig. &lt;br /&gt;
Wenn ihr also einen Befehl habt der etwas mit VertexArrays zu tun hat, dann gehört dort '''nicht''' hinein was ein VertexArray ist oder bringt. Das gehört dann nach [[Techniken und Algorithmen]] oder [[Hintergrundwissen]] (je nach Thematik) und sollte dann in der Funktionsbeschreibung als ''interner Link'' untergebracht werden.&lt;br /&gt;
&lt;br /&gt;
'''Zu aller erst sollte die Orginalspezifikation übersetzt werden''' und erst dann eigene Hinweise untergebracht werden (z.B. Erfahrungen, typische Fehler etc.)&lt;br /&gt;
&lt;br /&gt;
==Artikel-Vorlage==&lt;br /&gt;
'''Wichtiger Hinweis ''' : Bei der Funktionsübersicht ist v.a. eine einheitliche Gliederung der Artikel wichtig. Deshalb haltet euch bitte an '''[[Funktionsvorlage|folgende Vorlage]]'''!&lt;br /&gt;
&lt;br /&gt;
==Kategorisieren von Artikeln==&lt;br /&gt;
Das Wiki ermöglicht es einen Artikel einer Kategorie zuzuordnen. Diese Möglichkeit sollte von Artikelschreibern genutzt werden.&lt;br /&gt;
Man ordnet einen Artikel einer Kategorie zu, in dem man '''am Ende des Artikels einen Link zu der Kategrie erstellt''' der er zugeordnet werden soll:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+Beispiel&lt;br /&gt;
|&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;4&amp;quot;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;[[Kategorie:GL|Name ohne &amp;quot;gl&amp;quot;]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Das sind die neuen Kategorien:&lt;br /&gt;
*[[:Kategorie:GL]]&lt;br /&gt;
*[[:Kategorie:GLU]]&lt;br /&gt;
*[[:Kategorie:GLX]]&lt;br /&gt;
*[[:Kategorie:WGL]]&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:GL|GL]] ==&lt;br /&gt;
Abkürzung für '''G'''raphics '''L'''ibrary, hierunter fallen alle Funktionen die direkter Bestandteil (entweder als Kernfunktion oder über Extensions) der OpenGL sind.&lt;br /&gt;
&lt;br /&gt;
=== A ===&lt;br /&gt;
[[glAccum]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glActiveTexture]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glAddSwapHintRectWIN]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glAlphaFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glAreTexturesResident]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glArrayElement]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glAttachObject]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glAttachShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B ===&lt;br /&gt;
[[glBegin]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBeginQuery]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindAttribLocationARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindBuffer]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindProgrammARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBindTexture]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBitmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendColor]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendEquation]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBlendFuncSeparate]] {{Version_1_4}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glBufferData]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glBufferSubData]] {{Version_1_5}}&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
[[glCallList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCallLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClear]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearAccum]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearColor]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearDepth]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearIndex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClearStencil]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glClientActiveTexture]] {{Version_1_3}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glClipPlane]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColor]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorMaterial]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorSubTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glColorTableParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCompileShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCompressedTexSubImage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCompressedTexImage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glConvolutionFilter1D]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glConvolutionFilter2D]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glConvolutionParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyColorSubTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyColorTable]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyConvolutionFilter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyPixels]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyTexImage1D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyTexImage2D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCopyTexSubImage]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCreateProgramObject]] {{Version_2_0}} [[glCreateProgramObjectARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCreateShaderObject]] {{Version_2_0}} [[glCreateShaderObjectARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCullFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glCurrentPaletteMatrixARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[glDeleteLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteObject]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDetachObject]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDetachShader]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteBuffers]] {{Version_1_5}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glDeleteProgram]] {{Version_2_0}} [[glDeleteProgramsARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteQueries]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDeleteTextures]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDepthFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDepthMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDepthRange]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDisable]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDisableClientState]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDisableVertexAttribArrayARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawArrays]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawElements]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawPixels]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glDrawRangeElements]] {{Version_1_2}}&lt;br /&gt;
&lt;br /&gt;
=== E ===&lt;br /&gt;
[[glEdgeFlag]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEdgeFlagPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnable]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnableClientState]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnableVertexAttribArrayARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEnd]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEndList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEndQuery]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glEvalCoord]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEvalMesh]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glEvalPoint]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== F ===&lt;br /&gt;
[[glFeedbackBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFinish]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFlush]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFog]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFogCoord]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glFogCoordPointer]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glFrontFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glFrustum]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== G ===&lt;br /&gt;
[[glGenBuffers]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenTextures]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenProgramsARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGenQueries]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGet]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetActiveAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetActiveUniform]] {{Version_2_0}} [[glGetActiveUniformARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetAttachedObjects]] {{Version_2_0}} [[glGetAttachedObjectsARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetAttachedShaders]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetAttribLocationARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBooleanv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBufferParameteriv]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBufferPointerv]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetBufferSubData]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetClipPlane]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetColorTable]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetColorTableParameter]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetCompressedTexImage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetConvolutionFilter]] {{Version_1_2}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetConvolutionParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetDoublev]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetError]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetFloatv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetHandle]] {{Version_2_0}} [[glGetHandleARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetHistogram]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetHistogramParameter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetInfoLog]] {{Version_2_0}} [[glGetInfoLogARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetIntegerv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetLight]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetMap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetMaterial]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetMinmax]] {{Version_1_2}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glGetMinmaxParameter]] {{Version_1_2}} &amp;lt;br&amp;gt; &lt;br /&gt;
[[glGetObjectParameter]] {{Version_2_0}} [[glGetObjectParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetPixelMap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetPointerv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetPolygonStipple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramEnvParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramLocalParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetProgramStringARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetQueryiv]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetQueryObject]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetSeparableFilter]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetShaderSource]] {{Version_2_0}} [[glGetShaderSourceARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexEnv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexGen]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexImage]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexLevelParameter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetTexParameter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetUniform]] {{Version_2_0}} [[glGetUniformARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetUniformLocation]] {{Version_2_0}} [[glGetUniformLocationARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetVertexAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glGetVertexAttribPointervARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== H ===&lt;br /&gt;
[[glHint]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glHistogram]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== I ===&lt;br /&gt;
[[glIndex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIndexMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIndexPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glInitNames]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glInterleavedArrays]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsBuffer]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsEnabled]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsProgram]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsQuery]] {{Version_1_5}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsShader]] {{Version_2_0}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[glIsTexture]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== L ===&lt;br /&gt;
[[glLight]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLightModel]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLineStipple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLineWidth]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLinkProgram]] {{Version_2_0}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glListBase]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadIdentity]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadName]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glLoadTransposeMatrix]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glLogicOp]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== M ===&lt;br /&gt;
[[glMap1]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMap2]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMapBuffer]] {{Version_1_5}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMapGrid]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMaterial]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMatrixIndexARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMatrixIndexPointerARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMatrixMode]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMinMax]]{{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultiDrawArrays]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultiDrawElements]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultiTexCoord]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glMultTransposeMatrix]] {{Version_1_3}}&lt;br /&gt;
&lt;br /&gt;
=== N ===&lt;br /&gt;
[[glNewList]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glNormal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glNormalPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 0 ===&lt;br /&gt;
[[glOrtho]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== P ===&lt;br /&gt;
[[glPassThrough]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelMap]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelStore]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelTransfer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPixelZoom]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPointParameter]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glPointSize]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPolygonMode]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPolygonOffset]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPolygonStipple]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopClientAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPopName]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPrioritizeTextures]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glProgramEnvParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glProgramLocalParameterARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glProgramStringARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushClientAttrib]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glPushName]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R ===&lt;br /&gt;
[[glRasterPos]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glReadBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glReadPixels]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glRect]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glRenderMode]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glResetHistogram]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glResetMinmax]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glRotate]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== S ===&lt;br /&gt;
[[glSampleCoverage]] {{Version_1_3}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glScale]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glScissor]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glSecondaryColor]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glSecondaryColorPointer]] {{Version_1_4}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glSelectBuffer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glSeparableFilter2D]] {{Version_1_2}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glShadeModel]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glShaderSource]] {{Version_2_0}} [[glShaderSourceARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glStencilFunc]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glStencilMask]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glStencilOp]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== T ===&lt;br /&gt;
[[glTexCoord]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexCoordPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexEnv]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexGen]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexImage|glTexImage1D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexImage|glTexImage2D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexImage|glTexImage3D]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexParameter]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexSubImage1D]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexSubImage2D]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTexSubImage3D]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glTranslate]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== U ===&lt;br /&gt;
[[glUniform]] {{Version_2_0}} [[glUniformARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glUniformMatrix]] {{Version_2_0}} [[glUniformMatrixARB]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[glUseProgramObject]] {{Version_2_0}} [[glUseProgramObjectARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glUnmapBuffer]] {{Version_1_5}}&lt;br /&gt;
&lt;br /&gt;
=== V ===&lt;br /&gt;
[[glValidateProgram]] {{Version_2_0}} [[glValidateProgramARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertex]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexAttribPointerARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexBlendARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glVertexPointer]] {{Version_1_1}} &amp;lt;br&amp;gt;&lt;br /&gt;
[[glViewport]]&lt;br /&gt;
&lt;br /&gt;
=== W ===&lt;br /&gt;
[[glWeightARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glWeightPointerARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glWindowPos]] {{Version_1_4}}&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:GLU|GLU]] ==&lt;br /&gt;
(Was ist die [[GLU]]?)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B ===&lt;br /&gt;
[[gluBeginCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBeginPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBeginSurface]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBeginTrim]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBuild1DMipmaps]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluBuild2DMipmaps]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
[[gluCylinder]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[gluDeleteNurbsRenderer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluDeleteQuadric]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluDeleteTess]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluDisk]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== E ===&lt;br /&gt;
[[gluEndCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluEndPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluEndSurface]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluEndTrim]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluErrorString]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== G ===&lt;br /&gt;
[[gluGetNurbsProperty]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluGetString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluGetTessProperty]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== L ===&lt;br /&gt;
[[gluLoadSamplingMatrices]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluLookAt]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== N ===&lt;br /&gt;
[[gluNewNurbsRenderer]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNewQuadric]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNewTess]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNextContour]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsCallback]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsProperty]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluNurbsSurface]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== O ===&lt;br /&gt;
[[gluOrtho2D]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== P ===&lt;br /&gt;
[[gluPartialDisk]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluPerspective]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluPickMatrix]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluProject]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluPwlCurve]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Q ===&lt;br /&gt;
[[gluQuadricCallback]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricDrawStyle]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricNormals]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricOrientation]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluQuadricTexture]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== S ===&lt;br /&gt;
[[gluScaleImage]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluSphere]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== T ===&lt;br /&gt;
[[gluTessBeginContour]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessBeginPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessCallback]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessEndContour]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessEndPolygon]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessNormal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessProperty]] {{icpIcon}}&amp;lt;br&amp;gt;&lt;br /&gt;
[[gluTessVertex]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== U ===&lt;br /&gt;
[[gluUnProject]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:GLX|GLX]] ==&lt;br /&gt;
(Was ist die [[GLX]] {{icpIcon}}?)&amp;lt;br&amp;gt;&lt;br /&gt;
=== C ===&lt;br /&gt;
[[glXChooseVisual]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXCopyContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXCreateContext]]&amp;lt;br&amp;gt; &lt;br /&gt;
[[glXCreateGLXPixmap]]&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[glXDestroyContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXDestroyGLXPixmap]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== F ===&lt;br /&gt;
[[glXFreeContextEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== G ===&lt;br /&gt;
[[glXGetClientString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXGetConfig]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXGetCurrentContextIDEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxGetCurrentContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxGetCurrentDisplay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxGetCurrentDrawable]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== I ===&lt;br /&gt;
[[glXImportContextEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXIntro]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxIsDirect]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== M ===&lt;br /&gt;
[[glXMakeCurrent]]&amp;lt;br&amp;gt;  &lt;br /&gt;
=== Q ===&lt;br /&gt;
[[glXQueryContextInfoEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glxQueryExtension]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXQueryExtensionsString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXQueryServerString]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXQureyVersion]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== S ===&lt;br /&gt;
[[glxSwapBuffers]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== U ===&lt;br /&gt;
[[glXUseXFont]]&amp;lt;br&amp;gt;&lt;br /&gt;
=== W ===&lt;br /&gt;
[[glXWaitGL]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[glXWaitX]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[:Kategorie:WGL|WGL]] ==&lt;br /&gt;
(Was ist die [[WGL]]?)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
[[wglChoosePixelFormatARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCopyContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreateContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreateBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreateLayerContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglCreatePbufferARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D ===&lt;br /&gt;
[[wglDeleteBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglDeleteContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglDestroyPbufferARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglDescribeLayerPlane]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== G ===&lt;br /&gt;
[[wglGetCurrentContext]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetCurrentDC]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetCurrentReadDC]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetExtensionsStringARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetLayerPaletteEntries]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetPbufferDCARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetPixelFormatAttribARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetPixelFormatAttribEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglGetProcAddress]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== M ===&lt;br /&gt;
[[wglMakeCurrent]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglMakeCurrentContextEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Q ===&lt;br /&gt;
[[wglQueryPbufferARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== R ===&lt;br /&gt;
[[wglRealizeLayerPalette]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglReleasePbufferDCARB]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglRestoreBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== S ===&lt;br /&gt;
[[wglSaveBufferRegionEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglSetLayerPaletteEntries]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglShareLists]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglSwapIntervalEXT]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglSwapLayerBuffers]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== U ===&lt;br /&gt;
[[wglUseFontBitmaps]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[wglUseFontOutlines]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Externe Funktionen ==&lt;br /&gt;
Hier sind alle Funktionen zu finden, die zwar direkt nichts mit OpenGL zu tun haben, aber trotzdem im Normalfall zur Nutzung der GL benötigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Win32 Funktionen ===&lt;br /&gt;
[[ChoosePixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[DescribePixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[GetPixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[SetPixelFormat]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[SwapBuffers]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linux / Unix Funktionen ===&lt;br /&gt;
[[XCloseDisplay]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[XDefaultScreen]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[XOpenDisplay]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Siehe auch===&lt;br /&gt;
[[SDL-Funktionsübersicht]]&lt;br /&gt;
&lt;br /&gt;
== OpenGL Parameter-Tabellen ==&lt;br /&gt;
Hier gehören alle Parameter-Tabellen hin. Dies sind Listen von Parametern, die bei vielen OpenGL-Funktionen immer wieder auftauchen.&lt;br /&gt;
&lt;br /&gt;
[[internes Pixelformat|interne Pixelformate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Pixelformat|Pixelformate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Pixeldatentyp|Datentypen für Pixel]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Perlin_Noise&amp;diff=16777</id>
		<title>Perlin Noise</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Perlin_Noise&amp;diff=16777"/>
				<updated>2006-04-02T23:56:53Z</updated>
		
		<summary type="html">&lt;p&gt;Lyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Perlin Noise ist ein Fraktal-Algorithmus welcher mit sehr einfachen Formeln komplexe und theoretisch endlose Gebilde berechnen kann. Da Perlin Noise darauf basiert, scheinbar zufällige Funktionen mit weichen Übergängen (die Steigung kann einen gewissen Wert nicht überschreiten) zu benutzen, eignet er sich sehr gut zur Simulation verschiedenster, natürlicher Phänomene wie Beispielsweise:&lt;br /&gt;
* Wolken&lt;br /&gt;
* Landschaftshöhen- und auch Texturen&lt;br /&gt;
* eventuell auch Texturen wie Wasser, Feuer und ähnliches&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
Perlin Noise basiert auf der Überlagerung von Frequenzen. Bei einer niedrigen Frequenz wird zwischen 2 eher weit voneinander entfernten angegebenen Werten interpoliert. Bei der höchsten (sinnvollen) Frequenz wird für jeden dargestellten Wert (zB jedes Pixel) ein anderer Wert berechnet. Die Werte werden aus Pseudozufallszahlen für eine Positionsangabe gebildet. Die Positionsangabe kann hier eine beliebige Dimension besitzen (beispielsweise 2D für eine Heightmap, 3D für eine Volumentrische Textur, ...). Die Ausgabe ist üblicherweise 1 Wert welcher beliebig interpretiert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Zufallswerte aber wie? ==&lt;br /&gt;
&lt;br /&gt;
Es wird eine Funktion benötigt die für jede Dimension einen Parameter hat und für die gleichen Parameter auch die gleichen Zahlen liefert.&lt;br /&gt;
&amp;lt;pascal&amp;gt;// 1. Dimension&lt;br /&gt;
function Werte1D(X:Integer):ErgebnisTyp&lt;br /&gt;
// 2.Dimension&lt;br /&gt;
function Werte2D(X,Y:Integer):ErgebnisTyp&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mit einen Array===&lt;br /&gt;
&lt;br /&gt;
Diese Aufgabe kann ein Array erfüllen welcheswelches man zuvor mit Zufallswerten gefüllt hat.&lt;br /&gt;
also:&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
Werte1D:array [0..X_Werte_Max] of ErgebnisTyp;&lt;br /&gt;
Werte2D:array [0..X_Werte_Max,0..Y_Werte_Max] of ErgebnisTyp;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== eigene Zufallsfunktion ===&lt;br /&gt;
Ein gängiger Algorithmus sieht beispielsweise so aus:&lt;br /&gt;
 x := x + Seed;&lt;br /&gt;
 x := ( x shl 13 ) xor x;&lt;br /&gt;
 rand := 1 - ( (x * (x * x * 15731 + 789221) + 1376312589) and $7fffffff) / 1073741824;&lt;br /&gt;
Rand liefert hier einen Wert für eine 1 Dimensionale Positionsangabe (X - Ganzzahl) einen Wert zwischen -1 und 1. Für 2 Dimensionen könnte dieser Code folgendermaßen erweitert werden:&lt;br /&gt;
 n := x + y * 57 + Seed;&lt;br /&gt;
 n := ( n shl 13 ) xor n;&lt;br /&gt;
 rand := 1 - ( (n * (n * n * 15731 + 789221) + 1376312589) and $7fffffff) / 1073741824;&lt;br /&gt;
im weiteren wird diese Funktionalität mit Random( Pos ) bzw. Random( PosX, PosY ) verwendet.&lt;br /&gt;
&lt;br /&gt;
==[[Interpolation]]==&lt;br /&gt;
&lt;br /&gt;
Zwischen den Werten aus dem Array versucht man nun mit einer [[Interpolation]] schöne Übergänge zu schaffen. Am schnellsten ist die lineare [[Interpolation]], jedoch kann durch einen Trick auch eine Sinus artige [[Interpolation]] sehr schnell ablaufen. Auf den folgenden Bildern sieht man links linear [[Interpolation|interpolierte]] Höhenwerte und auf der rechten seite eine Sinus/Cosinus artige [[Interpolation]]. Die größern Punkte entsprechen den im Array abgespeicherten Zufallswerten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Interpolation.png|center]]&lt;br /&gt;
&lt;br /&gt;
Die [[Interpolation]]s funktion muss zunächst einmal die beiden zu interpolierenden Werte entgegen nehmen. Zusätzlich muss noch durch mindestens einen weiteren Parameter klar werden, welche Position (im obrigen Bild X) den gesuchte Wert haben soll.&lt;br /&gt;
&lt;br /&gt;
Wäre einem die Ausführgeschwindigkeit egal, könnten die beiden Interpolations Funktionen folgerndermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;//Hineis: nicht getestet&lt;br /&gt;
&lt;br /&gt;
function InterpoliereLinear(Wert1,Wert2,FaktorWert1:Real);&lt;br /&gt;
// Lineare Interpolation von zwei Werten &lt;br /&gt;
// FaktorWert1 muss zwischen 0 und 1 liegen&lt;br /&gt;
begin&lt;br /&gt;
  result := Wert1*FaktorWert1 + Wert2*(1-FaktorWert1);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function InterpoliereCos(Wert1,Wert2,FaktorWert1:Real);&lt;br /&gt;
// Cosinus/Sinus artige Interpolation von zwei werten; &lt;br /&gt;
// FaktorWert muss zwischen 0 und 1 liegen&lt;br /&gt;
begin&lt;br /&gt;
  result := Wert1*((cos(pi/2*FaktorWert1)+1)/2) + Wert2*(1-(cos(pi/2*FaktorWert1)+1)/2)&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedoch möchte man meistens möglichst schnelle Berechnungen haben. Besonders die Sinus und Cosinus Funktionen können unter Umständen zum Problem werden. Um trotzdem Sinuns- und Cosinus-Interpolation zu erzeugen kann man im Vorraus sich ein Array mit Interpolationswerten anlegen. Da Rechner schneller mit Integerwerten als mit Gleitkommerwerten rechnen werden wir im folgenden Beispiel erstere verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  Interpolation:array [0..Interpolation_Bereich-1]of Integer;&lt;br /&gt;
  //Interpoaltions_Bereich ist legt die Maximale Anzahl an Punkten fest,&lt;br /&gt;
  // die für zwei Interpolationswerte ermittelt werden können(inklusive Randpunkte).&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
  Interpolation_Max = 1000 // * entspricht dem Wert 1.000; &lt;br /&gt;
                           // * je höher dieser Wert deso genauer das Ergebnis.&lt;br /&gt;
                           // * je höher dieser Wert ist deso niedriger  müssen&lt;br /&gt;
                           //   die Interpolationswerte sein&lt;br /&gt;
&lt;br /&gt;
procedure BeimStart;&lt;br /&gt;
begin&lt;br /&gt;
{..}&lt;br /&gt;
  // Im Interpolations Array werden mit den Werten die von Interpolation_Max bis 0 gehen gefüllt.&lt;br /&gt;
  // wobei Interpolation[0] = Interpolation_Max ist&lt;br /&gt;
  // und Interploation[high(Interpolation)] = 0 ist&lt;br /&gt;
  for i := 0 to high(Interpolation) do Interpolation[I] := round((cos(pi/(Interpolation_Bereich-1)*i)+1)/2*Interpolation_Max);&lt;br /&gt;
{..}&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function Interpoliere(Wert1,Wert2:Integer;Nr,Von:Integer):Integer;&lt;br /&gt;
// Interpoliert zwischen 2 Werten&lt;br /&gt;
// Nr ist gibt den Punkt an den man ermitteln möchte. Von die Anzahl der Interpolations schrite&lt;br /&gt;
var&lt;br /&gt;
  Wert1_Faktor:Integer;&lt;br /&gt;
begin&lt;br /&gt;
  if Nr &amp;gt; Von then raise ERangeError.CreateFmt('Nr Wert %d nicht in 0..%d',[Nr,Von-1]);&lt;br /&gt;
  if Von &amp;gt; Interpolations_Bereich raise ERangeError.CreateFmt('Von Wert %d nicht in 0..%d',[0,-1]);&lt;br /&gt;
  Wert1_Faktor := Interpolation[(Interpolation_Bereich*  Nr)div Von];&lt;br /&gt;
  result := (Wert1*Wert1_Faktor) div Interpolation_Max&lt;br /&gt;
   + (Wert2*(1000 - Wert1_Faktor)) div Interpolation_Max;&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies wäre die [[Interpolation]] für eine 1 Dimensionale Positionsangabe. Natürlich müssen aber auch die anderen Dimensionen [[Interpolation|interpoliert]] werden. Dies kann aber (wenn gewünscht) ebenfalls mit mehreren [[Interpolation]]en von 2 Werten erfolgen&lt;br /&gt;
 PosX = Ganzzahl( Position.x )&lt;br /&gt;
 PosY = Ganzzahl( Position.y )&lt;br /&gt;
 X1 = Interpoliere( Random( PosX, PosY ), Random( PosX, PosY + 1 ), Nachkommateil( Position.y ) )&lt;br /&gt;
 X2 = Interpoliere( Random( PosX + 1, PosY), Random( PosX + 1, PosY + 1, Nachkommateil( Position.y ) )&lt;br /&gt;
 Ergebnis = Interpoliere( X1, X2, Nachkommateil( Position.x ) )&lt;br /&gt;
&lt;br /&gt;
=Algorithmus=&lt;br /&gt;
Mit den oben beschriebenen Funktionen ist der Algorithmus recht schnell zu machen.&lt;br /&gt;
&lt;br /&gt;
==Die Parameter==&lt;br /&gt;
Der Perlin Noise Algorithmus erhält üblicherweise folgende Parameter:&lt;br /&gt;
*Double: Position (Die Position wird bereits entsprechend skaliert)&lt;br /&gt;
*Double: Persistenz (wie stark ist der Einfluss der höheren Frequenzen)&lt;br /&gt;
*Wertebereich: Double: Min, Double: Max&lt;br /&gt;
*Integer: Rechentiefe (Detailgrad)&lt;br /&gt;
*Gegebenenfalls Double: Frequenzfaktor (oder Standard auf 2)&lt;br /&gt;
Die Laufzeit für einen berechneten Wert beträgt [[O-Notation|O]]( n ) wobei n die Rechentiefe angibt.&lt;br /&gt;
&lt;br /&gt;
==Überlagerung der Frequenzen==&lt;br /&gt;
Es wird für jeden Detailgrad ein Wert berechnet. Da Perlin Noise für einen einzelnen Wert kaum Sinn macht und im Normalfall für mehrere nebeneinander liegende Positionen ein Wert berechnet wird, kann man auch von Frequenzbändern sprechen. Der Code könnte beispielsweise so aussehen:&lt;br /&gt;
 Wert = 0&lt;br /&gt;
 Für jeden Detailgrad&lt;br /&gt;
  Wert = Wert + InterpolierterWert( Position * Frequenz )&lt;br /&gt;
  Frequenz = Frequenz * Frequenzfaktor&lt;br /&gt;
Wie hier unschwer zu erkennen ist werden die Werte addiert (also überlagert).&lt;br /&gt;
&lt;br /&gt;
[[Bild:PerlinUeberlagerung.png|center|framed|''Abb.1: Frequenzbänder für 200 Werte (Pixel).''&amp;lt;br&amp;gt;&lt;br /&gt;
''Frequenzfaktor = 2; Persitenz = 0.5;''&amp;lt;br&amp;gt;&lt;br /&gt;
''Links oben: Frequenz 0.01 (Einheit = Pixel)''&amp;lt;br&amp;gt;&lt;br /&gt;
''Rechts oben: Frequenz 0.02''&amp;lt;br&amp;gt;&lt;br /&gt;
''Links unten: Frequenz 0.04''&amp;lt;br&amp;gt;&lt;br /&gt;
''Rechts unten: überlagerte (addierte) Frequenzbänder (für die ersten 3 Detailgrade)'']]&lt;br /&gt;
&lt;br /&gt;
==Rechentiefe==&lt;br /&gt;
Die Rechentiefe gibt an wie hoch der Detailgrad sein soll. In Abbildung 1 (siehe Frequenzen) wurde beispielsweise eine Rechentiefe von 3 verwendet. Bei einem 2 Dimensionalen Perlin Noise dürfte dies jedoch deutlichere Unterschiede zeigen (siehe Abbildung 2).&lt;br /&gt;
&lt;br /&gt;
[[Bild:PerlinTiefe.png|center|framed|''Abb. 2: Unterschiedliche Rechentiefen.''&amp;lt;br&amp;gt;&lt;br /&gt;
''Frequenzfaktor = 2; Persitenz = 0.5;''&amp;lt;br&amp;gt;&lt;br /&gt;
''Links oben: Rechentiefe 1''&amp;lt;br&amp;gt;&lt;br /&gt;
''Rechts oben: Rechentiefe 2''&amp;lt;br&amp;gt;&lt;br /&gt;
''Links unten: Rechentiefe 3''&amp;lt;br&amp;gt;&lt;br /&gt;
''Rechts unten: Rechentiefe 4'']]&lt;br /&gt;
&lt;br /&gt;
==Persistenz==&lt;br /&gt;
Die Persistenz gibt an wie stark die höheren Frequenzbänder Einfluss auf das Ergebnis haben sollen. Hierfür erweitern wir den unter '''Überlagerung der Frequenzen''' angegebenen Code:&lt;br /&gt;
 Wert = 0&lt;br /&gt;
 Faktor = 1&lt;br /&gt;
 Für Detailgrad = 1 bis Rechentiefe&lt;br /&gt;
  Wert = Wert + InterpolierterWert( Position * Frequenz ) * Faktor&lt;br /&gt;
  Frequenz = Frequenz * Frequenzfaktor&lt;br /&gt;
  Faktor = Faktor * Persistenz&lt;br /&gt;
&lt;br /&gt;
[[Bild:PerlinPersistenz.png|center|framed|&lt;br /&gt;
''Abb. 3: Unterschiedliche Persitenzen.''&amp;lt;br&amp;gt;&lt;br /&gt;
''Frequenzfaktor = 2; Rechentiefe = 5''&amp;lt;br&amp;gt;&lt;br /&gt;
''Links oben: Persistenz 0.2''&amp;lt;br&amp;gt;&lt;br /&gt;
''Rechts oben: Persistenz 0.4''&amp;lt;br&amp;gt;&lt;br /&gt;
''Links unten: Persistenz 0.6''&amp;lt;br&amp;gt;&lt;br /&gt;
''Rechts unten: Persistenz 0.8'']]&lt;br /&gt;
&lt;br /&gt;
==Der Wertebereich==&lt;br /&gt;
Bisher wurden zwar in den Bildern die Werte korrekt dargestellt, jedoch wurde noch nicht erklärt wie man zu diesen Werten kommt. Wir möchten nun den Code welcher unter Persistenz angegeben wurde so modifizieren, das er Werte für den Wertebereich [Min|Max] liefert. Betrachten wir vorerst was wir alles verwenden:&lt;br /&gt;
*InterpolierterWert( Position * Frequenz ): liefert einen Wert im Bereich [-1|1]&lt;br /&gt;
*Faktor: zu Beginn 1, wird bei jeden Durchlauf mit Persistenz multipliziert&lt;br /&gt;
*Frequenz und Frequenzfaktor: spielen für die Amplitude keine Rolle&lt;br /&gt;
Der Gesamtfaktor lässt sich recht einfach berechnen:&lt;br /&gt;
 Faktor = 1&lt;br /&gt;
 GesFaktor = 0&lt;br /&gt;
 Für Deteilgrad = 1 bis Rechentiefe&lt;br /&gt;
  GesFaktor = GesFaktor + Faktor&lt;br /&gt;
  Faktor = Faktor * Persistenz&lt;br /&gt;
Mit dem errechneten Gesamtfaktor wissen wir nun, das die Funktion einen Wert im Bereich &lt;br /&gt;
&lt;br /&gt;
[-GesFaktor|+GesFaktor] liefert. Nun brauchen wir nur noch die Amplitude skalieren und einen entsprechenden Offset für das Minimum addieren. Dies sieht im Endeffekt so aus:&lt;br /&gt;
&lt;br /&gt;
Initialisierung:&lt;br /&gt;
 Bereich = Max - Min;   &lt;br /&gt;
 Offset = Min + Bereich * 0.5;&lt;br /&gt;
 GesFaktor = 0;&lt;br /&gt;
 Faktor = 2;&lt;br /&gt;
 &lt;br /&gt;
 für 1 bis Rechentiefe&lt;br /&gt;
   GesFaktor += Faktor&lt;br /&gt;
   Faktor = Faktor * Persistenz&lt;br /&gt;
 &lt;br /&gt;
 Tiefe_1_Amplitude =   Bereich / GesFaktor&lt;br /&gt;
&lt;br /&gt;
Berechnung eines Wertes:&lt;br /&gt;
 Wert = 0&lt;br /&gt;
 Faktor = Tiefe_1_Amplitude&lt;br /&gt;
 Frequenz = 1&lt;br /&gt;
 Für Detailgrad = 1 bis Rechentiefe&lt;br /&gt;
   Wert = Wert + InterpolierterWert( Position * Frequenz ) * Faktor&lt;br /&gt;
   Frequenz = Frequenz * Frequenzfaktor&lt;br /&gt;
   Faktor = Faktor * Persistenz&lt;br /&gt;
 &lt;br /&gt;
 Wert = Wert + Offset&lt;br /&gt;
&lt;br /&gt;
= Weiterführendes =&lt;br /&gt;
== Einsatzgebiete ==&lt;br /&gt;
Neben der Generierung von Texturen und [[Highmap]]s - welche von den Grafiken und Quellcodes in diesem Artikel bevorzugt behandelt wurden - gibt es natürlich noch andere Einsatzgebiete. Einige davon sind:&lt;br /&gt;
* Animation, also gehen, Mimik oder jede andere Form von Bewegung kann durch Perlin Noise abwechslungsreicher und somit etwas &amp;quot;menschlicher&amp;quot; gestaltet werden. Der Erfinder Ken Perlin hat hierfür auf seiner [http://mrl.nyu.edu/~perlin/ Homepage] ein paar gute Beispiele.&lt;br /&gt;
* Modifikation von Meshes: was bei [[Highmap]]s am offensichtlichesten ist kann man auch auf eine Kugel anwenden um einen wunderbar unregelmäßigen, aber dennoch realistisch wirkenden Stein, Planeten oder einen Kometen daraus zu machen.&lt;br /&gt;
* Denkbar wäre die Verwendung von Perlin Noise natürlich auch für verschiedenste Umwelteinflüsse wie Wind (was sich sowohl in Animationen als auch Geräuschlautstärke auswirken kann), aber natürlich auch für künstliche Einflüsse wie Börsenkurse in einem Strategiespiel.&lt;br /&gt;
&lt;br /&gt;
== Erweiterungen ==&lt;br /&gt;
Perlin Noise kann (wie nahezu jeder andere Algorithmus auch) nach eigenen Wünschen modifiziert werden. Häufige Modifikationen sind:&lt;br /&gt;
* Tilebare Texturen erstellen, also Texturen welche links und rechts - und ggf. auch oben und unten - exakt gleich aussehen. Dieses Problem wird in [http://www.delphigl.com/forum/viewtopic.php?t=3859&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;start=15 diesem DGL-Forenthread (ab Seite 2)] etwas näher behandelt.&lt;br /&gt;
* Nachbearbeitung der Ausgabewerte. Hier können wir das endgültige Resultat noch sehr stark verändern. Denkbar wäre hier beispielsweise, dass wir die Unterwasser und über Wasser - Landschaft ganz unterschiedlich skalieren. Das eindrucksvollste Beispiel hierfür dürfte jedoch ein Algorithmus für eine [[Himmel]]stextur sein, welcher [http://freespace.virgin.net/hugo.elias/models/m_clouds.htm hier] zu finden ist. Dieser Algorithmus verwendet einfaches Perlin Noise, modifiziert jedoch die Ausgabewerte mit einer Exponentialfunktion, wodurch eine (meines Erachtens) eindrucksvolle Wolkendecke entsteht. Das endgültige Ergebnis des Algorithmus beinhaltet natürlich noch etwas mehr als diese einfache Exponentialfunktion, jedoch könnte man auch dies im weiteren Sinne als Modifikation der Ausgabewerte sehen.&lt;br /&gt;
&lt;br /&gt;
== Verwandte Themen ==&lt;br /&gt;
Die Dekomprimierung von JPEG-Bildern basiert auf der Überlagerungen von Cosinus-Schwingungen einer vorgegebenen Frequenz und einer (von Bild zu Bild) variierenden Amplitude. Diese Überlagerung ist sehr ähnlich der Frequenzüberlagerung beim Perlin Noise. Der Unterschied ist natürlich, dass bei JPEG Cosinus Schwingungen verwendet werden und beim Perlin Noise zufällige Werte welche [[Interpolation|interpoliert]] werden.&lt;br /&gt;
&lt;br /&gt;
Die Komprimierung von JPEG-Bildern bildet nun das Gegenteil der Überlagerung von Cosinus-Schwingungen, also der Berechnung der Amplituden der einzelnen Frequenzen. Derartige Berechnungen basieren alle auf der Fourier Transformation.&lt;br /&gt;
&lt;br /&gt;
Also wenn ihr nun verstanden habt wozu die Überlagerung von verschiedenen Frequenzbändern in der Lage ist (wofür dieser Artikel hoffentlich hilfreich war), euch diverse Themen der Mathematik wie integrieren, differenzieren und vor allem Regression nicht allzu sehr abschrecken und ihr immer schon mal wissen wolltet wie derartige Bildkompression oder die Frequenzbalken eurer Audiowidergabe entstehen, wäre wohl nun ein (neuer?) Anlauf vielversprechend.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]]&lt;/div&gt;</summary>
		<author><name>Lyr</name></author>	</entry>

	</feed>