GL ARB draw instanced
Bitte haben Sie etwas Geduld und nehmen Sie keine Änderungen vor, bis der Artikel hochgeladen wurde. |
Inhaltsverzeichnis
GL_ARB_draw_instanced
Die Orginalspezifikation finden Sie unter "Ressourcen" am Ende des Artikels. |
Abfragestring
GL_ARB_draw_instanced
Beschreibung
Ein häufiger Anwendungsfall für OpenGL-Applikationen ist das mehrfache rendern des gleichen Objektes oder einer Gruppe von ähnlichen Objekten die sich Vertex-Daten, Primitiv-Anzahl und -Typ teilen. Diese Extension beschleunigt solche Anwendungen in dem die Anzahl der API-Aufrufe und die Menge redundanter Daten reduziert wird.
Mit glDrawArraysInstancedARB und glDrawElementsInstancedARB werden zwei neue API-Funktionen eingeführt. Diese sind jeweils äquivalent zu einer Serie von Aufrufen der Funktionen glDrawArrays bzw. glDrawElements. Jeder Aufruf glDraw*-Aufruf innerhalb einer solchen Serie wird Instanz genannt.
Diese Extension führt mit gl_InstanceIDARB ein neues Attribut für GLSL-Vertexshader ein. Diese Variable wird zunächst mit 0 initialisiert und dann mit jeder Instanz der Serie inkrementiert.
Diese Instanz ID (oder Vielfache davon) können als Index für ein Uniform-Array, eine Textur oder ein Textur-Buffer-Objekt mit Transformations-Daten genutzt werden. Ein Vertexshader ist so in der Lage mehrere Instanzen eines Objektes mit einem einzigen glDraw*-Aufruf zu rendern.
Verwendung
Die Verwendung der beiden neuen API-Funktionen glDrawArraysInstancedARB und glDrawElementsInstancedARB erfolgt ähnlich wie bisherige Aufrufe der Funktionen glDrawArrays und glDrawElements. Beide Funktionen haben einen zusätzlichen Parameter der die Anzahl der Instanzen angibt.
glDrawArraysInstancedARB
Die Funktion glDrawArraysInstancedARB verhält sich identisch zu glDrawArrays, hat jedoch einen zusätzlichen Parameter. Es werden primcount Instanzen gerendert.
Delphi-Spezifikation
procedure glDrawArraysInstancedARB(mode: TGLenum; first: TGLint; count: TGLsizei; primcount : TGLsizei);
Parameter
Parameter | Beschreibung |
---|---|
mode | Bestimmt, welche Primitiven anhand der Vertexe gezeichnet werden sollen. Es können die gleichen Werte wie bei glBegin übergeben werden: 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. |
first | Definiert den Startindex der aktivierten Arrays. |
count | Definiert die Anzahl der Vertices, die pro Instanz gerendert werden sollen. |
primcount | Definiert die Anzahl der Instanzen, die gerendert werden sollen. |
Beschreibung
Der Wert von gl_InstanceIDARB wird mit jeder Instanz inkrementiert. Ein Aufruf hat den gleichen Effekt wie der folgende Pseudocode:
if (mode or count is invalid) { generate appropriate error } else { for (i = 0; i < primcount; i++) { gl_InstanceIDARB = i; glDrawArrays(mode, first, count); } gl_InstanceIDARB = 0; }
glDrawElementsInstancedARB
Die Funktion glDrawElementsInstancedARB verhält sich identisch zu glDrawElements, hat jedoch einen zusätzlichen Parameter. Es werden primcount Instanzen gerendert.
Delphi-Spezifikation
procedure glDrawElementsInstancedARB(mode : TGLenum; count : TGLsizei; _type : TGLenum; const indices : PGLvoid; primcount : TGLsizei;);
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. |
primcount | Definiert die Anzahl der Instanzen, die gerendert werden sollen. |
Beschreibung
Der Wert von gl_InstanceIDARB wird mit jeder Instanz inkrementiert. Ein Aufruf hat den gleichen Effekt wie der folgende Pseudocode:
if (mode, count, or type is invalid ) { generate appropriate error } else { for (int i = 0; i < primcount; i++) { gl_InstanceIDARB = i; glDrawElements(mode, count, type, indices); } gl_InstanceIDARB = 0; }
Hinweise
Es wird ein GL_INVALID_OPERATION generiert, wenn die Funktion glDrawArraysInstancedARB oder glDrawElementsInstancedARB innerhalb einer Displayliste verwendet wird.
Neue Attribute in GLSL
Sofern GL_EXT_gpu_shader4 verfügbar ist oder OpenGL 3.0 verwendet wird, stehen die folgenden neuen Attribute im Vertexshader zur Verfügung. Wie alle Attribute können sie nur gelesen werden.
- int gl_InstanceIDARB
- Ein 32-bit Integer-Zähler der die Nummer der gerade gerenderten Instanz enthält.
Wird kein Instancing verwendet, hat gl_InstanceIDARB den Wert 0. Wenn GL_EXT_gpu_shader4 unterstützt wird, haben gl_InstanceID und gl_InstanceIDARB den gleichen Wert.
Neue Attribute im Vertexprogramm
Sofern GL_NV_vertex_shader4 verfügbar ist, stehen die folgenden neuen Attribute in Vertexprogrammen zur Verfügung. Wie alle Attribute können sie nur gelesen werden.
- int vertex.instance
- Ein 32-bit Integer-Zähler der die Nummer der gerade gerenderten Instanz enthält.
Wird kein Instancing verwendet, hat vertex.instance den Wert 0.
Neue OpenGL-Funktionen
Abhängigkeiten
Es wird OpenGL 2.0 benötigt. Die Extension wurde anhand der OpenGL 2.1 Spezifikation geschrieben.
Zudem muss mindestens eine der folgenden Abhängigkeiten verfügbar sein:
- GL_EXT_gpu_shader4
- GL_NV_vertex_shader4
- OpenGL 3.0
Ressourcen
- Orginalspezifikation GL_ARB_draw_instanced (englisch)