glBegin: Unterschied zwischen den Versionen
DGLBot (Diskussion | Beiträge) K (GlBegin wurde nach glBegin verschoben) |
Flo (Diskussion | Beiträge) K (br Tags entfernt) |
||
Zeile 1: | Zeile 1: | ||
= glBegin, glEnd = | = glBegin, glEnd = | ||
− | |||
== Name == | == Name == | ||
'''glBegin, glEnd''' - Umschliessen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher [[Primitiv]]en. | '''glBegin, glEnd''' - Umschliessen die [[Eckpunkt|Eckpunkte (Vertices)]] einer [[Primitive|Primitiven]], oder eine Gruppe gleicher [[Primitiv]]en. | ||
− | |||
== Delphi-Spezifikation == | == Delphi-Spezifikation == | ||
Zeile 11: | Zeile 9: | ||
procedure '''glEnd'''; | procedure '''glEnd'''; | ||
− | |||
== Parameter == | == Parameter == | ||
<table border=1 rules=all> | <table border=1 rules=all> | ||
Zeile 25: | Zeile 22: | ||
</table> | </table> | ||
− | |||
== Beschreibung == | == Beschreibung == | ||
Zeile 111: | Zeile 107: | ||
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. | ||
− | |||
− | |||
== Fehlermeldungen == | == Fehlermeldungen == | ||
Zeile 125: | Zeile 119: | ||
Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]], [[glEdgeFlagPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glInterleavedArrays]], oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst. | Ein Aufruf von [[glEnableClientState]], [[glDisableClientState]], [[glEdgeFlagPointer]], [[glTexCoordPointer]], [[glColorPointer]], [[glIndexPointer]], [[glNormalPointer]], [[glVertexPointer]], [[glInterleavedArrays]], oder [[glPixelStore]] nach einem Aufruf von '''glBegin''' und dem zugehörigen '''glEnd''' ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst. | ||
− | |||
==Beispiele== | ==Beispiele== | ||
Zeile 145: | Zeile 138: | ||
− | |||
== Siehe auch == | == Siehe auch == |
Version vom 6. Dezember 2005, 21:14 Uhr
Inhaltsverzeichnis
glBegin, glEnd
Name
glBegin, glEnd - Umschliessen 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 hier 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 umschliessen 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 | Beschreibung | Bild | ||
---|---|---|---|---|
GL_POINTS | Behandelt jeden Eckpunkt als einzelnen Punkt. Eckpunkt n definiert Punkt n, und N Punkte werden gerendert. | |||
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. | |||
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. | |||
GL_LINE_LOOP | Rendert eine miteinander verbundene Gruppe von Linienabschnitten, beginnend beim ersten Eckpunkt und endend beim letzten, und dann wieder abschliessend zurück zum ersten. Eckpunkte n und n+1 definieren Linie n. Die letzte Linie wird jedich durch die Eckpunkte N und 1 definiert. N Linien werden gerendert. | |||
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.
Eigenschaften:
|
|||
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 ns definieren die Eckpunkte n+1, n und n+2 ein Dreieck. N-2 Dreiecke werden gerendert.
Eigenschaften:
|
|||
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.
Eigenschaften:
|
|||
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.
Eigenschaften:
|
|||
GL_QUAD_STRIP | Rendert eine verbundene Gruppe von Vierecken. Ein Viereck wird wird für jedes nach den ersten beiden Eckpunkten übergebene Eckpunktepaar gerendert. Eckpunkte 2*n-1, 2*n, 2*n+2 und 2*n+1 beschreiben Viereck n. N/2-1 Vierecke werden gerendert. Es gilt allerdings zu beachten, das die Reihenfolge der Eckpunkte die genutzt werden um Vierecke aus einem Streifen zu generieren unterschiedlich ggü. der unabhängigen Konstruktion sind.
Eigenschaften:
|
|||
GL_POLYGON | Rendert eine einzelnes, konvexes Polygon (=Vieleck). Eckpunkte 1 bis N definieren dieses Polygon.
|
Nur eine Untergruppe von GL Befehlen kann zwischen glBegin und glEnd genutzt werden. Die Befehle sind glVertex, glColor, glIndex, glNormal, glTexCoord, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, und glEdgeFlag. Ausserdem ist es erlaubt glCallList oder glCallLists zu nutzen um Displaylisten auszuführen, die nur oben erwähnte Kommandos enthalten. Sollte ein nicht erwähnter GL Befehl zwischen glBegin und glEnd ausgeführt werden, dann wird das Fehlerflag gesetzt und der Befehl ignoriert.
Unabhängig des für mode übergebenen Wertes gibt es keine Begrenzung für die Anzahl der übergebenen Eckpunkte die zwischen glBegin und glEnd definiert werden. Linien, Dreiecke, Vierecke und Polygone die nicht genügenden beschrieben wurden werden nicht gerendert. Ungenügende Beschreibung bedeutet entweder dass zu wenige Eckpunkte angegeben wurden um eine einzelne Primitive zu beschreiben, oder ein inkorrektes Vielfaches and Eckpunkten übergeben wurde. Nicht komplette Primitiven werden ignoriert; der Rest wird gerendet.
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).
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.
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, glIndex, glNormal, glTexCoord, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, glEdgeFlag, glCallList, oder glCallLists zwischen glBegin und dem zugehörigen glEnd aufgerufen wird.
Ein Aufruf von glEnableClientState, glDisableClientState, glEdgeFlagPointer, glTexCoordPointer, glColorPointer, glIndexPointer, glNormalPointer, glVertexPointer, glInterleavedArrays, oder glPixelStore nach einem Aufruf von glBegin und dem zugehörigen glEnd ist nicht erlaubt, aber je nach Implementation wird möglicherweise kein Fehler ausgelöst.
Beispiele
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:
glBegin(GL_LINE_STRIP); for i:=0 to 50 do begin glVertex3f(0,i,sin(i/50)*20); end; glEnd;
Siehe auch
glArrayElement, glCallList, glCallLists, glColor, glEdgeFlag, glEvalCoord, glEvalPoint, glIndex, glMaterial, glNormal, glTexCoord, glVertex