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