WEBGL_multi_draw_instanced_base_vertex_base_instance
WebGL working group (public_webgl 'at' khronos.org)
Contributors to the ANGLE_base_vertex_base_instance specification
Contributors to the WEBGL_multi_draw specification
Members of the WebGL working group
Last modified date: May 26, 2021
Revision: 7
WebGL extension #47
Written against the WebGL API 2.0 specification.
Implementations must also support the WEBGL_multi_draw extension.
Implementations must also support the WEBGL_draw_instanced_base_vertex_base_instance extension.
This extension exposes the ANGLE_base_vertex_base_instance functionality to WebGL.
The following WebGL-specific behavioral changes apply:
MultiDrawArraysInstancedBaseInstanceANGLE
and
MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE
entrypoints as
multiDrawArraysInstancedBaseInstanceWEBGL
and
multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL
.
multiDrawArraysInstancedBaseInstanceWEBGL
and
multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL
, similarly to how indices
referenced by drawArrays
and drawElements
are validated according
to section
Enabled Vertex Attributes and Range Checking
and
Range Checking
of the WebGL specification.
#extension GL_ANGLE_multi_draw
directive,
as shown in the sample code, to use the gl_DrawID
built-in in a shader.
Likewise the shading language preprocessor #define GL_ANGLE_multi_draw
, will be defined to 1 if the extension is supported.
Consult the above extension for documentation, issues and new functions and enumerants.
The baseVertex functionality could effectly help reduce CPU overhead with static batching and text rendering in game engine implementations.
The baseInstance functionality could make instanced arrays more useful as they could start instancing from a particular point in the buffer.
The multi draw functionality could help reduce draw call overhead by allowing better batching.
When this extension is enabled:
multiDrawArraysInstancedBaseInstanceWEBGL
and
multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL
entry points are added.
They behave identically to multiple calls to drawArraysInstanced
and
drawElementsInstanced
except they handle multiple lists of arguments in one
call, plus that the first element within those instanced vertex attributes is specified in
baseInstancesList
.
multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL
in addition
specifies the value of base vertex of each draw call to be values inbaseVerticesList
instead of zero.
[Exposed=(Window,Worker), LegacyNoInterfaceObject] interface WEBGL_multi_draw_instanced_base_vertex_base_instance { undefined multiDrawArraysInstancedBaseInstanceWEBGL( GLenum mode, ([AllowShared] Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset, ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset, GLsizei drawcount ); undefined multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL( GLenum mode, ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, GLenum type, ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset, ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, ([AllowShared] Int32Array or sequence<GLint>) baseVerticesList, GLuint baseVerticesOffset, ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset, GLsizei drawcount ); };
var ext = gl.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"); { // multiDrawArraysInstancedBaseInstance variant. let firsts = new Int32Array(...); let counts = new Int32Array(...); let instanceCounts = new Int32Array(...); let baseInstances = new Uint32Array(...); ext.multiDrawArraysInstancedBaseInstanceWEBGL( gl.TRIANGLES, first, 0, counts, 0, instanceCounts, 0, baseInstances, 0, counts.length); } { // multiDrawElementsInstancedBaseVertexBaseInstance variant. // Assumes that the indices which have been previously uploaded to the // ELEMENT_ARRAY_BUFFER are to be treated as UNSIGNED_SHORT. let counts = new Int32Array(...); let offsets = new Int32Array(...); let instanceCounts = new Int32Array(...); let baseVertices = new Int32Array(...); let baseInstances = new Uint32Array(...); ext.multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL( gl.TRIANGLES, counts, 0, gl.UNSIGHNED_SHORT, offsets, 0, instanceCounts, 0, baseVertices, 0, baseInstances, 0, counts.length); }
#version 300 es #extension GL_ANGLE_multi_draw : require void main() { gl_Position = vec4(gl_VertexID, gl_InstanceID, gl_DrawID, 1); }
Revision 1, 2019/08/28
Revision 2, 2019/09/25
Revision 3, 2020/06/26
Revision 4, 2020/07/14
Revision 5, 2020/07/28
Revision 6, 2021/05/18
Revision 7, 2021/05/26