GL ARB draw instanced: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „{{Offline}} = GL_ARB_draw_instanced = {{Hinweis|Die Orginalspezifikation finden Sie unter "Ressourcen" am Ende des Artikels.}} <br> == Abfragestring == GL_ARB_d...“) |
K (→Beschreibung) |
||
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | |||
− | |||
= 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 | + | 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 === | ||
− | { | + | 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==== | ||
+ | Die Funktion [[glDrawArraysInstancedARB]] verhält sich identisch zu [[glDrawArrays]], hat jedoch einen zusätzlichen Parameter. Es werden <tt>primcount</tt> Instanzen gerendert. | ||
+ | |||
+ | ===== Delphi-Spezifikation ===== | ||
+ | procedure '''glDrawArraysInstancedARB'''(''mode'': TGLenum; ''first'': TGLint; ''count'': TGLsizei; ''primcount'' : TGLsizei); | ||
+ | |||
+ | ===== Parameter ===== | ||
+ | {| border="1" rules="all" | ||
+ | ! Parameter | ||
+ | ! Beschreibung | ||
+ | |- | ||
+ | | ''mode'' | ||
+ | | 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'' | ||
+ | | 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 <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) { | ||
+ | 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 <tt>primcount</tt> Instanzen gerendert. | ||
+ | ===== Delphi-Spezifikation ===== | ||
+ | procedure '''glDrawElementsInstancedARB'''(''mode'' : TGLenum; ''count'' : TGLsizei; ''_type'' : TGLenum; | ||
+ | '''const''' ''indices'' : PGLvoid; ''primcount'' : TGLsizei;); | ||
+ | ===== Parameter ===== | ||
+ | {| border="1" rules="all" | ||
+ | | ''mode'' | ||
+ | | Gibt an welcher [[Primitiv]]en-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 <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 ) { | ||
+ | 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 == | == Neue Attribute in GLSL == | ||
Zeile 48: | 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
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