NAME¶
glDrawElementsIndirect - render indexed primitives from array data, taking
parameters from memory
C SPECIFICATION¶
void
glDrawElementsIndirect(GLenum mode,
GLenum type,
const void *indirect);
PARAMETERS¶
mode
Specifies what kind of primitives to render.
Symbolic constants GL_POINTS, GL_LINE_STRIP,
GL_LINE_LOOP, GL_LINES, GL_LINE_STRIP_ADJACENCY,
GL_LINES_ADJACENCY, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,
GL_TRIANGLES, GL_TRIANGLE_STRIP_ADJACENCY,
GL_TRIANGLES_ADJACENCY, and GL_PATCHES are accepted.
type
Specifies the type of data in the buffer bound
to the GL_ELEMENT_ARRAY_BUFFER binding.
indirect
Specifies the address of a structure
containing the draw parameters.
DESCRIPTION¶
glDrawElementsIndirect specifies multiple indexed geometric primitives
with very few subroutine calls.
glDrawElementsIndirect behaves
similarly to
glDrawElementsInstancedBaseVertexBaseInstance(), execpt
that the parameters to
glDrawElementsInstancedBaseVertexBaseInstance()
are stored in memory at the address given by
indirect.
The parameters addressed by
indirect are packed into a structure that
takes the form (in C):
typedef struct {
uint count;
uint primCount;
uint firstIndex;
uint baseVertex;
uint baseInstance;
} DrawElementsIndirectCommand;
void glDrawElementsIndirect(GLenum mode, GLenum type, const void * indirect)
{
const DrawElementsIndirectCommand *cmd = (const DrawElementsIndirectCommand *)indirect;
glDrawElementsInstancedBaseVertexBaseInstance(mode,
cmd->count,
type,
cmd->firstIndex + size-of-type,
cmd->primCount,
cmd->baseVertex,
cmd->baseInstance);
}
If a buffer is bound to the
GL_DRAW_INDIRECT_BUFFER binding at the time
of a call to
glDrawElementsIndirect,
indirect is interpreted as
an offset, in basic machine units, into that buffer and the parameter data is
read from the buffer rather than from client memory.
Note that indices stored in client memory are not supported. If no buffer is
bound to the
GL_ELEMENT_ARRAY_BUFFER binding, an error will be
generated.
The results of the operation are undefined if the reservedMustBeZero member of
the parameter structure is non-zero. However, no error is generated in this
case.
Vertex attributes that are modified by
glDrawElementsIndirect have an
unspecified value after
glDrawElementsIndirect returns. Attributes that
aren't modified remain well defined.
NOTES¶
The
baseInstance member of the
DrawElementsIndirectCommand
structure is defined only if the GL version is 4.2 or greater. For versions of
the GL less than 4.2, this parameter is present but is reserved and should be
set to zero. On earlier versions of the GL, behavior is undefined if it is
non-zero.
ERRORS¶
GL_INVALID_ENUM is generated if
mode is not an accepted value.
GL_INVALID_OPERATION is generated if no buffer is bound to the
GL_ELEMENT_ARRAY_BUFFER binding, or if such a buffer's data store is
currently mapped.
GL_INVALID_OPERATION is generated if a non-zero buffer object name is
bound to an enabled array or to the
GL_DRAW_INDIRECT_BUFFER binding and
the buffer object's data store is currently mapped.
GL_INVALID_OPERATION is generated if a geometry shader is active and
mode is incompatible with the input primitive type of the geometry
shader in the currently installed program object.
GL_INVALID_OPERATION is generated if
mode is
GL_PATCHES and
no tessellation control shader is active.
SEE ALSO¶
glDrawArrays(),
glDrawArraysInstanced(),
glDrawArraysIndirect(),
glDrawElements(),
glDrawRangeElements(),
COPYRIGHT¶
Copyright © 2010 Khronos Group. This material may be distributed subject to
the terms and conditions set forth in the Open Publication License, v 1.0, 8
June 1999.
http://opencontent.org/openpub/.