WEBGL_draw_buffers

The WEBGL_draw_buffers extension is part of the WebGL API and enables a fragment shader to write to several textures, which is useful for deferred shading, for example.

WebGL extensions are available using the WebGLRenderingContext.getExtension() method. For more information, see also Using Extensions in the WebGL tutorial.

Availability: This extension is only available to WebGL1 contexts. In WebGL2, the functionality of this extension is available on the WebGL2 context by default. In WebGL 2, the constants are available without the "WEBGL" suffix and the new GLSL built-ins require GLSL #version 300 es.

Constants

This extension exposes new constants, which can be used in the gl.framebufferRenderbuffer(), gl.framebufferTexture2D(), gl.getFramebufferAttachmentParameter()  ext.drawBuffersWEBGL(), and gl.getParameter() methods.

ext.COLOR_ATTACHMENT0_WEBGL<br>
 ext.COLOR_ATTACHMENT1_WEBGL<br>
 ext.COLOR_ATTACHMENT2_WEBGL<br>
 ext.COLOR_ATTACHMENT3_WEBGL<br>
 ext.COLOR_ATTACHMENT4_WEBGL<br>
 ext.COLOR_ATTACHMENT5_WEBGL<br>
 ext.COLOR_ATTACHMENT6_WEBGL<br>
 ext.COLOR_ATTACHMENT7_WEBGL<br>
 ext.COLOR_ATTACHMENT8_WEBGL<br>
 ext.COLOR_ATTACHMENT9_WEBGL<br>
 ext.COLOR_ATTACHMENT10_WEBGL<br>
 ext.COLOR_ATTACHMENT11_WEBGL<br>
 ext.COLOR_ATTACHMENT12_WEBGL<br>
 ext.COLOR_ATTACHMENT13_WEBGL<br>
 ext.COLOR_ATTACHMENT14_WEBGL<br>
 ext.COLOR_ATTACHMENT15_WEBGL
A GLenum specifying a color buffer.
ext.DRAW_BUFFER0_WEBGL<br>
 ext.DRAW_BUFFER1_WEBGL<br>
 ext.DRAW_BUFFER2_WEBGL<br>
 ext.DRAW_BUFFER3_WEBGL<br>
 ext.DRAW_BUFFER4_WEBGL<br>
 ext.DRAW_BUFFER5_WEBGL<br>
 ext.DRAW_BUFFER6_WEBGL<br>
 ext.DRAW_BUFFER7_WEBGL<br>
 ext.DRAW_BUFFER8_WEBGL<br>
 ext.DRAW_BUFFER9_WEBGL<br>
 ext.DRAW_BUFFER10_WEBGL<br>
 ext.DRAW_BUFFER11_WEBGL<br>
 ext.DRAW_BUFFER12_WEBGL<br>
 ext.DRAW_BUFFER13_WEBGL<br>
 ext.DRAW_BUFFER14_WEBGL<br>
 ext.DRAW_BUFFER15_WEBGL
A GLenum returning a draw buffer.
ext.MAX_COLOR_ATTACHMENTS_WEBGL
A GLint indicating the maximum number of framebuffer color attachment points.
ext.MAX_DRAW_BUFFERS_WEBGL
A GLint indicating the maximum number of draw buffers.

Methods

This extension exposes one new method.

ext.drawBuffersWEBGL()

Defines the draw buffers to which all fragment colors are written. (When using WebGL2, this method is available as gl.drawBuffers() by default).

Examples

Enabling the extension:

JavaScript
var ext = gl.getExtension("WEBGL_draw_buffers");

Binding multiple textures (to a tx[] array)  to different framebuffer color attachments:

JavaScript
var fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, ext.COLOR_ATTACHMENT0_WEBGL, gl.TEXTURE_2D, tx[0], 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, ext.COLOR_ATTACHMENT1_WEBGL, gl.TEXTURE_2D, tx[1], 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, ext.COLOR_ATTACHMENT2_WEBGL, gl.TEXTURE_2D, tx[2], 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, ext.COLOR_ATTACHMENT3_WEBGL, gl.TEXTURE_2D, tx[3], 0);

Mapping the color attachments to draw buffer slots that the fragment shader will write to using gl_FragData:

JavaScript
ext.drawBuffersWEBGL([
  ext.COLOR_ATTACHMENT0_WEBGL, // gl_FragData[0]
  ext.COLOR_ATTACHMENT1_WEBGL, // gl_FragData[1]
  ext.COLOR_ATTACHMENT2_WEBGL, // gl_FragData[2]
  ext.COLOR_ATTACHMENT3_WEBGL  // gl_FragData[3]
]);

Shader code that writes to multiple textures:

HTML
<script type="x-shader/x-fragment">
#extension GL_EXT_draw_buffers : require 

precision highp float; 

void main(void) { 
  gl_FragData[0] = vec4(0.25); 
  gl_FragData[1] = vec4(0.5);
  gl_FragData[2] = vec4(0.75); 
  gl_FragData[3] = vec4(1.0);
}
</script>

Specifications

Specification Status Comment
WEBGL_draw_buffers
The definition of 'WEBGL_draw_buffers' in that specification.
Recommendation Initial definition.

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support ? 28 (28) [1] ? ? ?
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support ? ? ? ? ? ?

[2] This extension was prefixed with MOZ_ or disabled behind the webgl.enable-draft-extensions preference in prior versions.

See also

License

© 2016 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-us/docs/web/api/webgl_draw_buffers

API Reference WebGL WebGL extension