GL ARB draw instanced

Aus DGL Wiki
Wechseln zu: Navigation, Suche
Hinweis: Dieser Artikel wird gerade Offline bearbeitet!

Bitte haben Sie etwas Geduld und nehmen Sie keine Änderungen vor, bis der Artikel hochgeladen wurde.

(weitere Artikel)
WIP Offline.jpg

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 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:

Ressourcen