Name

    OES_standard_derivatives

Name Strings

    GL_OES_standard_derivatives

Contributors

    John Kessenich
    OpenGL Architecture Review Board

Contact

    Benj Lipchak (benj.lipchak 'at' amd.com)

Notice

    Copyright (c) 2005-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, March 20, 2008.

Version

    Date: July 18, 2007 Revision: 0.99

Number

    OpenGL ES Extension #45

Dependencies

    OpenGL ES 2.0 is required.

Overview

    The standard derivative built-in functions and semantics from OpenGL 2.0 are
    optional for OpenGL ES 2.0.  When this extension is available, these
    built-in functions are also available, as is a hint controlling the
    quality/performance trade off.

Issues

    None.

New Procedures and Functions

    None

New Tokens

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

        FRAGMENT_SHADER_DERIVATIVE_HINT_OES            0x8B8B

New Keywords

    None.

New Built-in Functions

    dFdx()
    dFdy()  
    fwidth()

New Macro Definitions

    #define GL_OES_standard_derivatives 1

Additions to Chapter 5 of the OpenGL ES 2.0 specification:

    In section 5.2 (Hints), add the following to the list of supported hints:

    FRAGMENT_SHADER_DERIVATIVE_HINT_OES

    Derivative accuracy for fragment processing built-in functions dFdx, dFdy
    and fwidth.

Additions to Chapter 8 of the OpenGL ES Shading Language specification:

    Replace section 8.8 (Fragment Processing Functions) with the following 
    paragraphs:

    Fragment processing functions are only available in fragment shaders.

    The built-in derivative functions dFdx, dFdy, and fwidth are optional, and
    must be enabled by

    #extension GL_OES_standard_derivatives : enable

    before being used.  

    Derivatives may be computationally expensive and/or numerically unstable.  
    Therefore, an OpenGL ES implementation may approximate the true derivatives
    by using a fast but not entirely accurate derivative computation.

    The expected behavior of a derivative is specified using forward/backward 
    differencing.

    Forward differencing:

    F(x+dx) - F(x)   is approximately equal to    dFdx(x).dx                  1a

    dFdx(x)          is approximately equal to    F(x+dx) - F(x)              1b
                                                  --------------
                                                       dx

    Backward differencing:

    F(x-dx) - F(x)   is approximately equal to    -dFdx(x).dx                 2a

    dFdx(x)          is approximately equal to    F(x) - F(x-dx)              2b
                                                  --------------
                                                       dx


    With single-sample rasterization, dx <= 1.0 in equations 1b and 2b.  For
    multi-sample rasterization, dx < 2.0 in equations 1b and 2b.

    dFdy is approximated similarly, with y replacing x.

    An OpenGL ES implementation may use the above or other methods to perform
    the calculation, subject to the following conditions:

    1. The method may use piecewise linear approximations.  Such linear
       approximations imply that higher order derivatives, dFdx(dFdx(x)) and
       above, are undefined.

    2. The method may assume that the function evaluated is continuous.
       Therefore derivatives within the body of a non-uniform conditional are
       undefined.

    3. The method may differ per fragment, subject to the constraint that the
       method may vary by window coordinates, not screen coordinates.  The
       invariance requirement described in section 3.1 of the OpenGL ES 2.0 
       specification is relaxed for derivative calculations, because the method 
       may be a function of fragment location.

    Other properties that are desirable, but not required, are:

    4. Functions should be evaluated within the interior of a primitive
       (interpolated, not extrapolated).

    5. Functions for dFdx should be evaluated while holding y constant.
       Functions for dFdy should be evaluated while holding x constant.  
       However, mixed higher order derivatives, like dFdx(dFdy(y)) and 
       dFdy(dFdx(x)) are undefined.

    6. Derivatives of constant arguments should be 0.

    In some implementations, varying degrees of derivative accuracy may be
    obtained by providing GL hints (section 5.6 of the OpenGL ES 2.0
    specification), allowing a user to make an image quality versus speed trade
    off.


    GLSL ES functions
    =================

    genType dFdx (genType p)

    Returns the derivative in x using local differencing for the input argument
    p. 

    genType dFdy (genType p)

    Returns the derivative in y using local differencing for the input argument
    p.

    These two functions are commonly used to estimate the filter width used to
    anti-alias procedural textures.  We are assuming that the expression is
    being evaluated in parallel on a SIMD array so that at any given point in
    time the value of the function is known at the grid points represented by
    the SIMD array.  Local differencing between SIMD array elements can
    therefore be used to derive dFdx, dFdy, etc.

    genType fwidth (genType p)

    Returns the sum of the absolute derivative in x and y using local
    differencing for the input argument p, i.e.:

    abs (dFdx (p)) + abs (dFdy (p));

New State

    Add to Table 6.27: Hints

Get Value                    Type  Get Command  Initial Value  Description 
---------                    ----  -----------  -------------  -----------
FRAGMENT_SHADER_DERIVATIVE_  Z3    GetIntegerv  DONT_CARE      Fragment shader
HINT_OES                                                       derivative
                                                               accuracy hint

Revision History

    7/07/2005  Created.
    7/06/2006  Removed from main specification document.
    7/18/2007  Updated to match desktop GLSL spec and added hint.
