glBegin: Unterschied zwischen den Versionen
Flash (Diskussion | Beiträge) K (→Beschreibung) |
K (→Beispiele) |
||
(31 dazwischenliegende Versionen von 11 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | {{Excellent}} | ||
= glBegin, glEnd = | = glBegin, glEnd = | ||
− | |||
== Name == | == Name == | ||
− | '''glBegin, glEnd''' - | + | '''glBegin, glEnd''' - Umschließen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher Primitiven. |
− | |||
− | |||
== Delphi-Spezifikation == | == Delphi-Spezifikation == | ||
Zeile 11: | Zeile 9: | ||
procedure '''glEnd'''; | procedure '''glEnd'''; | ||
− | + | ||
+ | |||
== Parameter == | == Parameter == | ||
− | + | {| border="1" rules="all" | |
− | + | ! ''mode'' | |
− | + | | Bestimmt die [[Primitive]] bzw. Gruppe von [[Primitive|Primitiven]] die aus den von '''glBegin''' und '''glEnd''' umschlossenen [[Eckpunkt|Eckpunkten (Vertices)]] erstellt werden. | |
− | ''mode'' | + | Erlaubt sind die folgenden zehn symbolischen Konstanten: |
− | |||
− | |||
− | Bestimmt die [[Primitive]] bzw. Gruppe von [[Primitive|Primitiven]] die aus den von '''glBegin''' und '''glEnd''' umschlossenen [[Eckpunkt|Eckpunkten (Vertices)]] erstellt werden. | ||
− | Erlaubt sind | ||
'''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'''. | '''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'''. | ||
− | + | |} | |
− | + | ||
− | |||
== Beschreibung == | == Beschreibung == | ||
− | '''glBegin''' und '''glEnd''' | + | '''glBegin''' und '''glEnd''' umschließen eine Liste von [[Eckpunkt|Eckpunkten (Vertices)]] die eine [[Primitive]] oder Gruppe von [[Primitive|Primitiven]] darstellt. '''glBegin''' erhält ein einzelnes Argument (''mode''), das angibt, auf welche Art und Weise die [[Eckpunkt|Eckpunkte (Vertices)]] interpretiert werden. |
+ | |||
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 : | 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 : | ||
− | {|{{ | + | {|{{Prettytable_B1}} |
!mode | !mode | ||
+ | !Einschätzung | ||
!Beschreibung | !Beschreibung | ||
− | |||
|- | |- | ||
|'''GL_POINTS''' | |'''GL_POINTS''' | ||
− | |Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt ''n'' definiert Punkt ''n'', und ''N'' Punkte werden gerendert. | + | |align="center"|langsam |
− | + | |[[Bild:Glbegin_points.jpg|350px|thumb|right]] | |
+ | Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt ''n'' definiert Punkt ''n'', und ''N'' Punkte werden gerendert. | ||
|- | |- | ||
|'''GL_LINES''' | |'''GL_LINES''' | ||
− | |Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*''n''-1 und 2*''n'' beschreiben Linie n. N/2 Linien werden gerendert. | + | |align="center"|mittel |
− | + | |[[Bild:Glbegin_lines.jpg|350px|thumb|right]] | |
+ | Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*''n''-1 und 2*''n'' beschreiben Linie n. N/2 Linien werden gerendert. | ||
|- | |- | ||
|'''GL_LINE_STRIP''' | |'''GL_LINE_STRIP''' | ||
− | |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. | + | |align="center"|schnell |
− | + | |[[Bild:Glbegin_linestrip.jpg|350px|thumb|right]] | |
+ | 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. | ||
|- | |- | ||
|'''GL_LINE_LOOP''' | |'''GL_LINE_LOOP''' | ||
− | |Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder | + | |align="center"|sehr schnell |
− | + | |[[Bild:Glbegin_lineloop.jpg|350px|thumb|right]] | |
+ | Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschließend zurück zum ersten. Eckpunkte ''n'' und ''n+1'' definieren Linie ''n''. Die letzte Linie wird jedoch durch die Eckpunkte ''N'' und 1 definiert. ''N'' Linien werden gerendert. | ||
|- | |- | ||
|'''GL_TRIANGLES''' | |'''GL_TRIANGLES''' | ||
− | |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. | + | |align="center"|schnell |
+ | |[[Bild:Glbegin_triangles.jpg|350px|thumb|right]] | ||
+ | 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. | ||
'''Eigenschaften''': | '''Eigenschaften''': | ||
* Alle Dreiecke bestehen aus jeweils 3 Vertices, die ausschließlich nur zu diesem Dreieck gehören. | * Alle Dreiecke bestehen aus jeweils 3 Vertices, die ausschließlich nur zu diesem Dreieck gehören. | ||
− | |||
|- | |- | ||
|'''GL_TRIANGLE_STRIP''' | |'''GL_TRIANGLE_STRIP''' | ||
− | |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. | + | |align="center"|am schnellsten |
+ | |[[Bild:Glbegin_trianglestrip.jpg|350px|thumb|right]] | ||
+ | Rendert eine verbundene Gruppe von Dreiecken. Ein Dreieck wird für jeden Eckpunkt der nach den beiden ersten Eckpunkten definiert wird gerendert. Für ein ungerades ''n'' definieren die Eckpunkte ''n'', ''n''+1 und ''n''+2 Dreieck ''n'', für gerade ''n''s definieren die Eckpunkte ''n''+1, ''n'' und ''n''+2 ein Dreieck. (Man beachte, dass die Reihenfolge bei geraden ''n'' impliziet geändert wird um entgegen der Uhrzeigerrichtung zu rendern. Siehe auch [[glFrontFace]]) | ||
+ | |||
+ | ''N''-2 Dreiecke werden gerendert. | ||
'''Eigenschaften''': | '''Eigenschaften''': | ||
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante. | * Nacheinander erstellte Dreiecke haben eine gemeinsame Kante. | ||
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices. | * Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices. | ||
− | |||
|- | |- | ||
|'''GL_TRIANGLE_FAN''' | |'''GL_TRIANGLE_FAN''' | ||
− | |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. | + | |align="center"|schnell |
+ | |[[Bild:Glbegin_trianglefan.jpg|350px|thumb|right]] | ||
+ | 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. | ||
'''Eigenschaften''': | '''Eigenschaften''': | ||
Zeile 74: | Zeile 79: | ||
* Nacheinander erstellte Dreiecke haben eine gemeinsame Kante. | * Nacheinander erstellte Dreiecke haben eine gemeinsame Kante. | ||
* Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices. | * Nacheinander erstellte Dreiecke benutzen 2 gemeinsame Vertices. | ||
− | |||
|- | |- | ||
|'''GL_QUADS''' | |'''GL_QUADS''' | ||
− | |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. | + | |align="center"|schnell |
+ | |[[Bild:Glbegin_quads.jpg|350px|thumb|right]] | ||
+ | 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. | ||
'''Eigenschaften''': | '''Eigenschaften''': | ||
* Alle Vierecke bestehen aus jeweils 4 Vertices, die ausschließlich nur zu diesem Viereck gehören. | * Alle Vierecke bestehen aus jeweils 4 Vertices, die ausschließlich nur zu diesem Viereck gehören. | ||
− | |||
|- | |- | ||
|'''GL_QUAD_STRIP''' | |'''GL_QUAD_STRIP''' | ||
− | |Rendert eine verbundene Gruppe von Vierecken. Ein Viereck | + | |align="center"|sehr schnell |
+ | |[[Bild:Glbegin_quadstrip.jpg|350px|thumb|right]] | ||
+ | Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*''n''-1, 2*''n'', 2*''n''+2 und 2*''n''+1 beschreiben Viereck ''n''. ''N''/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, dass die Reihenfolge der Eckpunkte, die genutzt werden, um Vierecke aus einem Streifen zu generieren, unterschiedlich ggü. der unabhängigen Konstruktion sind. | ||
'''Eigenschaften''': | '''Eigenschaften''': | ||
* Nacheinander erstellte Vierecke haben eine gemeinsame Kante. | * Nacheinander erstellte Vierecke haben eine gemeinsame Kante. | ||
* Nacheinander erstellte Vierecke benutzen 2 gemeinsame Vertices. | * Nacheinander erstellte Vierecke benutzen 2 gemeinsame Vertices. | ||
− | |||
|- | |- | ||
|'''GL_POLYGON''' | |'''GL_POLYGON''' | ||
− | |Rendert eine einzelnes, [[konvex|konvexes]] Polygon (=Vieleck). Eckpunkte 1 bis ''N'' definieren dieses Polygon. | + | |align="center"|(langsam) |
− | + | |[[Bild:Glbegin_polygon.jpg|350px|thumb|right]] | |
+ | Rendert eine einzelnes, [[konvex|konvexes]] Polygon (=Vieleck). Eckpunkte 1 bis ''N'' definieren dieses Polygon. | ||
+ | |||
+ | '''Hinweis''' | ||
+ | |||
+ | GL_POLYGON scheint für Anfänger meist die "beste Lösung" 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: <br> | ||
1. sind moderne Grafikkarten auf die Darstellung von Dreiecken optimiert und <br> | 1. sind moderne Grafikkarten auf die Darstellung von Dreiecken optimiert und <br> | ||
2. müssen die Polygone bevor sie von den Grafikkarten verwendet werden können, erst in Dreiecke zerlegt werden (siehe [[Triangulation]]). <br> | 2. müssen die Polygone bevor sie von den Grafikkarten verwendet werden können, erst in Dreiecke zerlegt werden (siehe [[Triangulation]]). <br> | ||
− | Vorallem der letzte Punkt sorgt für niedrige Frameraten im Vergleich zu dreiecksbasierten Strukturen. | + | Vorallem der letzte Punkt sorgt für niedrige Frameraten im Vergleich zu dreiecksbasierten Strukturen.<br> |
− | + | ''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.'' | |
|- | |- | ||
|} | |} | ||
− | 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]] | + | Nur eine Untergruppe von GL Befehlen kann zwischen '''glBegin''' und '''glEnd''' genutzt werden. Die Befehle sind [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]] und [[glEdgeFlag]]. Außerdem ist es erlaubt [[glCallList]] oder [[glCallLists]] zu nutzen, um [[Displaylisten]] auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen '''glBegin''' und '''glEnd''' ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert. |
− | 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 | + | Unabhängig des für ''mode'' übergebenen Wertes gibt es '''keine''' Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen '''glBegin''' und '''glEnd''' definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügendend beschrieben wurden, werden nicht gerendert. |
− | Ungenügende Beschreibung bedeutet entweder dass zu wenige Eckpunkte angegeben wurden um eine einzelne [[Primitive]] zu beschreiben, oder ein inkorrektes Vielfaches | + | Ungenügende Beschreibung bedeutet entweder, dass zu wenige Eckpunkte angegeben wurden, um eine einzelne [[Primitive]] zu beschreiben, oder ein inkorrektes Vielfaches an Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet. |
Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt : | Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt : | ||
− | 1 für einen Punkt | + | *1 für einen Punkt |
+ | *2 für eine Linie | ||
+ | *3 für ein Dreieck | ||
+ | *4 für ein Viereck und | ||
+ | *3 für ein Polygon. | ||
+ | Modi die ein festgelegtes Vielfaches an Eckpunkten brauchen sind '''GL_LINES''' (2), '''GL_TRIANGLES''' (3), '''GL_QUADS''' (4), und '''GL_QUAD_STRIP''' (2). ''(D.h. wenn man bei GL_TRIANGLES 8 Vertices angibt (kein Vielfaches von 3), werden nur die ersten 6 bearbeitet. Die restlichen 2 ergeben kein Dreieck und werden deshalb verworfen.)'' | ||
− | 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. | + | 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. |
− | + | ||
+ | == Änderungen == | ||
+ | Folgende Erweiterungen hat die Funktion erfahren: | ||
+ | === Ab OpenGL-Version 1.3 === | ||
+ | Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen: | ||
+ | *[[glMultiTexCoord]] | ||
+ | === Ab OpenGL-Version 1.4 === | ||
+ | Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen: | ||
+ | *[[glFogCoord]] | ||
+ | *[[glSecondaryColor]] | ||
+ | === Ab OpenGL-Version 2.0 === | ||
+ | Zusätzliche Funktionen definiert, welche innerhalb '''glBegin/glEnd''' auftauchen dürfen: | ||
+ | *[[glVertexAttrib]] | ||
+ | |||
+ | === Ab OpenGL-Version 3.3 === | ||
+ | '''glBegin/glEnd''' wird '''nicht''' mehr unterstützt, dies betrifft auch die dort eingeschlossenen Funktionen. | ||
== Fehlermeldungen == | == Fehlermeldungen == | ||
− | '''GL_INVALID_ENUM''' wird ausgelöst wenn ''mode'' einen ungültigen Wert besitzt. | + | '''GL_INVALID_ENUM''' wird ausgelöst, wenn ''mode'' einen ungültigen Wert besitzt. |
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn zwischen '''glBegin''' und dem zugehörigen '''glEnd''' ein weiteres '''glBegin''' aufgerufen wird. | '''GL_INVALID_OPERATION''' wird ausgelöst, wenn zwischen '''glBegin''' und dem zugehörigen '''glEnd''' ein weiteres '''glBegin''' aufgerufen wird. | ||
Zeile 121: | Zeile 152: | ||
'''GL_INVALID_OPERATION''' wird ausgelöst, wenn '''glEnd''' ohne ein vorhergehendes '''glBegin''' aufgerufen wird. | '''GL_INVALID_OPERATION''' wird ausgelöst, wenn '''glEnd''' ohne ein vorhergehendes '''glBegin''' aufgerufen wird. | ||
− | '''GL_INVALID_OPERATION''' wird aufgerufen, wenn ein anderer Befehl als [[glVertex]], [[glColor]], [[glIndex]], [[glNormal]], [[glTexCoord]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], [[glEdgeFlag]], [[glCallList]] | + | '''GL_INVALID_OPERATION''' wird aufgerufen, wenn ein anderer Befehl als [[glVertex]], [[glColor]], [[glSecondaryColor]], [[glIndex]], [[glNormal]], [[glFogCoord]], [[glTexCoord]], [[glMultiTexCoord]], [[glVertexAttrib]], [[glEvalCoord]], [[glEvalPoint]], [[glArrayElement]], [[glMaterial]], [[glEdgeFlag]], [[glCallList]] oder [[glCallLists]] zwischen '''glBegin''' und dem zugehörigen '''glEnd''' aufgerufen wird. |
+ | |||
+ | |||
+ | Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]], [[glPushClientAttrib]], [[glPopClientAttrib]], [[glEdgeFlagPointer]], [[glFogCoordPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glSecondaryColorPointer]] [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glVertexAttribPointer]], [[glInterleavedArrays]] oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst. | ||
− | |||
− | |||
==Beispiele== | ==Beispiele== | ||
− | <pascal>glBegin(GL_TRIANGLES); | + | {|{{Prettytable_B1}} width="100%" |
− | glVertex3f(1, | + | !width="60%"|Code |
− | glVertex3f( | + | !Ausgabe |
− | glVertex3f( | + | |- |
− | glEnd;</ | + | | |
+ | <source lang="pascal">glBegin(GL_TRIANGLES); | ||
+ | glVertex3f(1, 0, 0); | ||
+ | glVertex3f(0, 1, 0); | ||
+ | glVertex3f(0, 0, 1); | ||
+ | glEnd;</source> | ||
+ | |[[Bild:GlBegin_Bsp1.jpg|center]] | ||
+ | |} | ||
Zwischen glBegin und glEnd können natürlich auch "nicht OpenGL"-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen: | Zwischen glBegin und glEnd können natürlich auch "nicht OpenGL"-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen: | ||
+ | {|{{Prettytable_B1}} width="100%" | ||
+ | !width="60%"|Code | ||
+ | !Ausgabe | ||
+ | |- | ||
+ | | | ||
+ | <source lang="pascal"> | ||
+ | glBegin(GL_LINE_STRIP); | ||
+ | f := 0.0; | ||
+ | for i := 0 to 20 do begin | ||
+ | glVertex3f(cos(f), sin(f), 0); | ||
+ | f := f + (2 * Pi / 20); | ||
+ | end; | ||
+ | glEnd;</source> | ||
+ | |[[Bild:GlBegin_Bsp2.jpg|center]] | ||
+ | |} | ||
− | + | == Links == | |
− | + | http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml | |
− | |||
− | |||
− | |||
− | |||
− | |||
== Siehe auch == | == Siehe auch == | ||
− | [[glArrayElement]], [[glCallList]], [[glCallLists]], [[glColor]], [[glEdgeFlag]], [[glEvalCoord]], [[glEvalPoint]], [[glIndex]], [[glMaterial]], [[glNormal]], [[glTexCoord]], [[glVertex]] | + | [[glArrayElement]], [[glCallList]], [[glCallLists]], [[glColor]], [[glEdgeFlag]], [[glEvalCoord]], [[glEvalPoint]], [[glFogCoord]], [[glIndex]], [[glMaterial]], [[glMultiTexCoord]], [[glNormal]], [[glSecondaryColor]], [[glTexCoord]], [[glVertex]], [[glVertexAttrib]] |
[[Kategorie:GL|Begin]] | [[Kategorie:GL|Begin]] | ||
+ | [[Kategorie:GL1.0|Begin]] |
Aktuelle Version vom 25. August 2018, 19:57 Uhr
(weitere exzellente Artikel) |
Inhaltsverzeichnis
glBegin, glEnd
Name
glBegin, glEnd - Umschließen die Eckpunkte (Vertices) einer Primitiven, oder eine Gruppe gleicher Primitiven.
Delphi-Spezifikation
procedure glBegin(mode : GLEnum); procedure glEnd;
Parameter
mode | Bestimmt die Primitive bzw. Gruppe von Primitiven die aus den von glBegin und glEnd umschlossenen Eckpunkten (Vertices) erstellt werden.
Erlaubt sind die folgenden zehn symbolischen Konstanten: 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. |
---|
Beschreibung
glBegin und glEnd umschließen eine Liste von Eckpunkten (Vertices) die eine Primitive oder Gruppe von Primitiven darstellt. glBegin erhält ein einzelnes Argument (mode), das angibt, auf welche Art und Weise die Eckpunkte (Vertices) interpretiert werden.
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 :
mode | Einschätzung | Beschreibung |
---|---|---|
GL_POINTS | langsam |
Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt n definiert Punkt n, und N Punkte werden gerendert. |
GL_LINES | mittel |
Behandelt jedes Eckpunkt-Paar als unabhängigen Linienabschnitt. Eckpunkte 2*n-1 und 2*n beschreiben Linie n. N/2 Linien werden gerendert. |
GL_LINE_STRIP | schnell |
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. |
GL_LINE_LOOP | sehr schnell |
Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschließend zurück zum ersten. Eckpunkte n und n+1 definieren Linie n. Die letzte Linie wird jedoch durch die Eckpunkte N und 1 definiert. N Linien werden gerendert. |
GL_TRIANGLES | schnell |
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. Eigenschaften:
|
GL_TRIANGLE_STRIP | am schnellsten |
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 ns definieren die Eckpunkte n+1, n und n+2 ein Dreieck. (Man beachte, dass die Reihenfolge bei geraden n impliziet geändert wird um entgegen der Uhrzeigerrichtung zu rendern. Siehe auch glFrontFace) N-2 Dreiecke werden gerendert. Eigenschaften:
|
GL_TRIANGLE_FAN | schnell |
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. Eigenschaften:
|
GL_QUADS | schnell |
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. Eigenschaften:
|
GL_QUAD_STRIP | sehr schnell |
Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*n-1, 2*n, 2*n+2 und 2*n+1 beschreiben Viereck n. N/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, dass die Reihenfolge der Eckpunkte, die genutzt werden, um Vierecke aus einem Streifen zu generieren, unterschiedlich ggü. der unabhängigen Konstruktion sind. Eigenschaften:
|
GL_POLYGON | (langsam) |
Rendert eine einzelnes, konvexes Polygon (=Vieleck). Eckpunkte 1 bis N definieren dieses Polygon. Hinweis GL_POLYGON scheint für Anfänger meist die "beste Lösung" 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: |
Nur eine Untergruppe von GL Befehlen kann zwischen glBegin und glEnd genutzt werden. Die Befehle sind glVertex, glColor, glSecondaryColor, glIndex, glNormal, glFogCoord, glTexCoord, glMultiTexCoord, glVertexAttrib, glEvalCoord, glEvalPoint, glArrayElement, glMaterial und glEdgeFlag. Außerdem ist es erlaubt glCallList oder glCallLists zu nutzen, um Displaylisten auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen glBegin und glEnd ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert.
Unabhängig des für mode übergebenen Wertes gibt es keine Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen glBegin und glEnd definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügendend beschrieben wurden, werden nicht gerendert. Ungenügende Beschreibung bedeutet entweder, dass zu wenige Eckpunkte angegeben wurden, um eine einzelne Primitive zu beschreiben, oder ein inkorrektes Vielfaches an Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet.
Das Minimum an zu spezifizierenden Eckpunkten für jede Primitive ist wie folgt :
- 1 für einen Punkt
- 2 für eine Linie
- 3 für ein Dreieck
- 4 für ein Viereck und
- 3 für ein Polygon.
Modi die ein festgelegtes Vielfaches an Eckpunkten brauchen sind GL_LINES (2), GL_TRIANGLES (3), GL_QUADS (4), und GL_QUAD_STRIP (2). (D.h. wenn man bei GL_TRIANGLES 8 Vertices angibt (kein Vielfaches von 3), werden nur die ersten 6 bearbeitet. Die restlichen 2 ergeben kein Dreieck und werden deshalb verworfen.)
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.
Änderungen
Folgende Erweiterungen hat die Funktion erfahren:
Ab OpenGL-Version 1.3
Zusätzliche Funktionen definiert, welche innerhalb glBegin/glEnd auftauchen dürfen:
Ab OpenGL-Version 1.4
Zusätzliche Funktionen definiert, welche innerhalb glBegin/glEnd auftauchen dürfen:
Ab OpenGL-Version 2.0
Zusätzliche Funktionen definiert, welche innerhalb glBegin/glEnd auftauchen dürfen:
Ab OpenGL-Version 3.3
glBegin/glEnd wird nicht mehr unterstützt, dies betrifft auch die dort eingeschlossenen Funktionen.
Fehlermeldungen
GL_INVALID_ENUM wird ausgelöst, wenn mode einen ungültigen Wert besitzt.
GL_INVALID_OPERATION wird ausgelöst, wenn zwischen glBegin und dem zugehörigen glEnd ein weiteres glBegin aufgerufen wird.
GL_INVALID_OPERATION wird ausgelöst, wenn glEnd ohne ein vorhergehendes glBegin aufgerufen wird.
GL_INVALID_OPERATION wird aufgerufen, wenn ein anderer Befehl als glVertex, glColor, glSecondaryColor, glIndex, glNormal, glFogCoord, glTexCoord, glMultiTexCoord, glVertexAttrib, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, glEdgeFlag, glCallList oder glCallLists zwischen glBegin und dem zugehörigen glEnd aufgerufen wird.
Ein Aufruf von glEnableClientState, glDisableClientState, glPushClientAttrib, glPopClientAttrib, glEdgeFlagPointer, glFogCoordPointer, glTexCoordPointer, glColorPointer, glSecondaryColorPointer glIndexPointer, glNormalPointer, glVertexPointer, glVertexAttribPointer, glInterleavedArrays oder glPixelStore nach einem Aufruf von glBegin und dem zugehörigen glEnd ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst.
Beispiele
Code | Ausgabe |
---|---|
glBegin(GL_TRIANGLES);
glVertex3f(1, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(0, 0, 1);
glEnd;
|
Zwischen glBegin und glEnd können natürlich auch "nicht OpenGL"-Befehle stehen was man dazu nutzen kann komplexere Gebilde direkt mit einer Schleife zeichnen zu lassen:
Code | Ausgabe |
---|---|
glBegin(GL_LINE_STRIP);
f := 0.0;
for i := 0 to 20 do begin
glVertex3f(cos(f), sin(f), 0);
f := f + (2 * Pi / 20);
end;
glEnd;
|
Links
http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml
Siehe auch
glArrayElement, glCallList, glCallLists, glColor, glEdgeFlag, glEvalCoord, glEvalPoint, glFogCoord, glIndex, glMaterial, glMultiTexCoord, glNormal, glSecondaryColor, glTexCoord, glVertex, glVertexAttrib