Name

    OES_blend_subtract

Name Strings

    GL_OES_blend_subtract

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 #3

Dependencies

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

    Blending capability is extended by respecifying the entire blend
    equation.  While this document defines only two new equations, the
    BlendEquationOES procedure that it defines will be used by subsequent
    extensions to define additional blending equations.

    In addition to the default blending equation, two new blending equations
    are specified.  These equations are similar to the default blending 
    equation, but produce the difference of its left and right hand sides, 
    rather than the sum.  Image differences are useful in many image 
    processing applications.
    
New Procedures and Functions

    void BlendEquationOES(enum mode);

New Tokens

    Accepted by the <mode> parameter of BlendEquationOES:

        FUNC_ADD_OES                     0x8006
        FUNC_SUBTRACT_OES                0x800A
        FUNC_REVERSE_SUBTRACT_OES        0x800B

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

        BLEND_EQUATION_OES               0x8009

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 1st paragraph of the "Blend Equation" discussion in section 
    4.1.7 (Blending) with the following:
    
    "Blending is controlled by the blend equations, defined by the command
    
        void BlendEquationOES(enum mode);
        
    <mode> determines the blend equation.  <mode> must be one of FUNC_ADD_OES,
    FUNC_SUBTRACT_OES, or FUNC_REVERSE_SUBTRACT_OES."
    
    Replace the last paragraph of the "Blend Equation" discussion in section 
    4.1.7 (Blending) with the following:
    
    "Table 4.blendeq provides the corresponding per-component blend equations 
    for each mode.  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 and the d subscript on a color component abbreviation 
    refers to the destination color component at the corresponding framebuffer 
    location.  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                       Equation
    -------------------------  ---------------------
    FUNC_ADD_OES               R = Rs * Sr + Rd * Dr
                               G = Gs * Sg + Gd * Dg
                               B = Bs * Sb + Bd * Db
                               A = As * Sa + Ad * Da
    -------------------------  ---------------------
    FUNC_SUBTRACT_OES          R = Rs * Sr - Rd * Dr
                               G = Gs * Sg - Gd * Dg
                               B = Bs * Sb - Bd * Db
                               A = As * Sa - Ad * Da
    -------------------------  ---------------------
    FUNC_REVERSE_SUBTRACT_OES  R = Rd * Dr - Rs * Sr
                               G = Gd * Dg - Gs * Sg
                               B = Bd * Db - Bs * Sb
                               A = Ad * Da - As * Sa
    -------------------------  ---------------------

    Table 4.blendeq:  Blend equations."
    
    In the "Blending State" paragraph, insert the following:

    "The state required for blending is... one integer indicating the
    blend equation...  The initial blending equation is FUNC_ADD_OES."
    
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

    INVALID_ENUM is generated by BlendEquationOES if its single parameter
    is not FUNC_ADD_OES, FUNC_SUBTRACT_OES, or FUNC_REVERSE_SUBTRACT_OES.

New State

    Get Value           Get Command     Type    Initial Value
    ---------           -----------     ----    -------------
    BLEND_EQUATION_OES  GetIntegerv     Z3      FUNC_ADD_OES

New Implementation Dependent State

    None

Revision History

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