GL ARB draw instanced: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Verwendung)
K (Beschreibung)
 
(8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Offline}}
 
 
 
= GL_ARB_draw_instanced =
 
= GL_ARB_draw_instanced =
 
{{Hinweis|Die Orginalspezifikation finden Sie unter "Ressourcen" am Ende des Artikels.}}
 
{{Hinweis|Die Orginalspezifikation finden Sie unter "Ressourcen" am Ende des Artikels.}}
Zeile 9: Zeile 7:
  
 
== Beschreibung ==
 
== 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.
+
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.
 
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 <tt>gl_InstanceIDARB</tt> ein neues Attribut für GLSL-Vertexshader ein. Diese Variable wird zunächst mit <tt>0</tt> initialisiert und dann mit jeder Instanz der Serie inkrementiert.
+
Diese Extension führt mit <tt>gl_InstanceIDARB</tt> ein neues Attribut für GLSL-Vertexshader ein. Diese Variable wird zunächst mit <tt>0</tt> 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.
   
 
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 ===
 
=== 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.
+
Ein Beispiel zur Verwendung von Instancing findet sich in der [[shader_Instancing|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 <tt>GL_INVALID_OPERATION</tt> generiert, wenn die Funktion [[glDrawArraysInstancedARB]] oder [[glDrawElementsInstancedARB]] innerhalb einer [[Displayliste]] verwendet wird.
 +
 
 +
Damit GLSL das neue Attribut <tt>gl_InstanceIDARB</tt> findet, muss die Extension im Shader explizit aktiviert werden. Dies funktioniert, wie bei anderen Shader-Extensions auch, über die <tt>#extension</tt> 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 <tt>gl_InstanceID</tt> einen Versuch Wert.
  
 
====glDrawArraysInstancedARB====
 
====glDrawArraysInstancedARB====
Die Funktion [[glDrawArraysInstancedARB]] ist genau wie [[glDrawArrays]] definiert, hat jedoch einen zusätzlichen Parameter.
+
Die Funktion [[glDrawArraysInstancedARB]] verhält sich identisch zu [[glDrawArrays]], hat jedoch einen zusätzlichen Parameter. Es werden <tt>primcount</tt> Instanzen gerendert.
  
 
===== Delphi-Spezifikation =====
 
===== Delphi-Spezifikation =====
Zeile 32: Zeile 32:
 
|-
 
|-
 
| ''mode''
 
| ''mode''
| Bestimmt, welche Primitiven anhand der Vertexe gezeichnet werden sollen.<br> Es können die gleichen Werte wie bei [[glBegin]] übergeben werden:<br>'''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'''.
+
| Bestimmt, welche Primitiven anhand der Vertices gezeichnet werden sollen.<br> Es können die gleichen Werte wie bei [[glBegin]] übergeben werden:<br>'''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''
 
| ''first''
Zeile 45: Zeile 45:
  
 
===== Beschreibung =====
 
===== Beschreibung =====
Die Funktion verhält sich identisch zu [[glDrawArrays]], mit dem Unterschied das <tt>primcount</tt> Instanzen gerendert werden. Der Wert von <tt>gl_InstanceIDARB</tt> wird dabei jeweils inkrementiert. Ein Aufruf hat den gleichen Effekt wie der folgende Pseudocode:
+
Der Wert von <tt>gl_InstanceIDARB</tt> wird mit jeder Instanz inkrementiert. Ein Aufruf hat den gleichen Effekt wie der folgende Pseudocode:
 
  if (mode or count is invalid) {
 
  if (mode or count is invalid) {
 
     generate appropriate error
 
     generate appropriate error
Zeile 58: Zeile 58:
  
 
====glDrawElementsInstancedARB====
 
====glDrawElementsInstancedARB====
Die Funktion [[glDrawElementsInstancedARB]] ist genau wie [[glDrawElements]] definiert, hat jedoch einen zusätzlichen Parameter.
+
Die Funktion [[glDrawElementsInstancedARB]] verhält sich identisch zu [[glDrawElements]], hat jedoch einen zusätzlichen Parameter. Es werden <tt>primcount</tt> Instanzen gerendert.
  
 
===== Delphi-Spezifikation =====
 
===== Delphi-Spezifikation =====
Zeile 80: Zeile 80:
 
| Definiert die Anzahl der Instanzen, die gerendert werden sollen.
 
| Definiert die Anzahl der Instanzen, die gerendert werden sollen.
 
|}
 
|}
 +
 
===== Beschreibung =====
 
===== Beschreibung =====
Die Funktion verhält sich identisch zu [[glDrawElements]], mit dem Unterschied das <tt>primcount</tt> Instanzen gerendert werden. Der Wert von <tt>gl_InstanceIDARB</tt> wird dabei jeweils inkrementiert. Ein Aufruf hat den gleichen Effekt wie der folgende Pseudocode:
+
Der Wert von <tt>gl_InstanceIDARB</tt> wird mit jeder Instanz inkrementiert. Ein Aufruf hat den gleichen Effekt wie der folgende Pseudocode:
 
  if (mode, count, or type is invalid ) {
 
  if (mode, count, or type is invalid ) {
 
     generate appropriate error
 
     generate appropriate error
Zeile 92: Zeile 93:
 
     gl_InstanceIDARB = 0;
 
     gl_InstanceIDARB = 0;
 
  }
 
  }
 
=== Hinweise ===
 
Es wird ein <tt>GL_INVALID_OPERATION</tt> generiert, wenn die Funktion [[glDrawArraysInstancedARB]] oder [[glDrawElementsInstancedARB]] innerhalb einer [[Displayliste]] verwendet wird.
 
  
 
== Neue Attribute in GLSL ==
 
== Neue Attribute in GLSL ==
Zeile 120: Zeile 118:
 
== Ressourcen ==
 
== Ressourcen ==
 
* [http://www.opengl.org/registry/specs/ARB/draw_instanced.txt Orginalspezifikation GL_ARB_draw_instanced] (englisch)
 
* [http://www.opengl.org/registry/specs/ARB/draw_instanced.txt Orginalspezifikation GL_ARB_draw_instanced] (englisch)
 +
* [[shader_Instancing|Beispiel in der Shadersammlung]]

Aktuelle Version vom 9. Januar 2010, 17:58 Uhr

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