glDrawRangeElements: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Extension-Hinweis hinzugefügt)
(an manpages angepasst)
Zeile 7: Zeile 7:
 
<br>
 
<br>
 
== Delphi-Spezifikation ==
 
== Delphi-Spezifikation ==
  procedure '''glDrawRangeElements'''(''mode'' : glEnum; start: TGLuint; _end: TGLuint; ''count'' : glSizei;
+
  procedure '''glDrawRangeElements'''(''mode'' : glEnum; ''start'': TGLuint;
                               ''_type'' : glEnum; const ''indices'' : PGLvoid);  
+
                              ''_end'': TGLuint; ''count'' : glSizei;
 +
                               ''_type'' : glEnum; '''const''' ''indices'' : PGLvoid);  
  
 
<br>
 
<br>
Zeile 18: Zeile 19:
 
|-
 
|-
 
! ''start''
 
! ''start''
| Startwert im Index-Array.  
+
| Kleinster Array-Index in ''indices''.
 
|-
 
|-
 
! ''_end''
 
! ''_end''
| Endwert im Index-Array.  
+
| Grösster Array-Index in ''indices''.
 
|-
 
|-
 
! ''count''
 
! ''count''
Zeile 30: Zeile 31:
 
|-
 
|-
 
! ''indices''
 
! ''indices''
| Zeiger, hinter dem die Indizes hinterlegt sind.
+
| Zeiger auf Speicher, in dem die Indizes liegen.
 
|}
 
|}
  
Zeile 36: Zeile 37:
 
<br>
 
<br>
 
== Beschreibung ==  
 
== Beschreibung ==  
'''glDrawRangeElements''' verhält sich genauso wie der Befehl [[glDrawElements]], mit dem Unterschied, dass man die Werte des Index-Arrays mit den zusätzlichen Parametern ''start'' und ''_end'' einschränken kann.
+
'''glDrawRangeElements''' ist eine eingeschränkte Form von [[glDrawElements]]. ''mode'', ''start'', ''_end'' und ''count'' stimmen mit den entsprechenden Argumenten von [[glDrawElements]] überein, mit der zusätzlichen Bedingung, dass alle Werte im Array ''indices'' im Bereich [''start'', ''_end''] liegen müssen.
Es werden nur dann Primitiven gerendert, falls sich die Indizes ihrer Daten zwischen dem angegebenem Start- und Endwert (einschliesslich dieser) befinden.
+
 
 +
OpenGL-Implementationen kennzeichnen empfohlene maximale Mengen an Vertex- und Indexdaten, welche durch den Aufruf von [[glGet]] mit dem Argument '''GL_MAX_ELEMENTS_VERTICES''' und '''GL_MAX_ELEMENTS_INDICES''' abgefragt werden können. Falls ''_end'' - ''start'' + 1 grösser als der Wert von '''GL_MAX_ELEMENTS_VERTICES''' oder falls ''count'' grösser als der Wert von '''GL_MAX_ELEMENTS_INDICES''' ist, könnte der Aufruf unter reduzierter Performance arbeiten. Es ist nicht nötig, dass alle Vertices im Bereich [''start'', ''_end'']] referenziert werden müssen. Die Implementation könnte jedoch ungenutzte Vertices teilweise verarbeiten, so dass die Performance im Vergleich zu einer optimalen Indexmenge reduziert wird.
 +
 
 +
Wenn '''glDrawRangeElements''' aufgerufen wird, benutzt der Befehl ''count'' sequentielle Elemente eines aktivierten Arrays, beginnend bei ''start'' um eine Folge an geometrischen [[Primitive|Primitiven]] zu konstruieren. ''mode'' gibt an, welche Art von Primitiven konstruiert wird und wie die Array-Elemente diese Primitiven konstruieren. Wenn mehr als ein Array aktiviert ist, wird jedes einzelne davon benutzt. Falls '''GL_VERTEX_ARRAY''' nicht aktiviert ist, werden keine geometrischen Primitiven konstruiert.
 +
 
 +
Vertex-Attribute, die durch [[glDrawRangeElements]] verändert werden, haben einen undefinierten Wert nachdem [[glDrawRangeElements]] beendet ist. Z.B., falls '''GL_COLOR_ARRAY''' aktiviert ist, ist der Wert der aktuell gesetzten Farbe undefiniert nachdem [[glDrawRangeElements]] ausgeführt wurde. Attribute, die nicht verändert wurden, behalten ihre ursprünglichen Werte.
  
 
<br>
 
<br>
Zeile 45: Zeile 51:
 
Ersetzt die Extension [[GL_EXT_draw_range_elements]].
 
Ersetzt die Extension [[GL_EXT_draw_range_elements]].
  
Nicht alle Werte zwischen ''start'' und ''_end'' müssen vom Index-Array referenziert werden.
+
'''glDrawRangeElements''' wird in [[Displaylisten]] eingebunden. Falls '''glDrawRangeElements''' in eine Displayliste hineinkommt, kommen auch die zugehörigen Array-Daten (festgelegt durch die Arrayzeiger und -aktivierungen) in die Displayliste mithinein. Da die Arrayzeiger und -aktivierungen clientseitige Zustände sind, beeinflussen ihre Werte Displaylisten nur, wenn die Listen erzeugt, jedoch nicht wenn die Listen ausgeführt werden.
Allerdings kann eine nicht optimale Indexmenge zur Reduzierung der Performance führen, da nutzlose Vertices an die Grafikkarte gesendet werden.
 
 
 
'''glDrawRangeElements''' 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.
 
 
 
Es sollte darauf geachtet werden, dass der Wert von ''count'' nicht grösser als der von der OpenGL-Implementierung maximal zulässige Wert für Vertex-Arrays ist (abfragbar mit [[glGetIntegerv]]('''GL_MAX_ELEMENTS_VERTICES''')), da es ansonsten zu Performance-Einbußen kommen kann.
 
 
 
Ebenso sollte ''_end'' - ''start'' + 1 nicht grösser sein als der Wert, den man mit [[glGetIntegerv]]('''GL_MAX_ELEMENTS_INDICES''')) abfragen kann.
 
 
 
 
 
 
 
 
<br>
 
<br>
  
 
== Fehlermeldungen ==
 
== Fehlermeldungen ==
 +
Es ist ein Fehler für Indizes ausserhalb des Bereiches [''start'', ''_end''] zu liegen, aber Implementationen müssen diesen Fall nicht überprüfen. Solche Indizes verursachen Implementation-abhängiges Verhalten.
 +
 
'''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.
  
Zeile 67: Zeile 65:
 
'''GL_INVALID_VALUE''' wird generiert, wenn ''_end'' < ''begin'' ist.
 
'''GL_INVALID_VALUE''' wird generiert, wenn ''_end'' < ''begin'' ist.
  
Abhängig von der OpenGL-Implementierung kann ein Fehler generiert werden, wenn die Werte des Index-Arrays außerhalb des Bereichs [''begin'', ''_end''] liegen.
+
<br>
 +
 
 +
== Zugehörige Wertrückgaben ==
 +
[[glGet]] mit Token [[glGet#GL_MAX_ELEMENTS_VERTICES|GL_MAX_ELEMENTS_VERTICES]]<br>
 +
[[glGet]] mit Token [[glGet#GL_MAX_ELEMENTS_INDICES|GL_MAX_ELEMENTS_INDICES]]<br>
  
 
<br>
 
<br>
 
== Siehe auch ==
 
== Siehe auch ==
[[glArrayElement]], [[glColorPointer]], [[glDrawArrays]], [[glDrawElements]], [[glEdgeFlagPointer]], [[glGetPointerv]], [[glIndexPointer]], [[glInterleavedArrays]], [[glMultiDrawArrays]], [[glMultiDrawElements]], [[glNormalPointer]], [[glTexCoordPointer]], [[glVertexPointer]]
+
[[glArrayElement]], [[glColorPointer]], [[glDrawArrays]], [[glDrawElements]], [[glEdgeFlagPointer]], [[glFogCoordPointer]], [[glGetPointerv]], [[glIndexPointer]], [[glInterleavedArrays]], [[glMultiDrawArrays]], [[glMultiDrawElements]], [[glNormalPointer]], [[glSecondaryColorPointer]], [[glTexCoordPointer]], [[glVertexPointer]]
  
 
[[Kategorie:GL|DrawRangeElements]]
 
[[Kategorie:GL|DrawRangeElements]]

Version vom 10. April 2006, 11:21 Uhr

glDrawRangeElements


Name

glDrawRangeElements - Rendert Primitiven aus einem Daten-Array mithilfe eines Index-Arrays.


Delphi-Spezifikation

procedure glDrawRangeElements(mode : glEnum; start: TGLuint;
                              _end: TGLuint; count : glSizei;
                              _type : glEnum; const indices : PGLvoid); 


Parameter

mode Gibt an, welcher Primitiven-Typ 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.
start Kleinster Array-Index in indices.
_end Grösster Array-Index in indices.
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 auf Speicher, in dem die Indizes liegen.



Beschreibung

glDrawRangeElements ist eine eingeschränkte Form von glDrawElements. mode, start, _end und count stimmen mit den entsprechenden Argumenten von glDrawElements überein, mit der zusätzlichen Bedingung, dass alle Werte im Array indices im Bereich [start, _end] liegen müssen.

OpenGL-Implementationen kennzeichnen empfohlene maximale Mengen an Vertex- und Indexdaten, welche durch den Aufruf von glGet mit dem Argument GL_MAX_ELEMENTS_VERTICES und GL_MAX_ELEMENTS_INDICES abgefragt werden können. Falls _end - start + 1 grösser als der Wert von GL_MAX_ELEMENTS_VERTICES oder falls count grösser als der Wert von GL_MAX_ELEMENTS_INDICES ist, könnte der Aufruf unter reduzierter Performance arbeiten. Es ist nicht nötig, dass alle Vertices im Bereich [start, _end]] referenziert werden müssen. Die Implementation könnte jedoch ungenutzte Vertices teilweise verarbeiten, so dass die Performance im Vergleich zu einer optimalen Indexmenge reduziert wird.

Wenn glDrawRangeElements aufgerufen wird, benutzt der Befehl count sequentielle Elemente eines aktivierten Arrays, beginnend bei start um eine Folge an geometrischen Primitiven zu konstruieren. mode gibt an, welche Art von Primitiven konstruiert wird und wie die Array-Elemente diese Primitiven konstruieren. Wenn mehr als ein Array aktiviert ist, wird jedes einzelne davon benutzt. Falls GL_VERTEX_ARRAY nicht aktiviert ist, werden keine geometrischen Primitiven konstruiert.

Vertex-Attribute, die durch glDrawRangeElements verändert werden, haben einen undefinierten Wert nachdem glDrawRangeElements beendet ist. Z.B., falls GL_COLOR_ARRAY aktiviert ist, ist der Wert der aktuell gesetzten Farbe undefiniert nachdem glDrawRangeElements ausgeführt wurde. Attribute, die nicht verändert wurden, behalten ihre ursprünglichen Werte.


Hinweise

glDrawRangeElements ist erst ab GL Version 1.2 oder höher nutzbar.

Ersetzt die Extension GL_EXT_draw_range_elements.

glDrawRangeElements wird in Displaylisten eingebunden. Falls glDrawRangeElements in eine Displayliste hineinkommt, kommen auch die zugehörigen Array-Daten (festgelegt durch die Arrayzeiger und -aktivierungen) in die Displayliste mithinein. Da die Arrayzeiger und -aktivierungen clientseitige Zustände sind, beeinflussen ihre Werte Displaylisten nur, wenn die Listen erzeugt, jedoch nicht wenn die Listen ausgeführt werden.

Fehlermeldungen

Es ist ein Fehler für Indizes ausserhalb des Bereiches [start, _end] zu liegen, aber Implementationen müssen diesen Fall nicht überprüfen. Solche Indizes verursachen Implementation-abhängiges Verhalten.

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 glDrawRangeElements in einem glBegin-glEnd Block aufgerufen wird.

GL_INVALID_VALUE wird generiert, wenn _end < begin ist.


Zugehörige Wertrückgaben

glGet mit Token GL_MAX_ELEMENTS_VERTICES
glGet mit Token GL_MAX_ELEMENTS_INDICES


Siehe auch

glArrayElement, glColorPointer, glDrawArrays, glDrawElements, glEdgeFlagPointer, glFogCoordPointer, glGetPointerv, glIndexPointer, glInterleavedArrays, glMultiDrawArrays, glMultiDrawElements, glNormalPointer, glSecondaryColorPointer, glTexCoordPointer, glVertexPointer