1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
<?xml version="1.0"?>
<ratified href="WEBGL_draw_buffers/">
<name>WEBGL_draw_buffers</name>
<contact>
<a href="https://www.khronos.org/webgl/public-mailing-list/">WebGL working group</a> (public_webgl 'at' khronos.org)
</contact>
<contributors>
<contributor>Members of the WebGL working group</contributor>
</contributors>
<number>18</number>
<depends>
<api version="1.0"/>
<core version="2.0">
<glsl version="300 es"/>
</core>
</depends>
<overview>
<mirrors href="https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_buffers.txt" name="EXT_draw_buffers">
<addendum>
The implementation must support a minimum of 4 color attachments.
</addendum>
<addendum>
The value of the <code>MAX_COLOR_ATTACHMENTS_WEBGL</code> parameter must be greater than or
equal to that of the <code>MAX_DRAW_BUFFERS_WEBGL</code> parameter.
</addendum>
<addendum>
If:
<ul>
<li> A framebuffer's color attachments are all textures allocated with format <code>RGBA</code>
and type <code>UNSIGNED_BYTE</code>, and </li>
<li> The framebuffer has either:
<ul>
<li> No depth or stencil attachment </li>
<li> A valid <code>DEPTH</code> or <code>DEPTH_STENCIL</code> attachment </li>
</ul></li>
</ul>
Then a call to <code>checkFramebufferStatus</code> against this framebuffer must not return
<code>FRAMEBUFFER_UNSUPPORTED</code>. (In other words, the implementation must support the
use of <code>RGBA/UNSIGNED_BYTE</code> textures as color attachments, plus either a
<code>DEPTH</code> or <code>DEPTH_STENCIL</code> attachment.)
</addendum>
<addendum>
Attaching <code>n</code> consecutive color attachments starting at COLOR_ATTACHMENT0_WEBGL,
where <code>n</code> is between 1 and <code>MAX_DRAW_BUFFERS_WEBGL</code>, must not return
<code>FRAMEBUFFER_UNSUPPORTED</code> from a call to <code>checkFramebufferStatus</code>. In
other words, if <code>MAX_DRAW_BUFFERS_WEBGL</code> is 4, then the implementation is
required to support the following combinations of color attachments:
<ul>
<li> <code>COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE</code></li>
<li> <code>COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE</code><br/>
<code>COLOR_ATTACHMENT1_WEBGL = RGBA/UNSIGNED_BYTE</code><br/></li>
<li> <code>COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE</code><br/>
<code>COLOR_ATTACHMENT1_WEBGL = RGBA/UNSIGNED_BYTE</code><br/>
<code>COLOR_ATTACHMENT2_WEBGL = RGBA/UNSIGNED_BYTE</code><br/></li>
<li> <code>COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE</code><br/>
<code>COLOR_ATTACHMENT1_WEBGL = RGBA/UNSIGNED_BYTE</code><br/>
<code>COLOR_ATTACHMENT2_WEBGL = RGBA/UNSIGNED_BYTE</code><br/>
<code>COLOR_ATTACHMENT3_WEBGL = RGBA/UNSIGNED_BYTE</code><br/></li>
</ul>
</addendum>
<addendum>
Although the extension name is prefixed with WEBGL the extension must be enabled with the
<code>#extension GL_EXT_draw_buffers</code> directive, as shown in the sample code, to use
the extension in a shader.
Likewise the shading language preprocessor <code>#define GL_EXT_draw_buffers</code>, will be defined to 1 if the extension is supported.
</addendum>
<addendum>
The value of <code>gl_MaxDrawBuffers</code> must match <code>MAX_DRAW_BUFFERS_WEBGL</code> from the API if the extension is enabled in a WebGL context; otherwise, the value must be 1. Whether or not the extension is enabled with the <code>#extension GL_EXT_draw_buffers</code> directive in a shader does not affect the value of <code>gl_MaxDrawBuffers</code>. The value of <code>gl_MaxDrawBuffers</code> is a constant in the shader, and is guaranteed to be frozen at program link time. It is implementation-dependent whether it is frozen at shader compile time. (A consequence is that if a program is linked, and later the WEBGL_draw_buffers extension is enabled, the value of <code>gl_MaxDrawBuffers</code> seen by that program will still be 1.)
</addendum>
<addendum>
If the WEBGL_draw_buffers extension is enabled, but the fragment shader does not contain the <code>#extension GL_EXT_draw_buffers</code> directive to enable it, then writes to <code>gl_FragColor</code> are only written to <code>COLOR_ATTACHMENT0_WEBGL</code>, and not broadcast to all color attachments. In this scenario, other color attachments are guaranteed to remain untouched.
</addendum>
<addendum>
If a fragment shader writes to neither <code>gl_FragColor</code> nor <code>gl_FragData</code>, the values of
the fragment colors following shader execution are untouched.
If a fragment shader contains the <code>#extension GL_EXT_draw_buffers</code> directive, all
<code>gl_FragData</code> variables (from <code>gl_FragData[0]</code> to <code>gl_FragData[MAX_DRAW_BUFFERS_WEBGL - 1]</code>)
default to zero if no values are written to them during a shader execution.
</addendum>
<addendum>
If an image is attached to more than one color attachment point in a framebuffer, <code>checkFramebufferStatus</code>
returns <code>FRAMEBUFFER_UNSUPPORTED</code>. An image can be an individual mip level, or a face of cube map.
</addendum>
</mirrors>
<features>
<feature>
Adds support for multiple color buffers and color outputs from fragment shaders.
</feature>
</features>
</overview>
<idl xml:space="preserve">
[NoInterfaceObject]
interface WEBGL_draw_buffers {
const GLenum COLOR_ATTACHMENT0_WEBGL = 0x8CE0;
const GLenum COLOR_ATTACHMENT1_WEBGL = 0x8CE1;
const GLenum COLOR_ATTACHMENT2_WEBGL = 0x8CE2;
const GLenum COLOR_ATTACHMENT3_WEBGL = 0x8CE3;
const GLenum COLOR_ATTACHMENT4_WEBGL = 0x8CE4;
const GLenum COLOR_ATTACHMENT5_WEBGL = 0x8CE5;
const GLenum COLOR_ATTACHMENT6_WEBGL = 0x8CE6;
const GLenum COLOR_ATTACHMENT7_WEBGL = 0x8CE7;
const GLenum COLOR_ATTACHMENT8_WEBGL = 0x8CE8;
const GLenum COLOR_ATTACHMENT9_WEBGL = 0x8CE9;
const GLenum COLOR_ATTACHMENT10_WEBGL = 0x8CEA;
const GLenum COLOR_ATTACHMENT11_WEBGL = 0x8CEB;
const GLenum COLOR_ATTACHMENT12_WEBGL = 0x8CEC;
const GLenum COLOR_ATTACHMENT13_WEBGL = 0x8CED;
const GLenum COLOR_ATTACHMENT14_WEBGL = 0x8CEE;
const GLenum COLOR_ATTACHMENT15_WEBGL = 0x8CEF;
const GLenum DRAW_BUFFER0_WEBGL = 0x8825;
const GLenum DRAW_BUFFER1_WEBGL = 0x8826;
const GLenum DRAW_BUFFER2_WEBGL = 0x8827;
const GLenum DRAW_BUFFER3_WEBGL = 0x8828;
const GLenum DRAW_BUFFER4_WEBGL = 0x8829;
const GLenum DRAW_BUFFER5_WEBGL = 0x882A;
const GLenum DRAW_BUFFER6_WEBGL = 0x882B;
const GLenum DRAW_BUFFER7_WEBGL = 0x882C;
const GLenum DRAW_BUFFER8_WEBGL = 0x882D;
const GLenum DRAW_BUFFER9_WEBGL = 0x882E;
const GLenum DRAW_BUFFER10_WEBGL = 0x882F;
const GLenum DRAW_BUFFER11_WEBGL = 0x8830;
const GLenum DRAW_BUFFER12_WEBGL = 0x8831;
const GLenum DRAW_BUFFER13_WEBGL = 0x8832;
const GLenum DRAW_BUFFER14_WEBGL = 0x8833;
const GLenum DRAW_BUFFER15_WEBGL = 0x8834;
const GLenum MAX_COLOR_ATTACHMENTS_WEBGL = 0x8CDF;
const GLenum MAX_DRAW_BUFFERS_WEBGL = 0x8824;
void drawBuffersWEBGL(sequence<GLenum> buffers);
};
</idl>
<samplecode xml:space="preserve">
<pre>
#extension GL_EXT_draw_buffers : require
precision mediump float;
void main() {
gl_FragData[0] = vec4(1.0, 0.0, 0.0, 1.0);
gl_FragData[1] = vec4(0.0, 1.0, 0.0, 1.0);
gl_FragData[2] = vec4(0.0, 0.0, 1.0, 1.0);
gl_FragData[3] = vec4(1.0, 1.0, 1.0, 1.0);
}
</pre>
</samplecode>
<history>
<revision date="2012/10/16">
<change>Initial revision.</change>
</revision>
<revision date="2012/11/05">
<change>Corrected typo in drawBuffersWEBGL. Changed referenced spec version to 1.0 to fix broken link.</change>
</revision>
<revision date="2013/02/02">
<change>Renamed to EXT_draw_buffers per plan of OpenGL ES working group. Moved to draft status. Assigned number.</change>
</revision>
<revision date="2013/03/05">
<change>Renamed to WEBGL_draw_buffers per discussion on public_webgl list. Added guarantees to make it easier for developers to use the extension.</change>
</revision>
<revision date="2013/06/07">
<change>Clarified naming of shader directives.</change>
</revision>
<revision date="2014/07/15">
<change>Added NoInterfaceObject extended attribute.</change>
</revision>
<revision date="2014/08/08">
<change>Ratified by Khronos Board of Promoters.</change>
</revision>
<revision date="2016/06/28">
<change>Revised behavior of gl_MaxDrawBuffers and gl_FragColor broadcasting, to avoid significant performance impact for WebGL 1.0 implementations running on top of the desktop OpenGL API.</change>
</revision>
<revision date="2016/07/08">
<change>Removed undefined behaviors.</change>
</revision>
<revision date="2016/07/11">
<change>Revised user-defined variable behavior to default to zero.</change>
</revision>
<revision date="2016/07/23">
<change>Revised behavior of the same image is attached to more than one color attachment point.</change>
</revision>
</history>
</ratified>
|