GL ARB draw instanced
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 die selben Vertex-Daten, die selbe Primitiv-Anzahl und den selben Primitiv-Typ verwenden. Diese Extension beschleunigt derartige Anwendungen, in dem die Anzahl der API-Aufrufe und die Menge redundanter Daten reduziert wird. Diese Technik wird Instancing genannt.
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
Ein Beispiel zur Verwendung von Instancing findet sich in der Shadersammlung. 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. Es wird ein GL_INVALID_OPERATION generiert, wenn die Funktion glDrawArraysInstancedARB oder glDrawElementsInstancedARB innerhalb einer Displayliste verwendet wird.
Damit GLSL das neue Attribut gl_InstanceIDARB findet, muss die Extension im Shader explizit aktiviert werden. Dies funktioniert, wie bei anderen Shader-Extensions auch, über die #extension Direktive. Diese setzt man an den Anfang des Shadder-Quellcodes:
#extension GL_ARB_draw_instanced: require
Sollte GLSL das neue Attribut trotzdem nicht finden, ist die Verwendung gl_InstanceID einen Versuch Wert.
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 Vertices 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; }
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