Instancing
Instancing ist eine Technik die es erlaubt große Mengen gleicher oder ähnlicher Geometrie effizient zu rendern. Die Anzahl der API-Aufrufe und die Menge redundanter Daten wird reduziert. Voraussetzung ist, dass alle Objekte die selbe Primitiv-Anzahl und den selben Primitiv-Typ verwenden.
Instancing wurde mit OpenGL 3.1 in den OpenGL-Kern aufgenommen. Bei älteren OpenGL-Versionen muss man auf eine Extension wie beispielsweise GL_ARB_draw_instanced zurückgreifen.
Mit glDrawArraysInstanced und glDrawElementsInstanced 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.
Ein Aufruf von glDrawArraysInstanced entspricht dem folgenden Pseudocode:
void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount) {
if (mode or count is invalid) {
generate appropriate error
}
else {
for (i = 0; i < primcount; i++) {
gl_InstanceID = i;
glDrawArrays(mode, first, count);
}
gl_InstanceID = 0;
}
}
Im GLSL-Vertexshader steht mit gl_InstanceID ein neues Attribut zur Verfügung. 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 TexturBufferObjekt mit Transformations-Daten genutzt werden. Ein Vertexshader ist so in der Lage mehrere Instanzen eines Objektes mit einem einzigen glDraw*-Aufruf zu rendern.
Die Funktion glDrawElementsInstanced funktioniert analog.
Siehe auch
- Shadersammlung: Instancing-Beispiel
- Extension GL_ARB_draw_instanced
- Extension GL_EXT_draw_instanced
- Extension GL_ARB_instanced_arrays