blob: f29b681ddf1771dc5154e0cca470057b61bfd838 [file] [log] [blame]
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.