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 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.