| Name |
| |
| ARB_draw_buffers_blend |
| |
| Name Strings |
| |
| GL_ARB_draw_buffers_blend |
| |
| Contact |
| |
| Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com) |
| Mark Young, AMD (mark.young 'at' amd.com) |
| |
| Contributors |
| |
| Jeff Bolz, NVIDIA |
| Pierre Boudier, AMD |
| Nick Haemel, AMD |
| Timothy Lamb, AMD |
| Greg Roth, NVIDIA |
| Graham Sellers, AMD |
| Mike Strauss, NVIDIA |
| Mark Young, AMD |
| |
| Notice |
| |
| Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Status |
| |
| Complete. Approved by the ARB on July 3, 2009. |
| |
| Version |
| |
| Last Modified Date: 01/19/2011 |
| Revision: 4 |
| |
| Number |
| |
| ARB Extension #69 |
| |
| Dependencies |
| |
| The extension is written against the OpenGL 2.0 Specification. |
| |
| OpenGL 2.0 is required. |
| |
| EXT_draw_buffers2 is required. |
| |
| Overview |
| |
| This extension builds upon the ARB_draw_buffers and |
| EXT_draw_buffers2 extensions. In ARB_draw_buffers (part of OpenGL |
| 2.0), separate values could be written to each color buffer. This |
| was further enhanced by EXT_draw_buffers2 by adding in the ability |
| to enable blending and to set color write masks independently per |
| color output. |
| |
| This extension provides the ability to set individual blend |
| equations and blend functions for each color output. |
| |
| New Procedures and Functions |
| |
| void BlendEquationiARB(uint buf, enum mode); |
| |
| void BlendEquationSeparateiARB(uint buf, enum modeRGB, |
| enum modeAlpha); |
| |
| void BlendFunciARB(uint buf, enum src, enum dst); |
| |
| void BlendFuncSeparateiARB(uint buf, enum srcRGB, enum dstRGB, |
| enum srcAlpha, enum dstAlpha); |
| |
| New Tokens |
| |
| None. |
| |
| Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation) |
| |
| None. |
| |
| Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) |
| |
| None. |
| |
| Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment |
| Operations and the Frame Buffer) |
| |
| Modify Section 4.1.8, Blending p. 205 |
| |
| (modify section Blend Equation starting with the first paragraph) |
| |
| "Blending is controlled by the blend equation. This equation can be |
| simultaneously set to the same value for all draw buffers using the |
| commands: |
| |
| void BlendEquation(enum mode); |
| void BlendEquationSeparate(enum modeRGB, enum modeAlpha); |
| |
| or for an individual draw buffer using the indexed versions of the |
| same commands: |
| |
| void BlendEquationiARB(uint buf, enum mode); |
| void BlendEquationSeparateiARB(uint buf |
| enum modeRGB, |
| enum modeAlpha); |
| |
| BlendEquationSeparate and BlendEquationSeparateiARB argument |
| <modeRGB> determines the RGB blend equation while <modeAlpha> |
| determines the alpha blend equation. BlendEquation and |
| BlendEquationiARB argument <mode> determines both the RGB and alpha |
| blend equations. <mode>, <modeRGB>, and <modeAlpha> must be one of |
| FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MIN, MAX. |
| BlendEquation and BlendEquationSeparate modify the blend equations |
| for all draw buffers. BlendEquationiARB and |
| BlendEquationSeparateiARB modify the blend equations associated with |
| an individual draw buffer. The <buf> argument is an integer i that |
| indicates that the blend equations should be modified for |
| DRAW_BUFFERi. |
| |
| (modify section Blend Functions starting with the first paragraph) |
| |
| The weighting factors used by the blend equation are determined by |
| the blend functions. Blend functions are simultaneously specified |
| for all draw buffers using the commands: |
| |
| void BlendFunc(enum src, enum dst); |
| void BlendFuncSeparate(enum srcRGB, enum dstRGB, |
| enum srcAlpha, enum dstAlpha); |
| |
| or for an individual draw buffer using the indexed versions of the |
| same commands: |
| |
| void BlendFunciARB(uint buf, enum src, enum dst); |
| void BlendFuncSeparateiARB(uint buf, enum srcRGB, |
| enum dstRGB, enum srcAlpha, |
| enum dstAlpha); |
| |
| BlendFuncSeparate and BlendFuncSeparateiARB arguments <srcRGB> and |
| <dstRGB> determine the source and destination RGB blend functions, |
| respectively, while <srcAlpha> and <dstAlpha> determine the source |
| and destination alpha blend functions. BlendFunc and BlendFunciARB |
| argument <src> determines both RGB and alpha source functions, while |
| <dst> determines both RGB and alpha destination functions. |
| BlendFuncSeparate and BlendFunc modify the blend functions for all |
| draw buffers. BlendFuncSeparateiARB and BlendFunciARB modify the |
| blend functions associated with an individual draw buffer. The <buf> |
| argument is an integer i that indicates that the blend equations |
| should be modified for DRAW_BUFFER<i>." |
| |
| |
| (modify section Blending State) |
| |
| "The state required for blending, for each draw buffer, is two |
| integers for the RGB and alpha blend equations, four integers |
| indicating the source and destination RGB and alpha blending |
| functions, and a bit indicating whether blending is enabled or |
| disabled. Additionally, four floating-point values to store the RGBA |
| constant blend color are required. |
| |
| For all draw buffers, the initial blend equations for RGB and alpha |
| are both FUNC_ADD, and the initial blending functions are ONE for |
| the source RGB and alpha functions, and ZERO for the destination RGB |
| and alpha functions. Initially, blending is disabled for all draw |
| buffers. The initial constant blend color is (R,G,B,A) = (0,0,0,0). |
| |
| The value of the blend enable for draw buffer <i> can be queried by |
| calling IsEnabledi with <target> BLEND and <index> <i>, and the |
| values of the blend equations and functions can be queried by caling |
| GetIntegerIndexedvEXT with the corresponding <target> as shown in |
| table 6.20 and <index> $i$. |
| |
| The value of the blend enable, or the blend equations and functions |
| for draw buffer zero may also be queried by calling IsEnabled, or |
| GetInteger, respectively, with the same symbolic constants but no |
| <index> parameter." |
| |
| |
| Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions) |
| |
| None. |
| |
| Additions to Chapter 6 of the OpenGL 2.0 Specification (State and |
| State Requests) |
| |
| None. |
| |
| Additions to Appendix A of the OpenGL 2.0 Specification (Invariance) |
| |
| None. |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None. |
| |
| Errors |
| |
| The error INVALID_ENUM is generated by BlendEquationiARB, |
| BlendEquationSeparateiARB, BlendFuncSeparateiARB, and |
| BlendFunciARB if the <buf> parameter is outside the range |
| [0, MAX_DRAW_BUFFERS-1]. |
| |
| The error INVALID_ENUM is generated by GetIntegerIndexedvEXT |
| if <target> is BLEND_EQUATION, BLEND_EQUATION_RGB, |
| BLEND_EQUATION_ALPHA, BLEND_SRC, BLEND_SRC_RGB, BLEND_SRC_ALPHA, |
| BLEND_DST, BLEND_DST_RGB, BLEND_DST_ALPHA, and <index> is outside |
| the range [0, MAX_DRAW_BUFFERS-1]. |
| |
| The error INVALID_ENUM is generated by BlendFunciARB |
| if either <src>, or <dst> is not an accepted value. |
| |
| The error INVALID_ENUM is generated by BlendFuncSeparateiARB |
| if either <srcRGB>, <dstRGB>, <srcAlpha>, or <dstAlpha> is not |
| an accepted value. |
| |
| The error INVALID_ENUM is generated if the <mode> parameter of |
| BlendEquationiARB is not one of FUNC_ADD, FUNC_SUBTRACT, |
| FUNC_REVERSE_SUBTRACT, MAX, or MIN. |
| |
| The error INVALID_ENUM is generated if either the <modeRGB> or |
| <modeAlpha> parameter of BlendEquationSeparateiARB is not one of |
| FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MAX, or MIN. |
| |
| The error INVALID_OPERATION is generated if any of these new |
| entry-points are executed between the execution of glBegin and the |
| corresponding execution of glEnd. |
| |
| |
| New State |
| |
| Modify Table 6.20, p. 281 |
| |
| (modify the entries for the blend functions and equations and add |
| new entries for indexed access to the per draw buffer functions |
| and equations) |
| |
| |
| Initial |
| Get Target Type Get Command Value Description Section Attribute |
| ----------------------------------- --------- --------------------- -------- ---------------------------------------------------- ------- ------------- |
| BLEND_SRC_RGB (BLEND_SRC) 1* x Z_15 GetIntegerIndexedvEXT ONE Blending source RGB function for draw buffer i 4.2.2 color-buffer |
| where i is specified as <index> |
| BLEND_SRC_ALPHA 1* x Z_15 GetIntegerIndexedvEXT ONE Blending source A function for draw buffer i 4.2.2 color-buffer |
| where i is specified as <index> |
| BLEND_DST_RGB (BLEND_DST) 1* x Z_14 GetIntegerIndexedvEXT ZERO Blending destination RGB function for draw buffer i 4.2.2 color-buffer |
| where i is specified as <index> |
| BLEND_DST_ALPHA 1* x Z_14 GetIntegerIndexedvEXT ZERO Blending destination A function for draw buffer i 4.2.2 color-buffer |
| where i is specified as <index> |
| BLEND_EQUATION_RGB (BLEND_EQUATION) 1* x Z GetIntegerIndexedvEXT FUNC_ADD RGB blending equation for draw buffer i 4.2.2 color-buffer |
| where i is specified as <index> |
| BLEND_EQUATION_ALPHA 1* x Z GetIntegerIndexedvEXT FUNC_ADD Alpha blending equation for draw buffer i 4.2.2 color-buffer |
| where i is specified as <index> |
| |
| Issues |
| |
| 1. What should we call this? |
| |
| RESOLVED: ARB_draw_buffers_blend. |
| |
| Other suggestions were ARB_drawbuffers_blend and ARB_mrt_blend. |
| |
| 2. What effect does using the non-indexed versions of the blend |
| function or equation entry-points have upon the new indexed per |
| draw buffer versions? |
| |
| RESOLVED: Similar to the way EXT_draw_buffers2 handles the |
| indexed and non-indexed ColorMask interaction in issue 3. The |
| non-indexed versions of the functions will set all buffers to |
| the passed in parameters. |
| |
| For example, BlendFunc will set all color buffer blend functions |
| to the values passed in. |
| |
| 3. Should the new functions be ---Indexed (as in EXT_draw_buffers2) |
| or ---i (as in OpenGL 3.0 core)? |
| |
| RESOLVED: Because this is to be promoted to core, the i index is |
| used |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- --------- ----------------------------------------- |
| 4 1/19/11 Jon Leech Fix GetIntegeri_v -> GetIntegerIndexedi_v |
| (Bug 7229). |
| 3 2/11/10 Jon Leech Clarify in required state section that |
| the constant blend color is global, |
| not per-draw-buffer. Remove duplicate |
| state for draw buffer zero from state |
| tables and describe how non-indexed |
| queries access it from required state |
| section (Bug 5920). |
| 2 8/02/09 Jon Leech Reformat to 80 columns and assign |
| ARB extension number. |
| 1 5/14/09 jbolz copy & rename from EXT version rev 5. |
| |