GL ARB draw instanced

Aus DGL Wiki
Wechseln zu: Navigation, Suche

GL_ARB_draw_instanced

Info DGL.png 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:

Ressourcen