blob: c4c9e3dd5bdd34d9bbef6db86aa37f2271b848fb [file] [log] [blame]
Name
EXT_blend_equation_separate
Name Strings
GL_EXT_blend_equation_separate
Contact
Mark Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
Notice
Copyright NVIDIA Corporation, 2003.
Version
Date: 12/23/2003 Version 1.0
Status
Shipping as of May 2004 for GeForce6.
Number
299
Dependencies
Written based on the wording of the OpenGL 1.5 specification.
OpenGL 1.4 (or ARB_imaging, or EXT_blend_minmax and/or
EXT_blend_subtract) is required for blend equation support.
EXT_blend_func_separate is presumed but not required.
EXT_blend_logic_op interacts with this extension.
Overview
EXT_blend_func_separate introduced separate RGB and alpha blend
factors. EXT_blend_minmax introduced a distinct blend equation for
combining source and destination blend terms. (EXT_blend_subtract &
EXT_blend_logic_op added other blend equation modes.) OpenGL 1.4
integrated both functionalities into the core standard.
While there are separate blend functions for the RGB and alpha blend
factors, OpenGL 1.4 provides a single blend equation that applies
to both RGB and alpha portions of blending.
This extension provides a separate blend equation for RGB and alpha
to match the generality available for blend factors.
IP Status
No known IP issues.
Issues
Why not use ATI_blend_equation_separate?
Apple supports this extension in OS X 10.2 but the extension
lacks a specification and, as explained in subsequent issues,
the token naming is inconsistent with OpenGL conventions.
What should the token names be?
RESOLVED: Follow the precedent of EXT_blend_equation_separate.
For example, GL_BLEND_DST becomes GL_BLEND_DST_RGB
and GL_BLEND_DST_ALPHA. So GL_BLEND_EQUATION becomes
GL_BLEND_EQUATION_RGB (same value as GL_BLEND_EQUATION) and
GL_BLEND_EQUATION_ALPHA.
This is different from the ATI_blend_equation_separate approach
which introduces the single name GL_ALPHA_BLEND_EQUATION_ATI
(no RGB name is introduced). The existing OpenGL convention
(example: ARB_texture_env_combine) is to use _RGB and _ALPHA as
a suffix for enumerants, not a prefix.
How should get token values be assigned?
RESOLVED: GL_BLEND_EQUATION_RGB_EXT has the same value as
GL_BLEND_EQUATION. See "Compatibility" section.
For compatibility with ATI_blend_equation_separate,
GL_BLEND_EQUATION_ALPHA_EXT shares the same value (0x883D)
with the ATI_blend_equation_separate's GL_ALPHA_BLEND_EQUATION_ATI
token. The GL_BLEND_EQUATION_ALPHA_EXT name uses the suffixing
convention (rather than prefixing) for adding _ALPHA addition
as done by ARB_texture_env_combine and EXT_blend_func_separate.
New Procedures and Functions
void BlendEquationSeparateEXT(enum modeRGB,
enum modeAlpha);
New Tokens
Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
GetFloatv, and GetDoublev:
BLEND_EQUATION_RGB_EXT 0x8009 (same as BLEND_EQUATION)
BLEND_EQUATION_ALPHA_EXT 0x883D
Additions to Chapter 2 of the 1.5 GL Specification (OpenGL Operation)
None
Additions to Chapter 3 of the 1.5 GL Specification (Rasterization)
None
Additions to Chapter 4 of the 1.5 GL Specification (Per-Fragment Operations
and the Framebuffer)
Replace the "Blend Equation" discussion in section 4.1.7 (Blending)
with the following:
"The equations used to control blending are determined by the blend
equations. Blend equations are specified with the commands:
void BlendEquation(enum mode);
void BlendEquationSeparateEXT(enum modeRGB, enum modeAlpha);
BlendEquationSeparateEXT arguments modeRGB determines the RGB blend
function while modeAlpha determines the alpha blend equation.
BlendEquation argument mode determines both the RGB and alpha blend
equations. modeRGB and modeAlpha must each be one of FUNC_ADD,
FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MIN, or MAX.
Destination (framebuffer) components are taken to be fixed-point
values represented according to the scheme in section 2.13.9
(Final Color Processing), as are source (fragment) components.
Constant color components are taken to be floating point values.
[ed: paragraph unchanged except that floating-point is hyphenated.]
Prior to blending, each fixed-point color component undergoes an
implied conversion to floating-point. This conversion must leave
the values 0 and 1 invariant. Blending components are treated as
if carried out in floating-point. [ed: paragraph unchanged except
that floating-point is hyphenated.]
Table 4.blendeq provides the corresponding per-component blend
equations for each mode, whether acting on RGB components for modeRGB
or the alpha component for modeAlpha.
In the table, the "s" subscript on a color component abbreviation
(R, G, B, or A) refers to the source color component for an incoming
fragment, the "d" subscript on a color component abbreviation refers
to the destination color component at the corresponding framebuffer
location, and the "c" subscript on a color component abbreviation
refers to the constant blend color component. A color component
abbreviation without a subscript refers to the new color component
resulting from blending. Additionally, Sr, Sg, Sb, and Sa are
the red, green, blue, and alpha components of the source weighting
factors determined by the source blend function, and Dr, Dg, Db, and
Da are the red, green, blue, and alpha components of the destination
weighting factors determined by the destination blend function.
Blend functions are described below.
Mode RGB components Alpha component
--------------------- ---------------------- ----------------------
FUNC_ADD Rc = Rs * Sr + Rd * Dr Ac = As * Sa + Ad * Da
Gc = Gs * Sg + Gd * Dg
Bc = Bs * Sb + Bd * Db
--------------------- ---------------------- ----------------------
FUNC_SUBTRACT Rc = Rs * Sr - Rd * Dr Ac = As * Sa - Ad * Da
Gc = Gs * Sg - Gd * Dg
Bc = Bs * Sb - Bd * Db
--------------------- ---------------------- ----------------------
FUNC_REVERSE_SUBTRACT Rc = Rd * Sr - Rs * Dr Ac = Ad * Sa - As * Da
Gc = Gd * Sg - Gs * Dg
Bc = Bd * Sb - Bs * Db
--------------------- ---------------------- ----------------------
MIN Rc = min(Rs, Rd) Ac = min(As, Ad)
Gc = min(Gs, Gd)
Bc = min(Bs, Bd)
--------------------- ---------------------- ----------------------
MAX Rc = max(Rs, Rd) Ac = max(As, Ad)
Gc = max(Gs, Gd)
Bc = max(Bs, Bd)
--------------------- ---------------------- ----------------------
Table 4.blendeq: RGB and alpha blend equations are their
per-component equations controlling the color components resulting
from blending for each mode."
In the "Blending State" paragraph, replace the initial lines with...
"The state required for blending is two integers for the RGB and alpha
blend equations, four integer indicating the source and destination
RGB and alpha blending functions, four floating-point values to store
the RGBA constant blend color, and a bit indicating whether blending
is enabled or disabled. The initial blending equations for RGB and
alpha are FUNC_ADD. ..."
Additions to Chapter 5 of the 1.5 GL Specification (Special Functions)
None
Additions to Chapter 6 of the 1.5 GL Specification (State and State Requests)
None
Additions to the GLX Specification
None
GLX Protocol
A new GL rendering command is added. The following command is sent
to the server as part of a glXRender request:
BlendEquationSeparateEXT
2 12 rendering command length
2 4228 rendering command opcode
4 ENUM modeRGB
4 ENUM modeAlpha
Dependencies on EXT_blend_logic_op
If EXT_blend_logic_op and EXT_blend_equation_separate are both
supported, the logic op blend equation should be supported separately
for RGB and alpha as with the other blend equation modes.
And add to the table 4.blendeq this line:
Mode RGB components Alpha component
--------------------- ---------------------- ----------------------
LOGIC_OP Rc = Rs OP Rd Ac = As OP Ad
Gc = Gs OP Gd
Bc = Bs OP Bd
--------------------- ---------------------- ----------------------
where OP denotes the logical operation controlled by LogicOp (see
table 4.2).
Note: there is no support for a distinct RGB logical operation
and alpha logical operation (that could be provided by another
extension).
Errors
INVALID_ENUM is generated if either the modeRGB or modeAlpha
parameter of BlendEquationSeparateEXT is not one of FUNC_ADD,
FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MAX, or MIN.
INVALID_OPERATION is generated if BlendEquationSeparateEXT
is executed between the execution of Begin and the corresponding
execution of End.
New State
Initial
Get Value Get Command Type Value Attribute
------------------------ ----------- ---- -------- ------------
BLEND_EQUATION_RGB_EXT GetIntegerv Z FUNC_ADD color-buffer
BLEND_EQUATION_ALPHA_EXT GetIntegerv Z FUNC_ADD color-buffer
[remove BLEND_EQUATION from the table, add a note "v1.5 BLEND_EQUATON"
beside BLEND_EQUATION_RGB_EXT to note the legacy name.]
New Implementation Dependent State
None
Compatibility
The BLEND_EQUATION_RGB_EXT query token has the same value as the
legacy BLEND_EQUATION query token. This means querying the legacy
BLEND_EQUATION state is identical to querying the RGB blend equation
state.
This is a different approach than taken by the EXT_blend_func_separate
extension, but matches the approach taken by other "split" OpenGL
state such as the SMOOTH_POINT_SIZE_RANGE and ALIASED_POINT_SIZE_RANGE
values split from POINT_SIZE_RANGE.
In the EXT_blend_func_separate case, four new token names
(BLEND_DST_RGB, BLEND_SRC_RGB, BLEND_DST_ALPHA, and BLEND_DST_RGB)
with four new token values (0x80C8, 0x80C9, 0x80CA, and 0x80CB
respectively) were added. Querying the legacy BLEND_DST (0x0BE0) and
BLEND_RGB (0x0BE1) returns the same value as querying BLEND_SRC_RGB
and BLEND_DST_RGB respectively but this was never explicitly
documented.
In the case of the point size ranges, SMOOTH_POINT_SIZE_RANGE was
given the same value as POINT_SIZE_RANGE (0x0B12) and a single new
token ALIASED_POINT_SIZE_RANGE (0x846D).
The point size ranges approach is preferable because it minimizes
the confusion about how the legacy name should be treated by
implementations because the legacy name shares its value with
the new name. This is less prone to confusion by developers and
implementers and less effort to implement.
For token value compatibility with ATI_blend_equation_separate,
GL_BLEND_EQUATION_ALPHA_EXT shares the same value (0x883D) with the
ATI_blend_equation_separate's GL_ALPHA_BLEND_EQUATION_ATI token.