glDrawElements: Unterschied zwischen den Versionen
Flash (Diskussion | Beiträge) K (→Beschreibung: Pascaltags) |
End (Diskussion | Beiträge) (→Parameter) |
||
(7 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt) | |||
Zeile 27: | Zeile 27: | ||
|- | |- | ||
! ''indices'' | ! ''indices'' | ||
− | | Zeiger hinter dem die Indizes hinterlegt sind. | + | | Zeiger hinter dem die Indizes hinterlegt sind. Wird ein Buffer Object verwendet, gibt dieser Parameter das Offset im Buffer in Bytes an. |
|} | |} | ||
− | |||
− | |||
== Beschreibung == | == Beschreibung == | ||
− | '''glDrawElements''' beschreibt mehrere geometrische Primitiven mit nur sehr wenigen Unteraufrufen. Anstatt also für einzelne [[Eckpunkt]]e, [[Normalen]], [[Texturkoordinate]]n, Kantenflags oder Farbwerte einen eigenen GL-Befehl aufzurufen kann man hier für Eckpunkte, Normalen, usw. eigene Arrays angeben und nutzen um mit '''glDrawElements''' eine Sequenz von Primitiven mit nur einem Befehl zu rendern. | + | '''glDrawElements''' beschreibt mehrere geometrische Primitiven mit nur sehr wenigen Unteraufrufen. Anstatt also für einzelne [[Eckpunkt]]e, [[Normalen]], [[Texturkoordinate]]n, Kantenflags oder Farbwerte einen eigenen GL-Befehl aufzurufen, kann man hier für Eckpunkte, Normalen, usw. eigene Arrays angeben und nutzen, um mit '''glDrawElements''' eine Sequenz von Primitiven mit nur einem Befehl zu rendern. |
− | Wenn '''glDrawElements''' aufgerufen wird, nimmt es ''count'' Elemente aus den aktivierten Arrays, deren Positionen in ''indices'' gespeichert sind, um eine Abfolge geometrischer [[Primitive]]n zu erstellen. ''mode'' gibt dabei an welche Art von [[Primitive]] konstruiert werden soll und wie diese Arrayelemente [[Primitive]]n darstellen. Wenn mehr als ein Array aktiviert wurde, werden diese auch genutzt (Vertexarray, Normalenarray, Farbarray, Texturkoordinatenarray, etc.) Wenn '''GL_VERTEX_ARRAY''' nicht aktiviert ist, werden allerdings keine geometrischen [[Primitive]]n erstellt. | + | Wenn '''glDrawElements''' aufgerufen wird, nimmt es ''count'' Elemente aus den aktivierten Arrays, deren Positionen in ''indices'' gespeichert sind, um eine Abfolge geometrischer [[Primitive]]n zu erstellen. ''mode'' gibt dabei an, welche Art von [[Primitive]] konstruiert werden soll und wie diese Arrayelemente [[Primitive]]n darstellen. Wenn mehr als ein Array aktiviert wurde, werden diese auch genutzt (Vertexarray, Normalenarray, Farbarray, Texturkoordinatenarray, etc.) Wenn '''GL_VERTEX_ARRAY''' nicht aktiviert ist, werden allerdings keine geometrischen [[Primitive]]n erstellt. |
Vertexattribute, die durch '''glDrawElements''' verändert werden, haben nach dem Rücksprung von '''glDrawElements''' undefinierte Werte. Wenn z.B. '''GL_COLOR_ARRAY''' aktiviert wurde, ist der aktuell gesetze Farbwert nach der Ausführung von '''glDrawElements''' undefiniert. Unveränderte Attribute behalten allerdings ihren angegebenen Status. | Vertexattribute, die durch '''glDrawElements''' verändert werden, haben nach dem Rücksprung von '''glDrawElements''' undefinierte Werte. Wenn z.B. '''GL_COLOR_ARRAY''' aktiviert wurde, ist der aktuell gesetze Farbwert nach der Ausführung von '''glDrawElements''' undefiniert. Unveränderte Attribute behalten allerdings ihren angegebenen Status. | ||
Zeile 41: | Zeile 39: | ||
Der Effekt von '''glDrawElements''' ist derselbe wie | Der Effekt von '''glDrawElements''' ist derselbe wie | ||
− | <pascal> glBegin(''mode''); | + | <source lang="pascal"> glBegin(''mode''); |
for i := 0 to ''count'' - 1 do begin | for i := 0 to ''count'' - 1 do begin | ||
glArrayElement(''indices''[i]); | glArrayElement(''indices''[i]); | ||
end; | end; | ||
− | glEnd();</ | + | glEnd();</source> |
− | === | + | === Beispiele === |
+ | '''Beispiel 1''' | ||
oneIndices : ARRAY[0..6] OF GLubyte = (0, 1, 2, 3, 4, 5, 6); | oneIndices : ARRAY[0..6] OF GLubyte = (0, 1, 2, 3, 4, 5, 6); | ||
twoIndices : ARRAY[0..5] OF GLubyte = (7, 1, 8, 9, 10, 11); | twoIndices : ARRAY[0..5] OF GLubyte = (7, 1, 8, 9, 10, 11); | ||
... | ... | ||
− | glDrawElements(GL_LINE_STRIP, 7, GL_UNSIGNED_BYTE, oneIndices); | + | glDrawElements(GL_LINE_STRIP, 7, GL_UNSIGNED_BYTE, @oneIndices); |
− | glDrawElements(GL_LINE_STRIP, 6, GL_UNSIGNED_BYTE, twoIndices); | + | glDrawElements(GL_LINE_STRIP, 6, GL_UNSIGNED_BYTE, @twoIndices); |
+ | <br> | ||
+ | '''Beispiel 2''' | ||
+ | <br> | ||
+ | Ein Array mit Farbwerten und ein Array mit Vertices werden eingebunden, aktiviert und mit einem 16-Bit (entspricht Word) Indexarray über '''glDrawElements''' gezeichnet: | ||
+ | glEnableClientState(GL_COLOR_ARRAY); | ||
+ | glEnableClientState(GL_VERTEX_ARRAY); | ||
+ | glColorPointer(4,GL_UNSIGNED_BYTE,0,@Colors[0]); | ||
+ | glVertexPointer(3,GL_FLOAT,0,@Positions[0]); | ||
+ | |||
+ | glDrawElements(GL_LINE_STRIP, Count, GL_UNSIGNED_SHORT, @Indices[0]); | ||
+ | |||
+ | glDisableClientState(GL_COLOR_ARRAY); | ||
+ | glDisableClientState(GL_VERTEX_ARRAY); | ||
<br> | <br> | ||
Zeile 61: | Zeile 73: | ||
'''glDrawElements''' ist erst ab GL Version 1.1 oder höher nutzbar. | '''glDrawElements''' ist erst ab GL Version 1.1 oder höher nutzbar. | ||
− | '''glDrawElements''' wird in [[Displaylisten]] eingebunden, wenn die Funktion also in eine Displayliste kompiliert wird, werden die benötigten Arrayzeiger (welche das sind wird durch die Arrayzeiger und aktivierten States beschrieben) in die Displayliste kompiliert. Dies geschieht da die Arrayzeiger und aktivierten States clientseitige States sind, und die Displayliste daher nur bei ihrer Erstellung beeinflussen, nicht jedoch bei ihrer Ausführung. | + | '''glDrawElements''' wird in [[Displaylisten]] eingebunden, wenn die Funktion also in eine Displayliste kompiliert wird, werden die benötigten Arrayzeiger (welche das sind, wird durch die Arrayzeiger und aktivierten States beschrieben) in die Displayliste kompiliert. Dies geschieht, da die Arrayzeiger und aktivierten States clientseitige States sind, und die Displayliste daher nur bei ihrer Erstellung beeinflussen, nicht jedoch bei ihrer Ausführung. |
== Fehlermeldungen == | == Fehlermeldungen == | ||
− | '''GL_INVALID_ENUM''' wird generiert wenn ''mode'' keinen gültigen Wert enthält. | + | '''GL_INVALID_ENUM''' wird generiert, wenn ''mode'' keinen gültigen Wert enthält. |
− | '''GL_INVALID_VALUE''' wird generiert wenn ''count'' negativ ist. | + | '''GL_INVALID_VALUE''' wird, generiert wenn ''count'' negativ ist. |
− | '''GL_INVALID_OPERATION''' wird generiert wenn '''glDrawElements''' in einem [[glBegin]]-[[glEnd]] Block aufgerufen wird. | + | '''GL_INVALID_OPERATION''' wird generiert, wenn '''glDrawElements''' in einem [[glBegin]]-[[glEnd]] Block aufgerufen wird. |
Zeile 76: | Zeile 88: | ||
== Siehe auch == | == Siehe auch == | ||
[[glArrayElement]], [[glEnableClientState]], [[glDisableClientState]], [[glBegin|glBegin / glEnd]], [[glColorPointer]], [[glDrawArrays]], [[glDrawRangeElements]], [[glEdgeFlagPointer]], [[glFogCoordPointer]], [[glGetPointerv]], [[glGetString]], [[glIndexPointer]], [[glInterleavedArrays]], [[glMultiDrawArrays]], [[glMultiDrawElements]], [[glNormalPointer]], [[glSecondaryColorPointer]], [[glTexCoordPointer]], [[glVertexPointer]] | [[glArrayElement]], [[glEnableClientState]], [[glDisableClientState]], [[glBegin|glBegin / glEnd]], [[glColorPointer]], [[glDrawArrays]], [[glDrawRangeElements]], [[glEdgeFlagPointer]], [[glFogCoordPointer]], [[glGetPointerv]], [[glGetString]], [[glIndexPointer]], [[glInterleavedArrays]], [[glMultiDrawArrays]], [[glMultiDrawElements]], [[glNormalPointer]], [[glSecondaryColorPointer]], [[glTexCoordPointer]], [[glVertexPointer]] | ||
+ | |||
[[Kategorie:GL|DrawElements]] | [[Kategorie:GL|DrawElements]] | ||
+ | [[Kategorie:GL1.1|DrawElements]] | ||
+ | [[Kategorie:GL3|DrawElements]] |
Aktuelle Version vom 8. November 2017, 12:46 Uhr
Inhaltsverzeichnis
glDrawElements
Name
glDrawElements - Rendert Primitiven aus einem Datenarray heraus.
Delphi-Spezifikation
procedure glDrawElements(mode : glEnum; count : glSizei; _type : glEnum; const indices : PGLvoid);
Parameter
mode | Gibt an welcher Primitiven-Type gerendert werden soll. Hier sind die symbolische Konstanten GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS und GL_POLYGON erlaubt. |
---|---|
count | Anzahl der zu rendernden Elemente. |
type | Gibt den Typ der Werte in indices an. Muss entweder GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT oder GL_UNSIGNED_INT sein. |
indices | Zeiger hinter dem die Indizes hinterlegt sind. Wird ein Buffer Object verwendet, gibt dieser Parameter das Offset im Buffer in Bytes an. |
Beschreibung
glDrawElements beschreibt mehrere geometrische Primitiven mit nur sehr wenigen Unteraufrufen. Anstatt also für einzelne Eckpunkte, Normalen, Texturkoordinaten, Kantenflags oder Farbwerte einen eigenen GL-Befehl aufzurufen, kann man hier für Eckpunkte, Normalen, usw. eigene Arrays angeben und nutzen, um mit glDrawElements eine Sequenz von Primitiven mit nur einem Befehl zu rendern.
Wenn glDrawElements aufgerufen wird, nimmt es count Elemente aus den aktivierten Arrays, deren Positionen in indices gespeichert sind, um eine Abfolge geometrischer Primitiven zu erstellen. mode gibt dabei an, welche Art von Primitive konstruiert werden soll und wie diese Arrayelemente Primitiven darstellen. Wenn mehr als ein Array aktiviert wurde, werden diese auch genutzt (Vertexarray, Normalenarray, Farbarray, Texturkoordinatenarray, etc.) Wenn GL_VERTEX_ARRAY nicht aktiviert ist, werden allerdings keine geometrischen Primitiven erstellt.
Vertexattribute, die durch glDrawElements verändert werden, haben nach dem Rücksprung von glDrawElements undefinierte Werte. Wenn z.B. GL_COLOR_ARRAY aktiviert wurde, ist der aktuell gesetze Farbwert nach der Ausführung von glDrawElements undefiniert. Unveränderte Attribute behalten allerdings ihren angegebenen Status.
Der Effekt von glDrawElements ist derselbe wie
glBegin(''mode'');
for i := 0 to ''count'' - 1 do begin
glArrayElement(''indices''[i]);
end;
glEnd();
Beispiele
Beispiel 1
oneIndices : ARRAY[0..6] OF GLubyte = (0, 1, 2, 3, 4, 5, 6); twoIndices : ARRAY[0..5] OF GLubyte = (7, 1, 8, 9, 10, 11); ... glDrawElements(GL_LINE_STRIP, 7, GL_UNSIGNED_BYTE, @oneIndices); glDrawElements(GL_LINE_STRIP, 6, GL_UNSIGNED_BYTE, @twoIndices);
Beispiel 2
Ein Array mit Farbwerten und ein Array mit Vertices werden eingebunden, aktiviert und mit einem 16-Bit (entspricht Word) Indexarray über glDrawElements gezeichnet:
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glColorPointer(4,GL_UNSIGNED_BYTE,0,@Colors[0]); glVertexPointer(3,GL_FLOAT,0,@Positions[0]); glDrawElements(GL_LINE_STRIP, Count, GL_UNSIGNED_SHORT, @Indices[0]); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY);
Hinweise
glDrawElements ist erst ab GL Version 1.1 oder höher nutzbar.
glDrawElements wird in Displaylisten eingebunden, wenn die Funktion also in eine Displayliste kompiliert wird, werden die benötigten Arrayzeiger (welche das sind, wird durch die Arrayzeiger und aktivierten States beschrieben) in die Displayliste kompiliert. Dies geschieht, da die Arrayzeiger und aktivierten States clientseitige States sind, und die Displayliste daher nur bei ihrer Erstellung beeinflussen, nicht jedoch bei ihrer Ausführung.
Fehlermeldungen
GL_INVALID_ENUM wird generiert, wenn mode keinen gültigen Wert enthält.
GL_INVALID_VALUE wird, generiert wenn count negativ ist.
GL_INVALID_OPERATION wird generiert, wenn glDrawElements in einem glBegin-glEnd Block aufgerufen wird.
Siehe auch
glArrayElement, glEnableClientState, glDisableClientState, glBegin / glEnd, glColorPointer, glDrawArrays, glDrawRangeElements, glEdgeFlagPointer, glFogCoordPointer, glGetPointerv, glGetString, glIndexPointer, glInterleavedArrays, glMultiDrawArrays, glMultiDrawElements, glNormalPointer, glSecondaryColorPointer, glTexCoordPointer, glVertexPointer