1Name 2 3 EXT_draw_buffers 4 5Name Strings 6 7 GL_EXT_draw_buffers 8 9Contributors 10 11 Contributors to GL_NV_draw_buffers 12 Contributors to GL_NV_fbo_color_attachments 13 Contributors to the OpenGL ES 2.0 specification 14 Contributors to the OpenGLSL ES 1.0.17 specification 15 Contributors to the OpenGL ES 3.0 specification 16 Nicolas Capens, TransGaming Inc. 17 Shannon Woods, TransGaming Inc. 18 Alastair Patrick, Google Inc. 19 Kenneth Russell, Google Inc. 20 Greg Roth, NVIDIA Corporation 21 Ben Bowman, Imagination Technologies 22 Members of the WebGL and OpenGL ES working groups 23 24Contact 25 26 Daniel Koch (dkoch 'at' nvidia.com) 27 28Status 29 30 Complete 31 32Version 33 34 Last Modified Date: May 11, 2013 35 Revision: #8 36 37Number 38 39 OpenGL ES Extension #151 40 41Dependencies 42 43 OpenGL ES 2.0 is required. 44 45 The extension is written against the OpenGL ES 2.0 specification. 46 47 ANGLE_framebuffer_blit affects the definition of this extension. 48 APPLE_framebuffer_multisample affects the definitin of this extension. 49 50Overview 51 52 This extension increases the number of available framebuffer object 53 color attachment points, extends OpenGL ES 2.0 to allow multiple output 54 colors, and provides a mechanism for directing those outputs to 55 multiple color buffers. 56 57 This extension is similar to the combination of the GL_NV_draw_buffers 58 and GL_NV_fbo_color_attachments extensions, but imposes certain 59 restrictions informed by the OpenGL ES 3.0 API. 60 61New Procedures and Functions 62 63 void DrawBuffersEXT(sizei n, const enum *bufs); 64 65New Tokens 66 67 Accepted by the <pname> parameter of GetIntegerv: 68 69 MAX_COLOR_ATTACHMENTS_EXT 0x8CDF 70 71 Accepted by the <pname> parameters of GetIntegerv and GetFloatv: 72 73 MAX_DRAW_BUFFERS_EXT 0x8824 74 DRAW_BUFFER0_EXT 0x8825 75 DRAW_BUFFER1_EXT 0x8826 76 DRAW_BUFFER2_EXT 0x8827 77 DRAW_BUFFER3_EXT 0x8828 78 DRAW_BUFFER4_EXT 0x8829 79 DRAW_BUFFER5_EXT 0x882A 80 DRAW_BUFFER6_EXT 0x882B 81 DRAW_BUFFER7_EXT 0x882C 82 DRAW_BUFFER8_EXT 0x882D 83 DRAW_BUFFER9_EXT 0x882E 84 DRAW_BUFFER10_EXT 0x882F 85 DRAW_BUFFER11_EXT 0x8830 86 DRAW_BUFFER12_EXT 0x8831 87 DRAW_BUFFER13_EXT 0x8832 88 DRAW_BUFFER14_EXT 0x8833 89 DRAW_BUFFER15_EXT 0x8834 90 91 Accepted by the <attachment> parameter of FramebufferRenderbuffer, 92 FramebufferTexture2D and GetFramebufferAttachmentParameteriv, and by 93 the <bufs> parameter of DrawBuffersEXT: 94 95 COLOR_ATTACHMENT0_EXT 0x8CE0 96 COLOR_ATTACHMENT1_EXT 0x8CE1 97 COLOR_ATTACHMENT2_EXT 0x8CE2 98 COLOR_ATTACHMENT3_EXT 0x8CE3 99 COLOR_ATTACHMENT4_EXT 0x8CE4 100 COLOR_ATTACHMENT5_EXT 0x8CE5 101 COLOR_ATTACHMENT6_EXT 0x8CE6 102 COLOR_ATTACHMENT7_EXT 0x8CE7 103 COLOR_ATTACHMENT8_EXT 0x8CE8 104 COLOR_ATTACHMENT9_EXT 0x8CE9 105 COLOR_ATTACHMENT10_EXT 0x8CEA 106 COLOR_ATTACHMENT11_EXT 0x8CEB 107 COLOR_ATTACHMENT12_EXT 0x8CEC 108 COLOR_ATTACHMENT13_EXT 0x8CED 109 COLOR_ATTACHMENT14_EXT 0x8CEE 110 COLOR_ATTACHMENT15_EXT 0x8CEF 111 112 The COLOR_ATTACHMENT0_EXT constant is equal to the 113 COLOR_ATTACHMENT0 constant. 114 115 Each COLOR_ATTACHMENT<i>_EXT adheres to COLOR_ATTACHMENT<i>_EXT 116 = COLOR_ATTACHMENT0_EXT + <i>. 117 118Changes to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) 119 120 Section 3.2, (Multisampling). Replace the second paragraph: 121 122 An additional buffer, called the multisample buffer, is added to the 123 window system-provided framebuffer. Pixel sample values, including 124 color, depth, and stencil values, are stored in this buffer. Samples 125 contain separate color values for each fragment color. When the 126 window system-provided framebuffer includes a multisample buffer, it 127 does not include depth or stencil buffers, even if the multisample 128 buffer does not store depth or stencil values. Color buffers do 129 coexist with the multisample buffer, however. 130 131 Section 3.8.2, (Shader Execution) Replace subsection "Shader 132 Outputs": 133 134 The OpenGL ES Shading Language specification describes the values 135 that may be output by a fragment shader. These are gl_FragColor and 136 gl_FragData[n]. The final fragment color values or the final 137 fragment data values written by a fragment shader are clamped to the 138 range [0, 1] and then converted to fixed-point as described in 139 section 2.1.2 for framebuffer color components. 140 141 Writing to gl_FragColor specifies the fragment color (color number 142 zero) that will be used by subsequent stages of the pipeline. 143 Writing to gl_FragData[n] specifies the value of fragment color 144 number n. Any colors, or color components, associated with a 145 fragment that are not written by the fragment shader are undefined. 146 A fragment shader may not statically assign values to both 147 gl_FragColor and gl_FragData. In this case, a compile or link error 148 will result. A shader statically assigns a value to a variable if, 149 after preprocessing, it contains a statement that would write to the 150 variable, whether or not run-time flow of control will cause that 151 statement to be executed. 152 153Changes to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment 154Operations and the Frame Buffer) 155 156 Modify the overview of Chapter 4 and replace the sentences 157 of the fifth paragraph which read: 158 159 "The name of the color buffer of an application-created framebuffer 160 object is COLOR_ATTACHMENT0. The names of the depth and stencil buffers 161 are DEPTH_ATTACHMENT and STENCIL_ATTACHMENT." 162 163 With the following: 164 165 "A framebuffer object has an array of color buffer attachment points, 166 numbered zero through <n>, a depth buffer attachment point, and a 167 stencil buffer attachment point." 168 169 Insert Table 4.3 to Section 4.2.1 (and renumber subsequent tables): 170 171 Symbolic Constant Meaning 172 ----------------- --------------------- 173 NONE No buffer 174 175 COLOR_ATTACHMENT<i>_EXT (see caption) Output fragment color to image 176 attached at color attachment 177 point i 178 179 Table 4.3: Arguments to DrawBuffersEXT when the context is bound to a 180 framebuffer object, and the buffers they indicate. <i> in 181 COLOR_ATTACHMENT<i>_EXT may range from zero to the value of 182 MAX_COLOR_ATTACHMENTS_EXT minus one. 183 184 Replace Section 4.2.1, "Selecting a Buffer for Writing" with the following: 185 186 "By default, color values are written into the front buffer for 187 single buffered surfaces or into the back buffer for back buffered 188 surfaces as determined when making the context current. To control 189 the color buffer into which each of the fragment color values is 190 written, DrawBuffersEXT is used. 191 192 The command 193 194 void DrawBuffersEXT(sizei n, const enum *bufs); 195 196 defines the draw buffers to which all fragment colors are written. 197 <n> specifies the number of buffers in <bufs>. <bufs> is a pointer 198 to an array of symbolic constants specifying the buffer to which 199 each fragment color is written. 200 201 Each buffer listed in <bufs> must be BACK, NONE, or one of the 202 values from table 4.3. Further, acceptable values for the constants 203 in <bufs> depend on whether the GL is using the default framebuffer 204 (i.e., DRAW_FRAMEBUFFER_BINDING is zero), or a framebuffer object 205 (i.e., DRAW_FRAMEBUFFER_BINDING is non-zero). For more information 206 about framebuffer objects, see section 4.4. 207 208 If the GL is bound to the default framebuffer, then <n> must be 1 209 and the constant must be BACK or NONE. When draw buffer zero is 210 BACK, color values are written into the sole buffer for single- 211 buffered contexts, or into the back buffer for double-buffered 212 contexts. If DrawBuffersEXT is supplied with a constant other than 213 BACK and NONE, or with a value of <n> other than 1, the error 214 INVALID_OPERATION is generated. 215 216 If the GL is bound to a draw framebuffer object, then each of the 217 constants must be one of the values listed in table 4.3. Calling 218 DrawBuffersEXT with <n> equal zero is equivalent to setting all the 219 draw buffers to NONE. 220 221 In both cases, the draw buffers being defined correspond in order to 222 the respective fragment colors. The draw buffer for fragment 223 colors beyond <n> is set to NONE. 224 225 The maximum number of draw buffers is implementation-dependent. The 226 number of draw buffers supported can be queried by calling 227 GetIntegerv with the symbolic constant MAX_DRAW_BUFFERS_EXT. An 228 INVALID_VALUE error is generated if <n> is greater than 229 MAX_DRAW_BUFFERS_EXT. 230 231 If the GL is bound to a draw framebuffer object, the <i>th buffer listed 232 in <bufs> must be COLOR_ATTACHMENT<i>_EXT or NONE. Specifying a 233 buffer out of order, BACK, or COLOR_ATTACHMENT<m>_EXT where <m> is 234 greater than or equal to the value of MAX_COLOR_ATTACHMENTS_EXT, 235 will generate the error INVALID_OPERATION. 236 237 If a fragment shader writes to "gl_FragColor", DrawBuffersEXT 238 specifies the set of draw buffers into which the color 239 written to "gl_FragColor" is written. If a fragment shader writes to 240 "gl_FragData", DrawBuffersEXT specifies a set of draw buffers 241 into which each of the multiple output colors defined by these 242 variables are separately written. If a fragment shader writes to 243 neither "gl_FragColor" nor "gl_FragData" the values of the 244 fragment colors following shader execution are undefined, and may 245 differ for each fragment color. 246 247 Indicating a buffer or buffers using DrawBuffersEXT causes 248 subsequent pixel color value writes to affect the indicated 249 buffers. If the GL is bound to a draw framebuffer object and a draw 250 buffer selects an attachment that has no image attached, then that 251 fragment color is not written. 252 253 Specifying NONE as the draw buffer for a fragment color will inhibit 254 that fragment color from being written. 255 256 The state required to handle color buffer selection for each 257 framebuffer is an integer for each supported fragment color. For the 258 default framebuffer, in the initial state the draw buffer for 259 fragment color zero is BACK if there is a default framebuffer 260 associated with the context, otherwise NONE. For framebuffer 261 objects, in the initial state the draw buffer for fragment color 262 zero is COLOR_ATTACHMENT0_EXT. 263 264 For both the default framebuffer and framebuffer objects, the 265 initial state of draw buffers for fragment colors other than zero is 266 NONE. 267 268 The value of the draw buffer selected for fragment color <i> can be 269 queried by calling GetIntegerv with the symbolic constant 270 DRAW_BUFFER<i>_EXT." 271 272 Modify Section 4.2.3 (Clearing the Buffers) and replace the first 273 two paragraphs with the following: 274 275 "The GL provides a means for setting portions of every pixel in a 276 particular buffer to the same value. The argument to 277 278 void Clear(bitfield buf); 279 280 is the bitwise OR of a number of values indicating which buffers are 281 to be cleared. The values are COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT, and 282 STENCIL_BUFFER_BIT, indicating the buffers currently enabled for color 283 writing, the depth buffer, and the stencil buffer (see below), 284 respectively. The value to which each buffer is cleared depends on 285 the setting of the clear value for that buffer. If the mask is not a 286 bitwise OR of the specified values, then the error INVALID_VALUE is 287 generated. 288 289 void ClearColor(clampf r, clampf, g, clampf b, clampf a); 290 291 sets the clear value for fixed-point color buffers. Each of the 292 specified components is clamped to [0, 1] and converted to fixed-point 293 as described in section 2.1.2 for framebuffer color components." 294 295 Replace the second paragraph of Section 4.4.1 (Binding and Managing 296 Framebuffer Objects) with the following: 297 298 "The namespace for framebuffer objects is the unsigned integers, with 299 zero reserved by OpenGL ES to refer to the default framebuffer. A 300 framebuffer object is created by binding an unused name to the 301 target FRAMEBUFFER, DRAW_FRAMEBUFFER, or READ_FRAMEBUFFER. The binding 302 is effected by calling 303 304 void BindFramebuffer(enum target, uint framebuffer); 305 306 with <target> set the desired framebuffer target and <framebuffer> set 307 to the unused name. The resulting framebuffer object is a new state 308 vector. There is a number of color attachment points, plus one each 309 for the depth and stencil attachment points. The number of color attachment 310 points is equal to the value of MAX_COLOR_ATTACHMENTS_EXT." 311 312 Replace the third item in the bulleted list in Section 4.4.1 (Binding 313 and Managing Framebuffer Objects) with the following: 314 315 " * The only color buffer bitplanes are the ones defined by the 316 framebuffer attachments points named COLOR_ATTACHMENT0_EXT through 317 COLOR_ATTACHMENT<n>_EXT." 318 319 Modify Section 4.4.3 (Renderbuffer Objects) in the 320 "Attaching Renderbuffer Images to a Framebuffer" subsection as follows: 321 322 Insert the following table: 323 324 Name of attachment 325 --------------------------------------- 326 COLOR_ATTACHMENT<i>_EXT (see caption) 327 DEPTH_ATTACHMENT 328 STENCIL_ATTACHMENT 329 330 Table 4.x: Framebuffer attachment points. <i> in COLOR_ATTACHMENT<i>_EXT 331 may range from zero to the value of MAX_COLOR_ATTACHMENTS_EXT minus 1. 332 333 Modify the third sentence of the paragraph following the definition of 334 FramebufferRenderbuffer to be as follows: 335 336 "<attachment> should be set to one of the attachment points of the 337 framebuffer listed in Table 4.x." 338 339 Modify Section 4.4.3 (Renderbuffer Objects) in the "Attaching Texture 340 Images to a Framebuffer" subsection as follows: 341 342 Modify the last sentence of the paragraph following the definition of 343 FramebufferTexture2D to be as follows: 344 345 "<attachment> must be one of the attachment points of the framebuffer 346 listed in Table 4.x." 347 348 Modify Section 4.4.5 (Framebuffer Completeness) and replace the 3rd 349 item in the bulleted list in the "Framebuffer Attachment Completeness" 350 subsection with the following: 351 352 " * If <attachment> is COLOR_ATTACHMENT<i>_EXT, then <image> must 353 have a color-renderable internal format." 354 355Changes to Chapter 6 of the OpenGL ES 2.0 Specification (State and 356State Requests) 357 358 In section 6.1.3 (Enumerated Queries) modify the third sentence in 359 the definition of GetFramebufferAttachmentParameteriv to be as follows: 360 361 "<attachment> must be one of the attachment points of the framebuffer 362 listed in Table 4.x." 363 364Changes to Chapter 3 of the OpenGL ES Shading Language 1.0.17 Specification (Basics) 365 366 Add a new section: 367 368 3.4.1 GL_EXT_draw_buffers Extension 369 370 To use the GL_EXT_draw_buffers extension in a shader it 371 must be enabled using the #extension directive. 372 373 The shading language preprocessor #define 374 GL_EXT_draw_buffers will be defined to 1, if the 375 GL_EXT_draw_buffers extension is supported. 376 377Dependencies on ANGLE_framebuffer_blit and APPLE_framebuffer_multisample: 378 379 If neither ANGLE_framebuffer_blit nor APPLE_framebuffer_multisample are 380 supported, then all references to "draw framebuffers" should be replaced 381 with references to "framebuffers". References to DRAW_FRAMEBUFFER_BINDING 382 should be replaced with references to FRAMEBUFFER_BINDING. References to 383 DRAW_FRAMEBUFFER and READ_FRAMEBUFFER should be removed. 384 385 If ANGLE_framebuffer_blit is supported, DRAW_FRAMEBUFFER_BINDING, DRAW_FRAMEBUFFER 386 and READ_FRAMEBUFFER all refer to corresponding _ANGLE suffixed names 387 (they have the same token values). 388 389 If APPLE_framebuffer_multisample is supported, DRAW_FRAMEBUFFER_BINDING, 390 DRAW_FRAMEBUFFER and READ_FRAMEBUFFER all refer to the corresponding _APPLE 391 suffixed names (they have the same token values). 392 393Errors 394 395 The INVALID_OPERATION error is generated if DrawBuffersEXT is called 396 when the default framebuffer is bound and any of the following conditions 397 hold: 398 - <n> is zero, 399 - <n> is greater than 1 and less than MAX_DRAW_BUFFERS_EXT, 400 - <bufs> contains a value other than BACK or NONE. 401 402 The INVALID_OPERATION error is generated if DrawBuffersEXT is called 403 when bound to a draw framebuffer object and any of the following 404 conditions hold: 405 - the <i>th value in <bufs> is not COLOR_ATTACHMENT<i>_EXT or NONE. 406 407 The INVALID_VALUE error is generated if DrawBuffersEXT is called 408 with a value of <n> which is greater than MAX_DRAW_BUFFERS_EXT. 409 410 The INVALID_ENUM error is generated by FramebufferRenderbuffer if 411 the <attachment> parameter is not one of the values listed in Table 4.x. 412 413 The INVALID_ENUM error is generated by FramebufferTexture2D if 414 the <attachment> parameter is not one of the values listed in Table 4.x. 415 416 The INVALID_ENUM error is generated by GetFramebufferAttachmentParameteriv 417 if the <attachment> parameter is not one of the values listed in Table 4.x. 418 419New State 420 421 Add Table 6.X Framebuffer (State per framebuffer object): 422 423 State Type Get Command Initial Value Description 424 ------------------ ---- ------------ ------------- ----------- 425 DRAW_BUFFER<i>_EXT Z10* GetIntegerv see 4.2.1 Draw buffer selected 426 for fragment color i 427 428 Add to Table 6.18 (Implementation Dependent Values) 429 430 Get value Type Get Cmnd Minimum Value Description Sec. 431 -------------------- ---- ----------- ------------- ----------- ----- 432 MAX_DRAW_BUFFERS_EXT Z+ GetIntegerv 1 Maximum number of 4.2.1 433 active draw buffers 434 MAX_COLOR_ATTACHMENTS_EXT Z+ GetIntegerv 1 Number of framebuffer 4.4.1 435 color attachment points 436Issues 437 438 See ARB_draw_buffers for relevant issues. 439 440 1) What are the differences between this extension and NV_draw_buffers 441 + NV_fbo_color_attachments? 442 443 RESOLVED. This extension: 444 - adds interactions with blit_framebuffer and the separate 445 draw/read binding points 446 - The draw buffer and color attachment limits are global instead 447 of per-fbo (see Issue 2) 448 - can be used to with default framebuffer to set NONE/BACK (see Issue 4) 449 - retains the ordering restrictions on color attachments that are 450 imposed by ES 3.0. 451 452 2) Should the MAX_DRAW_BUFFERS_EXT and MAX_COLOR_ATTACHMENTS_EXT limits 453 be per-framebuffer values or implementation dependent constants? 454 455 DISCUSSION: In ARB_draw_buffers this was per-context (see Issue 2). 456 EXT_framebuffer_object (and subsequently ARB_framebuffer_object, and GL 3.0 457 through GL 4.2) made these queries framebuffer-dependent. 458 However in GL 4.3 and GLES 3.0, these limits were changed from 459 framebuffer-dependent state to implementation-dependent state after 460 much discussion (Bug 7990). 461 462 NV_draw_buffers has MAX_DRAW_BUFFERS listed as per-framebuffer state, 463 but NV_fbo_color_attachments has MAX_COLOR_ATTACHMENTS as an 464 implementation-dependent constant. 465 466 This is relevant because some implementations are not able to support 467 multisampling in conjuction with multiple color attachments. If the 468 query is per-framebuffer, they can report a maximum of one attachment 469 when there are multisampled attachments, but a higher limit when only 470 single-sampled attachments are present. 471 472 RESOLVED. Make this global context state as this is most consistent 473 with GLES 3.0 and updated GL drivers. In an implementation cannot 474 support multisampling in conjunction with multiple color attachments, 475 perhaps such an implementation could report FBO incomplete in this 476 situation, but this is less than desirable. 477 478 3) Should we support broadcast from gl_FragColor to all gl_FragData[x] 479 or should it be synonymous with gl_FragData[0]? 480 481 DISCUSSION: With NV_draw_buffers, writing to gl_FragColor writes to all 482 the enabled draw buffers (ie broadcast). In OpenGL ES 3.0 when using 483 ESSL 1.0, gl_FragColor is equivalent to writing a single output to 484 gl_FragData[0] and multiple outputs are not possible. When using ESSL 3.0, 485 only user-defined out variables may be used. 486 487 If broadcast is supported, some implementations may have to replace 488 writes to gl_FragColor with replicated writes to all possible gl_FragData 489 locations when this extension is enabled. 490 491 RESOLVED: Writes to gl_FragColor are broadcast to all enabled color 492 buffers. ES 3.0 using ESSL 1.0 doesn't support broadcast because 493 ESSL 1.0 was not extended to have multiple color outputs (but that is 494 what this extension adds). ESSL 3.0 doesn't support the broadcast because 495 it doesn't have the gl_FragColor variable at all, and only has user- 496 defined out variables. This extension extends ESSL 1.0 to have multiple 497 color outputs. Broadcasting from gl_FragColor to all enabled color 498 buffers is the most consistent with existing draw buffer extensions to 499 date (both NV_draw_buffers and desktop GL). 500 501 4) Should we allow DrawBuffersEXT to be called when the default FBO is 502 bound? 503 504 DISCUSSION: NV_draw_buffers specifies that DrawBuffersNV errors with 505 INVALID_OPERATION when the default FBO is bound. OpenGL ES 3.0 allows 506 DrawBuffers to toggle between BACK and NONE on the default FBO. 507 508 An implementation that does not natively support disabling the drawbuffer 509 on the default FBO could emulate this by disabling color writes. 510 511 RESOLVED: Allow DrawBuffersEXT to be called for the default FBO. This 512 is more forward looking and is compatible with ES 3.0. 513 514 5) What are the requirements on the color attachment sizes and formats? 515 516 RESOLVED: ES 2.0 requires that all color buffers attached to application- 517 created framebuffer objects must have the same number of bitplanes 518 (Chapter 4 overview p91). ES 2.0 also requires that all attached images 519 have the same width and height (Section 4.4.5 Framebuffer Completeness). 520 This extension does not lift those requirements, and failing to meet 521 them will result in an incomplete FBO (FRAMEBUFFER_UNSUPPORTED and 522 FRAMEBUFFER_INCOMPLETE_DIMENSIONS, respectively). 523 524 6) Does this have any interactions with glClear? 525 526 RESOLVED: Yes. When multiple color buffers are enabled for writing, 527 glClear clears all of the color buffers. Added language clarifying 528 that glClear and glClearColor may affect multiple color buffers. 529 530 7) What is the behavior when n=0? In the ES 3.0 spec it says that 531 <n> must be one for the default FBO, but doesn't specify what happens 532 when it's not. For user FBOs it states that the draw buffer for 533 fragment colors beyond <n> is set to NONE. (Bug 10059) 534 535 RESOLVED: For the default FBO, setting <n> to zero will result in 536 an INVALID_OPERATION. For user created FBOs, setting <n> to zero 537 sets all the draw buffers to NONE. The ES 3.0 spec will be updated 538 accordingly. 539 540 8) What value should gl_MaxDrawBuffers in the shading language report? 541 542 RESOLVE: It should match MAX_DRAW_BUFFERS_EXT from the API. None 543 of the API or GLSL specifications explicitly state the linkage 544 between API and SL constants, but it seems logical that one would 545 expect them to match, regardless of whether or not an extension 546 directive is used in the shading language. 547 548Revision History 549 550 07/12/2013 dgkoch add issue 8 551 05/11/2013 dgkoch add issue 7 and relevant clarifications 552 minor clarification for issue 5. 553 01/30/2013 dgkoch add issue 6 and clear interactions 554 renamed to EXT_draw_buffers based on feedback 555 changed resolution of issue 3. 556 01/23/2013 dgkoch add resolutions to issues 2-4. 557 add issue 5. 558 Add Table 4.x and update various explicit 559 references to COLOR_ATTACHMENT0. 560 Add errors. 561 11/13/2012 dgkoch add revision history 562 add text from updated ES 3.0 spec 563 add issues for discussion 564 10/16/2012 kbr update name string 565 10/16/2012 kbr remove restrition requiring draw buffer 0 to be non-NULL 566 10/12/2012 kbr remove references to GetDoublev and ReadBuffer 567 10/11/2012 kbr initial draft extension 568 569