files/en-us/web/api/webgl_multi_draw/index.md
{{APIRef("WebGL")}}
The WEBGL_multi_draw extension is part of the
WebGL API and allows to render more
than one primitive with a single function call. This can improve a WebGL application's performance
as it reduces binding costs in the renderer and speeds up GPU thread time with uniform data.
When this extension is enabled:
gl_DrawID built-in is added to the shading language.[!NOTE] This extension is available to both, {{domxref("WebGLRenderingContext", "WebGL 1", "", 1)}} and {{domxref("WebGL2RenderingContext", "WebGL 2", "", 1)}} contexts.
In shader code, the directive
#extension GL_ANGLE_multi_drawneeds to be called to enable the extension.This extension enables the {{domxref("ANGLE_instanced_arrays")}} extension implicitly.
ext.multiDrawArraysWEBGL()
drawArrays).ext.multiDrawElementsWEBGL()
drawElements).ext.multiDrawArraysInstancedWEBGL()
drawArraysInstanced).ext.multiDrawElementsInstancedWEBGL()
drawElementsInstanced).Note: Although the extension name is named WEBGL_multi_draw,
the extension must be enabled with the #extension GL_ANGLE_multi_draw
directive to use the extension in a shader.
When this extension is enabled, the gl_DrawID built-in can be used
in shader code. For any multi* draw call variant,
the index of the draw i may be read by the vertex shader
as gl_DrawID. For non-multi* calls, the value of
gl_DrawID is 0.
<script type="x-shader/x-vertex">
#extension GL_ANGLE_multi_draw : require
void main() {
gl_Position = vec4(gl_DrawID, 0, 0, 1);
}
</script>
WebGL extensions are available using the {{domxref("WebGLRenderingContext.getExtension()")}} method. For more information, see also Using Extensions in the WebGL tutorial.
let ext = gl.getExtension("WEBGL_multi_draw");
Example calls for ext.multiDrawArraysWEBGL()
and ext.multiDrawArraysInstancedWEBGL():
// multiDrawArrays variant
const firsts = new Int32Array(/* … */);
const counts = new Int32Array(/* … */);
ext.multiDrawArraysWEBGL(gl.TRIANGLES, firsts, 0, counts, 0, firsts.length);
// multiDrawArraysInstanced variant
const firsts = new Int32Array(/* … */);
const counts = new Int32Array(/* … */);
const instanceCounts = new Int32Array(/* … */);
ext.multiDrawArraysInstancedWEBGL(
gl.TRIANGLES,
firsts,
0,
counts,
0,
instanceCounts,
0,
firsts.length,
);
Example calls for ext.multiDrawElementsWEBGL()
and ext.multiDrawElementsInstancedWEBGL().
Assumes that the indices which have been previously uploaded to the
ELEMENT_ARRAY_BUFFER are to be treated as UNSIGNED_SHORT.
// multiDrawElements variant
const counts = new Int32Array(/* … */);
const offsets = new Int32Array(/* … */);
ext.multiDrawElementsWEBGL(
gl.TRIANGLES,
counts,
0,
gl.UNSIGNED_SHORT,
offsets,
0,
counts.length,
);
// multiDrawElementsInstanced variant
const counts = new Int32Array(/* … */);
const offsets = new Int32Array(/* … */);
const instanceCounts = new Int32Array(/* … */);
ext.multiDrawElementsInstancedWEBGL(
gl.TRIANGLES,
counts,
0,
gl.UNSIGNED_SHORT,
offsets,
0,
instanceCounts,
0,
counts.length,
);
{{Specifications}}
{{Compat}}