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

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tiefentest&amp;diff=24704</id>
		<title>Tiefentest</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tiefentest&amp;diff=24704"/>
				<updated>2010-02-20T10:50:55Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: Hinweis auf glDepthMask&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]](ZBuffer). 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 Tiefenpuffer 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;
Den Tiefentest aktiviert man mit [[glEnable#GL_DEPTH_TEST|glEnable(GL_DEPTH_TEST)]] und deaktiviert ihn entsprechend mit glDisable.&lt;br /&gt;
&lt;br /&gt;
Außerdem kann man mit [[glDepthMask]] einstellen, ob beim Rendern des momentanen Objektes der Tiefenbuffer beschrieben werden soll oder nicht.&lt;br /&gt;
&lt;br /&gt;
===Aufteilung des Tiefenpuffers===&lt;br /&gt;
Was steht im Tiefenpuffer? Im Tiefenpuffer steht nicht die Tiefe sondern die Tiefenzone. Beim erstellen der [[Renderkontext]]s wird angegeben, wie viele Bits für den ZBuffer zur Verfügung stehen. Bei 1Bit, gibt es genau 2^1=2 Tiefenzonen. Bei 4Bit 2^4=16 und bei 24Bit 2^24=16,7Mio Tiefenzonen. Der Bereich zwischen der Near- und Far-[[Clipping]]plane wird nun auf diese Zonen aufgeteilt. Fallen zwei Fragmente in die selbe Zone, entscheidet das durch [[glDepthFunc]] eingestellte Verhalten welches Fragment den Platz behalten/einnehmen darf.&lt;br /&gt;
&lt;br /&gt;
'''Ein simples Beispiel'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Hinweis|Die Werte wurden in diesem Beispiel so gewählt, dass ganze Zahlen herauskommen. Das ist in der Realität sehr unwahrscheinlich.}}&lt;br /&gt;
ZNear liegt bei 1, ZFar liegt bei 257. Das heißt der Renderbereich ist 256 Einheiten groß.&lt;br /&gt;
Dem ZBuffer wurden nur 4Bit gegönnt (eine sehr niedrige Auflösung). Das heißt 16 Zonen.&lt;br /&gt;
Jede Tiefenzone ist (bei linearer Aufteilung) 256/16=16 OpenGL Einheiten tief.&lt;br /&gt;
&lt;br /&gt;
Wird nun ein Fragment erzeugt, welches den Abstand z=17 zur Kamera hat (also Zone 2 von vorn) und ein anderes Fragment den Abstand z=35 hat (Zone 3) ist klar, welches Fragment näher ist.&lt;br /&gt;
Nehmen wir an es kommt ein drittes Fragment hinzu mit dem Abstand 20. Für uns ist klar, dass dieses hinter dem ersten Fragment gehört. Allerdings ist der ZBuffer nicht fein genug aufgelöst, um das genauso zu sehen. Für ihn fällt auch dieses Fragment in Zone 2 und unter Umständen entscheidet die glDepthFunc Einstellung nun sogar, dass das neue Fragment das alte überschreiben darf. D.h. das 3. Fragment ist sichtbar obwohl es verdeckt sein sollte!&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass nicht Bitanzahl des ZBuffers allein, die Auflösung bestimmt. Auch die Distanz zwischen den beiden Clippingplanes spielt eine Rolle. Je größer diese wird, desto grober wird der ZBuffer aufgelöst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Depthtest_nt_enabled.jpg|thumb|200px|Aktivierter Tiefentest]]&lt;br /&gt;
[[Bild:Depthtest_nt_disabled.jpg|thumb|200px|Deaktivierter Tiefentest]]&lt;br /&gt;
Dieser Rendercode wird einmal mit und einmal ohne Tiefentest verwendet.&lt;br /&gt;
   glBegin(GL_QUADS);&lt;br /&gt;
     glColor4f(1.0, 0.5, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.0, -1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.0, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.0, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.0, -1.0);&lt;br /&gt;
 &lt;br /&gt;
     glColor4f(0.5, 1.0, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.5, -1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.5, -1.0);&lt;br /&gt;
   glEnd;&lt;br /&gt;
&lt;br /&gt;
Man kann deutlich erkennen, dass bei deaktiviertem Tiefentest das eigentlich vorne liegende rote Quad vom weiter hinten liegenden, allerdings später gerenderten, grünen Quad überdeckt wird.&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>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Tiefentest&amp;diff=24703</id>
		<title>Tiefentest</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Tiefentest&amp;diff=24703"/>
				<updated>2010-02-20T10:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: /* Funktionsweise */&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]](ZBuffer). 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 Tiefenpuffer 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;
Den Tiefentest aktiviert man mit [[glEnable#GL_DEPTH_TEST|glEnable(GL_DEPTH_TEST)]] und deaktiviert ihn entsprechend mit glDisable.&lt;br /&gt;
&lt;br /&gt;
Außerdem kann man mit [glDepthMask] einstellen, ob beim Rendern des momentanen Objektes der Tiefenbuffer beschrieben werden soll oder nicht.&lt;br /&gt;
&lt;br /&gt;
===Aufteilung des Tiefenpuffers===&lt;br /&gt;
Was steht im Tiefenpuffer? Im Tiefenpuffer steht nicht die Tiefe sondern die Tiefenzone. Beim erstellen der [[Renderkontext]]s wird angegeben, wie viele Bits für den ZBuffer zur Verfügung stehen. Bei 1Bit, gibt es genau 2^1=2 Tiefenzonen. Bei 4Bit 2^4=16 und bei 24Bit 2^24=16,7Mio Tiefenzonen. Der Bereich zwischen der Near- und Far-[[Clipping]]plane wird nun auf diese Zonen aufgeteilt. Fallen zwei Fragmente in die selbe Zone, entscheidet das durch [[glDepthFunc]] eingestellte Verhalten welches Fragment den Platz behalten/einnehmen darf.&lt;br /&gt;
&lt;br /&gt;
'''Ein simples Beispiel'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Hinweis|Die Werte wurden in diesem Beispiel so gewählt, dass ganze Zahlen herauskommen. Das ist in der Realität sehr unwahrscheinlich.}}&lt;br /&gt;
ZNear liegt bei 1, ZFar liegt bei 257. Das heißt der Renderbereich ist 256 Einheiten groß.&lt;br /&gt;
Dem ZBuffer wurden nur 4Bit gegönnt (eine sehr niedrige Auflösung). Das heißt 16 Zonen.&lt;br /&gt;
Jede Tiefenzone ist (bei linearer Aufteilung) 256/16=16 OpenGL Einheiten tief.&lt;br /&gt;
&lt;br /&gt;
Wird nun ein Fragment erzeugt, welches den Abstand z=17 zur Kamera hat (also Zone 2 von vorn) und ein anderes Fragment den Abstand z=35 hat (Zone 3) ist klar, welches Fragment näher ist.&lt;br /&gt;
Nehmen wir an es kommt ein drittes Fragment hinzu mit dem Abstand 20. Für uns ist klar, dass dieses hinter dem ersten Fragment gehört. Allerdings ist der ZBuffer nicht fein genug aufgelöst, um das genauso zu sehen. Für ihn fällt auch dieses Fragment in Zone 2 und unter Umständen entscheidet die glDepthFunc Einstellung nun sogar, dass das neue Fragment das alte überschreiben darf. D.h. das 3. Fragment ist sichtbar obwohl es verdeckt sein sollte!&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass nicht Bitanzahl des ZBuffers allein, die Auflösung bestimmt. Auch die Distanz zwischen den beiden Clippingplanes spielt eine Rolle. Je größer diese wird, desto grober wird der ZBuffer aufgelöst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Depthtest_nt_enabled.jpg|thumb|200px|Aktivierter Tiefentest]]&lt;br /&gt;
[[Bild:Depthtest_nt_disabled.jpg|thumb|200px|Deaktivierter Tiefentest]]&lt;br /&gt;
Dieser Rendercode wird einmal mit und einmal ohne Tiefentest verwendet.&lt;br /&gt;
   glBegin(GL_QUADS);&lt;br /&gt;
     glColor4f(1.0, 0.5, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.0, -1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.0, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.0, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.0, -1.0);&lt;br /&gt;
 &lt;br /&gt;
     glColor4f(0.5, 1.0, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.5, -1.0);&lt;br /&gt;
     glVertex3f(-1.0, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.5, 1.0);&lt;br /&gt;
     glVertex3f(1.0, 0.5, -1.0);&lt;br /&gt;
   glEnd;&lt;br /&gt;
&lt;br /&gt;
Man kann deutlich erkennen, dass bei deaktiviertem Tiefentest das eigentlich vorne liegende rote Quad vom weiter hinten liegenden, allerdings später gerenderten, grünen Quad überdeckt wird.&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>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22055</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22055"/>
				<updated>2008-08-11T13:48:19Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: Hinweis auf VBOs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ergebnis sollte nun so aussehen:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Varray.png‎]]&lt;br /&gt;
&lt;br /&gt;
====Die kompletten C-Dateien====&lt;br /&gt;
Der Übersicht halber die komplette vertexarray.h:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#ifndef _VERTEXARRAY_H&lt;br /&gt;
#define _VERTEXARRAY_H&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Und die vertexarray.c:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;vertexArray.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GL/glut.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /* Index-Array */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hinweis zu dem Array===&lt;br /&gt;
In dem Minimalbeispiel wurde für Vertices und Farben das selbe Array verwendet. Meistens ist es sinnvoller, das in verschiedenen Arrays zu halten. Die entsprechenden Aufrufe, die OpenGL die Pointer mitteilen, müssen dann natürlich entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
==Weiterführendes==&lt;br /&gt;
&lt;br /&gt;
===Weitere Pointer===&lt;br /&gt;
Bisher wurden nur Vertices und Farben als Array benutzt. Nützlich sind noch Pointer auf Normale und Texturkoordinaten. Dazu müssen die entsprechenden Clientstates aktiviert werden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
OpenGL muss natürlich im Init entsprechende Pointer mittels [[glNormalPointer]] und [[glTexCoordPointer]] bekommen.&lt;br /&gt;
Die entsprechenden Werte funktionieren genau so wie bei dem Colorpointer.&amp;lt;br&amp;gt;&lt;br /&gt;
Desweiteren gibt es noch diese Pointer:&lt;br /&gt;
*[[glFogCoordPointer]] setzt einen Pointer auf Nebelkoordinaten.&lt;br /&gt;
*[[glSecondaryColorPointer]] setzt einen Pointer auf Sekundärfarben, siehe [[glSecondaryColor]].&lt;br /&gt;
&lt;br /&gt;
===Weitere Zeichenfunktionen===&lt;br /&gt;
Neben [[glDrawElements]] gibt es noch weitere Funktionen, um ein Vertexarray zu zeichnen.&lt;br /&gt;
*[[glDrawRangeElements]] funktioniert wie [[glDrawElements]], jedoch kann hier ein Start- und Endindex angegeben werden.&lt;br /&gt;
*[[glArrayElement]] zeichnet ein einzelnes Element des Vertexarrays.&lt;br /&gt;
*[[glDrawArrays]] zeichnet ein komplettes Vertexarray ohne Indexarray.&lt;br /&gt;
*[[glMultiDrawArrays]] funktioniert ähnlich wie [[glDrawArrays]], nimmt aber Arrays für die Start- und Endwerte und arbeitet die so ab, als ob [[glDrawArrays]] entsprechend in einer Schleife aufgerufen werden würde.&lt;br /&gt;
*[[glMultiDrawElements]]funktioniert ähnlich wie [[glDrawElements]], nimmt aber statt eines Indexarrays ein Array von Indexarrays und arbeitet es so ab, als ob [[glDrawElements]]in einer Schleife aufgerufen werden würde.&lt;br /&gt;
&lt;br /&gt;
===Anwendungshinweise===&lt;br /&gt;
Vertex-Arrays sind zwar weitaus besser als der Immediate-Mode mit [[glBegin]]/[[glEnd]], aber noch nicht das Wahre. Weitaus performanter sind Vertexbufferobjekte. Sie arbeiten ähnlich wie Vertexarrays, bloß dass die Daten nicht im Hauptspeicher liegen, sondern direkt im Grafikkartenspeicher. Es gibt im Wiki hier ein Tutorial dazu: [[Tutorial_Vertexbufferobject]]&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22050</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22050"/>
				<updated>2008-08-11T01:16:33Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: Weitere Zeichenfunktionen und Pointer angerissen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ergebnis sollte nun so aussehen:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Varray.png‎]]&lt;br /&gt;
&lt;br /&gt;
====Die kompletten C-Dateien====&lt;br /&gt;
Der Übersicht halber die komplette vertexarray.h:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#ifndef _VERTEXARRAY_H&lt;br /&gt;
#define _VERTEXARRAY_H&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Und die vertexarray.c:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;vertexArray.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GL/glut.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /* Index-Array */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hinweis zu dem Array===&lt;br /&gt;
In dem Minimalbeispiel wurde für Vertices und Farben das selbe Array verwendet. Meistens ist es sinnvoller, das in verschiedenen Arrays zu halten. Die entsprechenden Aufrufe, die OpenGL die Pointer mitteilen, müssen dann natürlich entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
==Weiterführendes==&lt;br /&gt;
&lt;br /&gt;
===Weitere Pointer===&lt;br /&gt;
Bisher wurden nur Vertices und Farben als Array benutzt. Nützlich sind noch Pointer auf Normale und Texturkoordinaten. Dazu müssen die entsprechenden Clientstates aktiviert werden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
OpenGL muss natürlich im Init entsprechende Pointer mittels [[glNormalPointer]] und [[glTexCoordPointer]] bekommen.&lt;br /&gt;
Die entsprechenden Werte funktionieren genau so wie bei dem Colorpointer.&amp;lt;br&amp;gt;&lt;br /&gt;
Desweiteren gibt es noch diese Pointer:&lt;br /&gt;
*[[glFogCoordPointer]] setzt einen Pointer auf Nebelkoordinaten.&lt;br /&gt;
*[[glSecondaryColorPointer]] setzt einen Pointer auf Sekundärfarben, siehe [[glSecondaryColor]].&lt;br /&gt;
&lt;br /&gt;
===Weitere Zeichenfunktionen===&lt;br /&gt;
Neben [[glDrawElements]] gibt es noch weitere Funktionen, um ein Vertexarray zu zeichnen.&lt;br /&gt;
*[[glDrawRangeElements]] funktioniert wie [[glDrawElements]], jedoch kann hier ein Start- und Endindex angegeben werden.&lt;br /&gt;
*[[glArrayElement]] zeichnet ein einzelnes Element des Vertexarrays.&lt;br /&gt;
*[[glDrawArrays]] zeichnet ein komplettes Vertexarray ohne Indexarray.&lt;br /&gt;
*[[glMultiDrawArrays]] funktioniert ähnlich wie [[glDrawArrays]], nimmt aber Arrays für die Start- und Endwerte und arbeitet die so ab, als ob [[glDrawArrays]] entsprechend in einer Schleife aufgerufen werden würde.&lt;br /&gt;
*[[glMultiDrawElements]]funktioniert ähnlich wie [[glDrawElements]], nimmt aber statt eines Indexarrays ein Array von Indexarrays und arbeitet es so ab, als ob [[glDrawElements]]in einer Schleife aufgerufen werden würde.&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22049</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22049"/>
				<updated>2008-08-11T00:19:54Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: Layout bischen geändert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ergebnis sollte nun so aussehen:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Varray.png‎]]&lt;br /&gt;
&lt;br /&gt;
====Die kompletten C-Dateien====&lt;br /&gt;
Der Übersicht halber die komplette vertexarray.h:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#ifndef _VERTEXARRAY_H&lt;br /&gt;
#define _VERTEXARRAY_H&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Und die vertexarray.c:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;vertexArray.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GL/glut.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /* Index-Array */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
===Wie geht es weiter?===&lt;br /&gt;
Bisher wurden nur Vertices und Farben als Array benutzt. Nützlich sind noch Pointer auf Normale und Texturkoordinaten. Dazu müssen die entsprechenden Clientstates aktiviert werden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
OpenGL muss natürlich im Init entsprechende Pointer mittels [[glNormalPointer]] und [[glTexCoordPointer]] bekommen.&lt;br /&gt;
Die entsprechenden Werte funktionieren genau so wie bei dem Colorpointer.&lt;br /&gt;
&lt;br /&gt;
In dem Minimalbeispiel wurde für Vertices und Farben das selbe Array verwendet. Meistens ist es sinnvoller, das in verschiedenen Arrays zu halten. Die entsprechenden Aufrufe, die OpenGL die Pointer mitteilen, müssen dann natürlich entsprechend angepasst werden.&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22048</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22048"/>
				<updated>2008-08-11T00:08:35Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: /* Die Initialisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Vertexarray===&lt;br /&gt;
&lt;br /&gt;
Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ergebnis sollte nun so aussehen:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Varray.png‎]]&lt;br /&gt;
&lt;br /&gt;
====Die kompletten C-Dateien====&lt;br /&gt;
Der Übersicht halber die komplette vertexarray.h:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#ifndef _VERTEXARRAY_H&lt;br /&gt;
#define _VERTEXARRAY_H&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Und die vertexarray.c:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;vertexArray.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GL/glut.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /* Index-Array */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
===Wie geht es weiter?===&lt;br /&gt;
Bisher wurden nur Vertices und Farben als Array benutzt. Nützlich sind noch Pointer auf Normale und Texturkoordinaten. Dazu müssen die entsprechenden Clientstates aktiviert werden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
OpenGL muss natürlich im Init entsprechende Pointer mittels [[glNormalPointer]] und [[glTexCoordPointer]] bekommen.&lt;br /&gt;
Die entsprechenden Werte funktionieren genau so wie bei dem Colorpointer.&lt;br /&gt;
&lt;br /&gt;
In dem Minimalbeispiel wurde für Vertices und Farben das selbe Array verwendet. Meistens ist es sinnvoller, das in verschiedenen Arrays zu halten. Die entsprechenden Aufrufe, die OpenGL die Pointer mitteilen, müssen dann natürlich entsprechend angepasst werden.&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22047</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22047"/>
				<updated>2008-08-11T00:00:43Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: /* Wie geht es weiter? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Vertexarray===&lt;br /&gt;
&lt;br /&gt;
Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ergebnis sollte nun so aussehen:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Varray.png‎]]&lt;br /&gt;
&lt;br /&gt;
====Die kompletten C-Dateien====&lt;br /&gt;
Der Übersicht halber die komplette vertexarray.h:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#ifndef _VERTEXARRAY_H&lt;br /&gt;
#define _VERTEXARRAY_H&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Und die vertexarray.c:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;vertexArray.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GL/glut.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /* Index-Array */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
===Wie geht es weiter?===&lt;br /&gt;
Bisher wurden nur Vertices und Farben als Array benutzt. Nützlich sind noch Pointer auf Normale und Texturkoordinaten. Dazu müssen die entsprechenden Clientstates aktiviert werden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
OpenGL muss natürlich im Init entsprechende Pointer mittels [[glNormalPointer]] und [[glTexCoordPointer]] bekommen.&lt;br /&gt;
Die entsprechenden Werte funktionieren genau so wie bei dem Colorpointer.&lt;br /&gt;
&lt;br /&gt;
In dem Minimalbeispiel wurde für Vertices und Farben das selbe Array verwendet. Meistens ist es sinnvoller, das in verschiedenen Arrays zu halten. Die entsprechenden Aufrufe, die OpenGL die Pointer mitteilen, müssen dann natürlich entsprechend angepasst werden.&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22046</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22046"/>
				<updated>2008-08-10T23:54:46Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: V1 fertig.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Vertexarray===&lt;br /&gt;
&lt;br /&gt;
Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ergebnis sollte nun so aussehen:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Varray.png‎]]&lt;br /&gt;
&lt;br /&gt;
====Die kompletten C-Dateien====&lt;br /&gt;
Der Übersicht halber die komplette vertexarray.h:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#ifndef _VERTEXARRAY_H&lt;br /&gt;
#define _VERTEXARRAY_H&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Und die vertexarray.c:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;vertexArray.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GL/glut.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /* Index-Array */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
===Wie geht es weiter?===&lt;br /&gt;
Bisher wurden nur Vertices und Farben als Array benutzt. Nützlich sind noch Pointer auf Normale und Texturkoordinaten. Dazu müssen die entsprechenden Clientstates aktiviert werden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
OpenGL muss natürlich im Init entsprechende Pointer mittels [[glNormalPointer]] und [[glTexCoordPointer]] bekommen.&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22045</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22045"/>
				<updated>2008-08-10T23:54:25Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Offline}}&lt;br /&gt;
&lt;br /&gt;
===Vertexarray===&lt;br /&gt;
&lt;br /&gt;
Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ergebnis sollte nun so aussehen:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Varray.png‎]]&lt;br /&gt;
&lt;br /&gt;
====Die kompletten C-Dateien====&lt;br /&gt;
Der Übersicht halber die komplette vertexarray.h:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#ifndef _VERTEXARRAY_H&lt;br /&gt;
#define _VERTEXARRAY_H&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Und die vertexarray.c:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;vertexArray.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GL/glut.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /* Index-Array */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
===Wie geht es weiter?===&lt;br /&gt;
Bisher wurden nur Vertices und Farben als Array benutzt. Nützlich sind noch Pointer auf Normale und Texturkoordinaten. Dazu müssen die entsprechenden Clientstates aktiviert werden:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
OpenGL muss natürlich im Init entsprechende Pointer mittels [[glNormalPointer]] und [[glTexCoordPointer]] bekommen.&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Datei:Varray.png&amp;diff=22044</id>
		<title>Datei:Varray.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Datei:Varray.png&amp;diff=22044"/>
				<updated>2008-08-10T23:45:26Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22043</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22043"/>
				<updated>2008-08-10T23:39:16Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: Meilenstein 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Offline}}&lt;br /&gt;
&lt;br /&gt;
===Vertexarray===&lt;br /&gt;
&lt;br /&gt;
Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(indices);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieses Minimalbeispiel soll nur verdeutlichen, wie Vertexarrays prinzipiell funktionieren. Pro Vertex gibt es natürlich noch andere interessante Informationen wie dessen Normale, dessen Farbe und Texturkoordinate. Dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
===Umsetzung in C===&lt;br /&gt;
Das Beispiel von eben soll nun in wirklichen Code umgesetzt werden. Dazu sind zwei Schritte nötig:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Die Initialisierung.&lt;br /&gt;
2. Das eigentliche Zeichnen&lt;br /&gt;
====Die Initialisierung====&lt;br /&gt;
Als erstes definieren wir einen Vertex:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
	GLfloat x, y, z;&lt;br /&gt;
	GLfloat r, g, b;&lt;br /&gt;
} Vertex;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Dieser Typ besteht aus zwei Teilen: Einmal 3 Floats für die Koordinate und einmal 3 Floats für die Farbe.&lt;br /&gt;
Das Vertexarray besteht eben aus einem Array mit diesem Typen. Bei einer Zeile sind die ersten drei Zahlen die Koordinate und die nächsten drei die Farbe&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const Vertex vertices[18] = {&lt;br /&gt;
	0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,&lt;br /&gt;
	0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,&lt;br /&gt;
	1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,&lt;br /&gt;
	2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,&lt;br /&gt;
	2.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f&lt;br /&gt;
	};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Nun müssen noch die Indices aufgebaut werden:&lt;br /&gt;
GLuint *indices;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
static const GLuint indices[8] = {&lt;br /&gt;
	0, 2, 3, 1, 2, 4, 5, 3&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
static int indexCount = 8;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Damit hätten wir alle Daten beisammen. Nun muss nur noch OpenGL davon wissen.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void initVertexArray(void) {&lt;br /&gt;
	glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
	glEnableClientState(GL_COLOR_ARRAY);&lt;br /&gt;
&lt;br /&gt;
	glVertexPointer(3, /* Komponenten pro Vertex (x,y,z) */&lt;br /&gt;
			GL_FLOAT, /* Typ der Komponenten */&lt;br /&gt;
			sizeof(Vertex), /* Offset zwischen 2 Vertizes im Array */&lt;br /&gt;
			&amp;amp;(vertices[0].x)); /* Zeiger auf die 1. Komponente */&lt;br /&gt;
&lt;br /&gt;
	glColorPointer (3, GL_FLOAT, sizeof(Vertex), &amp;amp;(vertices[0].r));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Was geschieht hier?&amp;lt;br&amp;gt;&lt;br /&gt;
Als erstes wird das Vertex-Array eingeschaltet sowie das zugehörige Farbarray.&lt;br /&gt;
Dann wird als erstes der Vertexpointer gesetzt. Der erste Parameter sagt, dass es 3 Komponenten pro Vertex sind (x, y, z), der zweite, dass es sich um Floats handelt, der dritte der Offset zwischen zwei Vertices im Array (Wie viele Bytes er überspringen muss um zum nächsten Vertex zu gelangen) und der Dritte ist ein Pointer auf das erste Vertex.&lt;br /&gt;
Genau so sieht der Colorpointer aus.&lt;br /&gt;
&lt;br /&gt;
====Das eigentliche Zeichnen====&lt;br /&gt;
Nun, da alles initialisiert ist, sollen die Quads auch auf den Bildschirm. Dazu folgende Funktion:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void drawVertexArray(void) {&lt;br /&gt;
	glDrawElements(GL_QUADS, /* Primitivtyp */&lt;br /&gt;
		indexCount, /* Anzahl Indizes */&lt;br /&gt;
		GL_UNSIGNED_INT, /* Typ der Indizes */&lt;br /&gt;
		indices); /*Index-Array*/&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Als erstes wird gesagt, dass die gezeichneten Elemente Quads sind. Dann kommt die Anzahl der Indices sowie deren Typ. Als letztes das eigentliche Indexarray.&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22041</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22041"/>
				<updated>2008-08-10T22:54:53Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: angefangen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Offline}}&lt;br /&gt;
&lt;br /&gt;
===Vertexarray===&lt;br /&gt;
&lt;br /&gt;
Bei einem Vertexarray werden die Vertexdaten in einem Array zur Grafikkarte geschickt.&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
Ein Vertexarray ist ein großes Array, in dem die Vertexdaten stehen. Idealerweise existiert dabei jeder Vertex nur einmal in diesem Array. Daneben wird noch ein Indexarray erstellt, dass auf die Vertices in dem Vertexarray verweist. Anhand dieses Indexarrays wird gezeichnet. Natürlich können&lt;br /&gt;
auf einzelne Vertices aus dem Indexarray heraus mehrfach verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
Dadurch, dass alle Daten an einem Block liegen und die GPU stumpf die Daten abarbeiten kann, sind die Vertexarrays weitaus schneller als die [[glBegin]]/[[glEnd]]-Methode. Werden die Daten dann auch noch als [[Displayliste]] an die Grafikkarte geschickt, kommt Freude auf. :)&lt;br /&gt;
Außerdem wird Speicher gespart, indem durch die Indirektstufe, die man durch das Indexarray hat, einen Vertex mehrfach zeichnen kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;br /&gt;
Wie wird nun so ein Vertexarray aufgebaut und gezeichnet?&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel, wie es intern abläuft für zwei nebeneinanderliegende 2D-Quads:&amp;lt;br&amp;gt;&lt;br /&gt;
Vertexarray vertices: {(0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 0.0f), (1.0f, 1.0f), (2.0f, 0.0f), (2.0f, 1.0f)}&amp;lt;br&amp;gt;&lt;br /&gt;
Indexarray indices: {0, 2, 3, 1, 2, 4, 5, 3}&amp;lt;br&amp;gt;&lt;br /&gt;
Beim Zeichnen wird nun folgendermaßen vorgegangen:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
int vertexCount = length(i);&lt;br /&gt;
glBegin(GL_QUADS);&lt;br /&gt;
for (int i = 0; i &amp;lt; vertexCount; ++i) {&lt;br /&gt;
	int vIndex = indices[i];&lt;br /&gt;
	Vertex2F v = vertices[vIndex];&lt;br /&gt;
	glVertex2f(v[0], v[1]);&lt;br /&gt;
}&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22040</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22040"/>
				<updated>2008-08-10T22:38:29Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Offline}}&lt;br /&gt;
&lt;br /&gt;
===Vertexarray===&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22039</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22039"/>
				<updated>2008-08-10T22:37:55Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Offline}}&lt;br /&gt;
&lt;br /&gt;
==Was sind Vertexarrays==&lt;br /&gt;
&lt;br /&gt;
==Wie helfen Vertexarrays bei der Performance==&lt;br /&gt;
&lt;br /&gt;
==Verwendung==&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22038</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22038"/>
				<updated>2008-08-10T22:35:05Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Offline}}&lt;br /&gt;
&lt;br /&gt;
Hallo Welt... Here we go, Vertexarrays...&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22037</id>
		<title>Vertexarray</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Vertexarray&amp;diff=22037"/>
				<updated>2008-08-10T22:34:46Z</updated>
		
		<summary type="html">&lt;p&gt;Philip: Die Seite wurde neu angelegt: {{offline}}  Hallo Welt... Here we go, Vertexarrays...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{offline}}&lt;br /&gt;
&lt;br /&gt;
Hallo Welt... Here we go, Vertexarrays...&lt;/div&gt;</summary>
		<author><name>Philip</name></author>	</entry>

	</feed>