Name

    OES_blend_func_separate

Name Strings

    GL_OES_blend_func_separate

Contact

    Benj Lipchak, Apple (lipchak 'at' apple.com)

Notice

    Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Ratified by the Khronos BOP, July 31, 2009.

Version

    Date: 05/19/2009  Version 1.0

Number

    OpenGL ES Extension #2

Dependencies

    Written based on the wording of the OpenGL ES 1.1 specification.

Overview

    Blending capability is extended by defining a function that allows
    independent setting of the RGB and alpha blend factors for blend
    operations that require source and destination blend factors.  It
    is not always desired that the blending used for RGB is also applied
    to alpha.

New Procedures and Functions

    void BlendFuncSeparateOES(enum sfactorRGB,
                              enum dfactorRGB,
                              enum sfactorAlpha,
                              enum dfactorAlpha);

New Tokens

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, and
    GetFloatv:

        BLEND_DST_RGB_OES                  0x80C8
        BLEND_SRC_RGB_OES                  0x80C9
        BLEND_DST_ALPHA_OES                0x80CA
        BLEND_SRC_ALPHA_OES                0x80CB

Additions to Chapter 2 of the OpenGL ES 1.1 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the OpenGL ES 1.1 Specification (Rasterization)

    None

Additions to Chapter 4 of the OpenGL ES 1.1 Specification (Per-Fragment Operations
and the Framebuffer)

    Replace the "Blend Equation" discussion in section 4.1.7 (Blending) with 
    the following:
    
    "The weighting factors used by the blend equation are determined by the
    blend functions.  Blend functions are specified with the commands
    
        void BlendFuncSeparateOES(enum srcRGB, enum dstRGB, enum srcAlpha, enum dstAlpha);
        void BlendFunc(enum src, enum dst);
        
        BlendFuncSeparate 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 argument <src> determines both the RGB and alpha source
    functions, while <dst> determines both RGB and alpha destination functions.
    
        The possible source and destination blend functions and their
    corresponding computed blend factors are summarized in table 4.blendfunc.
    
     Function                  RGB Blend Factors             Alpha Blend Factor
                               (Sr, Sg, Sb) or (Dr, Dg, Db)  Sa or Da
     ------------------        ----------------------------  ------------------
     ZERO                      (0, 0, 0)                     0
     ONE                       (1, 1, 1)                     1
     SRC_COLOR                 (Rs, Gs, Bs)                  As
     ONE_MINUS_SRC_COLOR       (1, 1, 1) - (Rs, Gs, Bs)      1 - As
     DST_COLOR                 (Rd, Gd, Bd)                  Ad
     ONE_MINUS_DST_COLOR       (1, 1, 1) - (Rd, Gd, Bd)      1 - Ad
     SRC_ALPHA                 (As, As, As)                  As
     ONE_MINUS_SRC_ALPHA       (1, 1, 1) - (As, As, As)      1 - As
     DST_ALPHA                 (Ad, Ad, Ad)                  Ad
     ONE_MINUS_DST_ALPHA       (1, 1, 1) - (Ad, Ad, Ad)      1 - Ad
     SRC_ALPHA_SATURATE (*1)   (f, f, f) (*2)                1

     Table 4.blendfunc: RGB and ALPHA source and destination blending functions
     and the corresponding blend factors.  Addition and subtraction of triplets
     is performed component-wise.
     
     *1 SRC_ALPHA_SATURATE is valid only for source RGB and alpha blending 
     functions.
     
     *2 f = min(As, 1 - Ad)."

    In the "Blending State" paragraph, insert the following in place of
    existing blend function state:

    "The state required for blending is... four integers indicating the source 
    and destination blend functions for RGB and alpha....  The initial state
    for both source functions is ONE.  The initial state for both
    destination functions is ZERO."
    
Additions to Chapter 5 of the OpenGL ES 1.1 Specification (Special Functions)

    None

Additions to Chapter 6 of the OpenGL ES 1.1 Specification (State and State Requests)

    None

Errors

    GL_INVALID_ENUM is generated if either sfactorRGB, dfactorRGB,
    sfactorAlpha, or dfactorAlpha is not an accepted value.

New State

    The get values BLEND_SRC and BLEND_DST return the RGB source and
    destination factor, respectively.

                                              Initial
    Get Value             Get Command   Type  Value
    ---------             -----------   ----  -------
    BLEND_SRC_RGB_OES     GetIntegerv   Z11   ONE
    BLEND_DST_RGB_OES     GetIntegerv   Z10   ZERO
    BLEND_SRC_ALPHA_OES   GetIntegerv   Z11   ONE
    BLEND_DST_ALPHA_OES   GetIntegerv   Z10   ZERO

New Implementation Dependent State

    None
    
Revision History

    2009/05/19    Benj Lipchak    First draft of true extension specification

