Name

    OES_sample_shading

Name Strings

    GL_OES_sample_shading

Contact

    Daniel Koch, NVIDIA Corporation (dkoch 'at' nvidia.com)

Contributors

    Pat Brown, NVIDIA
    Eric Werness, NVIDIA
    Graeme Leese, Broadcom
    Contributors to ARB_sample_shading
    Members of the OpenGL ES working group

Notice

    Copyright (c) 2011-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

    Complete. 
    Ratified by the Khronos Board of Promoters on 2014/03/14.

Version

    Last Modified Date:         January 30, 2014
    Revision:                   8

Number

    OpenGL ES Extension #169

Dependencies

    OpenGL ES 3.0 and GLSL ES 3.00 required.

    This extension is written against the OpenGL ES 3.0.2 (April 8, 2013)
    and the OpenGL ES Shading Language Specification Revision 4
    (March 6, 2013) specifications.

    This extension requires OES_sample_variables.

Overview

    In standard multisample rendering, an implementation is allowed to
    assign the same sets of fragment shader input values to each sample.
    This can cause aliasing where the fragment shader input values are
    used to generate a result that doesn't antialias itself, for example
    with alpha-tested transparency.

    This extension adds the ability to explicitly request that an
    implementation use a minimum number of unique set of fragment
    computation inputs when multisampling a pixel. Specifying such a
    requirement can reduce aliasing that results from evaluating the
    fragment computations too few times per pixel.

    This extension adds new global state that controls the minimum
    number of samples for which attribute data is independently
    interpolated. When enabled, all fragment-shading operations
    are executed independently on each sample.


New Procedures and Functions

    void MinSampleShadingOES(float value);

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled,
    and by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
    and GetInteger64v:

        SAMPLE_SHADING_OES                              0x8C36

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

        MIN_SAMPLE_SHADING_VALUE_OES                    0x8C37

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

    None.

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

    Modify Section 3.3 Multisampling p. 95

    (add a new subsection at the end of the section, p. 96)

    3.3.1 Sample Shading

    Sample shading can be used to specify a minimum number of unique samples
    to process for each fragment.  Sample shading is controlled by calling
    Enable or Disable with the symbolic constant SAMPLE_SHADING_OES.

    If the value of SAMPLE_BUFFERS is zero or SAMPLE_SHADING_OES is
    disabled, sample shading has no effect.  Otherwise, an implementation must
    provide a minimum of

        max(ceil(<mss> * <samples>),1)

    unique sets of fragment shader inputs for each
    fragment, where <mss> is the value of MIN_SAMPLE_SHADING_VALUE_OES and
    <samples> is the number of samples (the values of SAMPLES). These are
    associated with the samples in an implementation-dependent manner. The
    value of MIN_SAMPLE_SHADING_VALUE_OES is specified by calling

        void MinSampleShadingOES(float value);

    with <value> set to the desired minimum sample shading fraction.  <value>
    is clamped to [0,1] when specified.  The sample shading fraction may be
    queried by calling GetFloatv with pname set to
    MIN_SAMPLE_SHADING_VALUE_OES.

    When the sample shading fraction is 1.0, a separate set of fragment shader
    input values are evaluated for each sample, and each set of values
    is evaluated at the sample location.


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

    None.

Additions to Chapter 5 of the OpenGL ES 3.0.2 Specification (Special Functions)

    None.

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

    None.

Modifications to The OpenGL ES Shading Language Specification, Version 3.00.04

    None.

Additions to the AGL/GLX/WGL/EGL Specifications

    None

Errors

    None.

New State

    Add to Table 6.7 (Multisampling)
                                          Get      Initial
    Get Value                     Type  Command     Value    Description         Sec.
    ---------                     ----  ---------  --------  -----------         ----
    SAMPLE_SHADING_OES            B     IsEnabled  FALSE    sample coverage     3.3.1
                                                            enable
    MIN_SAMPLE_SHADING_VALUE_OES  R+    GetFloatv  0        fraction of multi-  3.3.1
                                                            samples to use for
                                                            sample shading

New Implementation Dependent State

    None.

Issues

    (0) This extension is based on ARB_sample_shading.  What are the major
        differences?

        1- rebased against ES 3.0
        2- various editing for consistency to GL 4.4/GLSL 440 specs
        3- parameter to MinSampleShading changed to float to match GL 4.x
        4- removed mention of SAMPLE_ALPHA_TO_ONE
        5- replaced mention of "color and texture coordinates" with more
           generic language about fragment shader inputs.
        6- removed mention of multisample enable.
        7- moved shading language sample variables to OES_sample_variables

        For historical issues, please see ARB_sample_shading.

    (1) OpenGL has a MULTISAMPLE enable that was not included in OpenGL ES.
        Should we add it into this extension or base it purely on if the target
        surface is multisample?

        DISCUSSION:
        GL (4.4) says:
        "Multisample rasterization is enabled or disabled by calling Enable or
        Disable with the symbolic constant MULTISAMPLE."

        GL ES (3.0.2) says:
        "Multisample rasterization cannot be enabled or disabled after a GL
        context is created."

        RESOLVED. Multisample rasterization should be based on the target
        surface properties.  Will not pick up the explicit multisample
        enable, but the language for ES3.0.2 doesn't sound right either.
        Bug 10690 tracks this and it should be fixed in later versions
        of the ES3.0 specification.


Revision History

    Rev.    Date      Author    Changes
    ----  ----------  --------  -----------------------------------------
    8     2014-01-20  dkoch     rename to OES, clean editing notess
    7     2014-01-20  dkoch     Fix a typo, and dangling ARB suffix
    6     2013-10-03  dkoch     Minor edits
    5     2013-09-09  dkoch     Require OES_sample_variables.
                                Move gl_SampleMaskIn interaction base extension.
    4     2013-09-03  gleese    Moved sample variables to OES_sample_variables
    3     2013-08-26  dkoch     resolved issues 1&2 and supporting edits.
                                replaced discussion of fixed-function inputs
                                with generic language.
    2     2013-08-13  dkoch     add missing suffices, follow extension template
    1     2013-08-12  dkoch     Port ARB_sample_shading to ES 3.0

