Name
ARB_draw_instanced
Name Strings
GL_ARB_draw_instanced
Contributors
Michael Gold, NVIDIA
James Helferty, TransGaming Inc.
Daniel Koch, TransGaming Inc.
Contact
James Helferty, TransGaming Inc. (james 'at' transgaming.com)
Daniel Koch, TransGaming Inc. (daniel 'at' transgaming.com)
Notice
Copyright (c) 2008-2013 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
IP Status
Unknown
Status
Approved by the ARB on July 11, 2008
Version
Last Modified Date: April 8, 2011
Author Revision: 5
Number
ARB Extension #44
Dependencies
OpenGL 2.0 is required.
The extension is written against the OpenGL 2.1 Specification.
EXT_gpu_shader4 or NV_vertex_program4 or OpenGL 3.0 is required.
Overview
A common use case in GL for some applications is to be able to
draw the same object, or groups of similar objects that share
vertex data, primitive count and type, multiple times. This
extension provides a means of accelerating such use cases while
restricting the number of API calls, and keeping the amount of
duplicate data to a minimum.
This extension introduces two draw calls which are conceptually
equivalent to a series of draw calls. Each conceptual call in
this series is considered an "instance" of the actual draw call.
This extension also introduces a read-only built-in variable to
GLSL which contains the "instance ID." This variable initially
contains 0, but increases by one after each conceptual draw call.
By using the instance ID or multiples thereof as an index into
a uniform array containing transform data, vertex shaders can
draw multiple instances of an object with a single draw call.
New Tokens
None
New Procedures and Functions
void DrawArraysInstancedARB(enum mode, int first, sizei count,
sizei primcount);
void DrawElementsInstancedARB(enum mode, sizei count, enum type,
const void *indices, sizei primcount);
Additions to Chapter 2 of the OpenGL 2.1 Specification
(OpenGL Operation)
Modify section 2.8 (Vertex Arrays), p. 23
(insert before the final paragraph, p. 30)
The internal counter is a 32-bit integer value which
may be read by a vertex program as , as described
in section 2.X.3.2, or vertex shader as , as
described in section 2.15.4.2. The value of this counter is
always zero, except as noted below.
The command
void DrawArraysInstancedARB(enum mode, int first, sizei count,
sizei primcount);
behaves identically to DrawArrays except that
instances of the range of elements are executed and the value of
advances for each iteration. It has the same effect
as:
if (mode or count is invalid)
generate appropriate error
else {
for (i = 0; i < primcount; i++) {
instanceID = i;
DrawArrays(mode, first, count, i);
}
instanceID = 0;
}
The command
void DrawElementsInstancedARB(enum mode, sizei count, enum type,
const void *indices, sizei primcount);
behaves identically to DrawElements except that
instances of the set of elements are executed, and the value of
advances for each iteration. It has the same effect
as:
if (mode, count, or type is invalid )
generate appropriate error
else {
for (int i = 0; i < primcount; i++) {
instanceID = i;
DrawElements(mode, count, type, indices, i);
}
instanceID = 0;
}
Add a new section "2.15.4.2 Shader Inputs" before "Position
Invariance"
Besides having access to vertex attributes and uniform variables, vertex
shaders can access the read-only built-in variable gl_InstanceIDARB or
gl_InstanceID. The variables gl_InstanceIDARB and gl_InstanceID hold the
integer index of the current primitive in an instanced draw call. See
also section 7.1 of the OpenGL Shading Language Specification.
Additions to Chapter 5 of the OpenGL 2.1 Specification
(Special Functions)
The error INVALID_OPERATION is generated if DrawArraysInstancedARB
or DrawElementsInstancedARB is called during display list
compilation.
Dependencies on NV_vertex_program4
If NV_vertex_program4 is not supported, all references to
vertex.instance are deleted.
Errors
INVALID_ENUM is generated by DrawElementsInstancedARB if is
not one of UNSIGNED_BYTE, UNSIGNED_SHORT or UNSIGNED_INT.
INVALID_VALUE is generated by DrawArraysInstancedARB if is
less than zero.
Modifications to The OpenGL Shading Language Specification, Version 1.10.59
Including the following line in a shader can be used to control the
language features described in this extension:
#extension GL_ARB_draw_instanced :
where is as specified in section 3.3.
A new preprocessor #define is added to the OpenGL Shading Language:
#define GL_ARB_draw_instanced 1
Change Section 7.1 "Vertex Shader Special Variables"
Add the following definitions to the list of built-in variable definitions:
int gl_InstanceIDARB; // read-only
int gl_InstanceID; // read-only
Add the following paragraph at the end of the section:
The variables gl_InstanceIDARB and gl_InstanceID are available as a
read-only variables from within vertex shaders and hold the integer index
of the current primitive in an instanced draw call
(DrawArraysInstancedARB, DrawElementsInstancedARB). If the current
primitive does not come from an instanced draw call, the values of
gl_InstanceIDARB and gl_InstanceID are zero.
Issues
(1) Should instanceID be provided by this extension, or should it be
provided by the core OpenGL 3.0 (similarly to how it was done with
EXT_gpu_shader4)?
Resolved: Provide both instanceID and instanceIDARB. The original
intention was that instanceID and other language changes should be
provided by this extension and properly decorated with the ARB suffix.
However, many vendors shipped implementations that supported both, and
some applications came to depend on this out-of-spec behavior. It
appears that the EXT_gpu_shader4 incorrectly neglected to specify the
suffix EXT suffix for gl_InstanceID.
(2) Should MultiDrawArrays and MultiDrawElements affect the value of
instanceID?
Resolved: No, this may cause implementation difficulties and
is considered unlikely to provide any real benefit.
(3) Should DrawArraysInstanced and DrawElementsInstanced be compiled
into display lists?
Resolved: No, calling these during display list compilation
generate INVALID_OPERATION.
Revision History
#5 April 8, 2011, Ian Romanick
- Fix typo "holds holds"
- Make both gl_InstanceID and gl_InstanceIDARB available to reflect
what vendors actually ship.
- Existence of gl_InstanceID and gl_InstanceIDARB do not depend on
OpenGL 3.0 or GL_EXT_gpu_shader4.
#4 July 8, 2008, jhelferty
- corrected dependency typo
- expanded Overview
#3 June 4, 2008, dgkoch
- merged instanceID and relevant language from the EXT_gpu_shader4
extension revision 13.
- renamed to InstanceID_ARB to properly follow conventions
- merged issues 1 & 4
#2 May 14 2008, jlheferty
- added contact, contributer information.
- bumped OpenGL spec written against to 2.1
- added issue 4
#1 May 12 2008, dgkoch
- initial conversion from EXT to ARB