Name

    ARB_sample_shading

Name Strings

    GL_ARB_sample_shading

Contact

    Eric Werness, NVIDIA Corporation (ewerness 'at' nvidia.com)
    Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com)

Contributors

    Murat Balci, AMD
    Pierre Boudier, AMD
    Pat Brown, NVIDIA
    Greg Roth, NVIDIA
    Graham Sellers, AMD
    Eric Werness, NVIDIA

Notice

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

Status

    Complete. Approved by the ARB on July 3, 2009.

Version

    Last Modified Date:         02/02/2010
    Revision:                   8

Number

    ARB Extension #70

Dependencies

    OpenGL 2.0 is required.

    OpenGL Shading Language 1.30 is required

    This extension is written against the OpenGL 2.0 specification and
    version 1.30 of the OpenGL Shading Language Specification.

Overview

    In standard multisample rendering, an implementation is allowed to
    assign the same color and texture coordinate values to each sample,
    which then allows the optimization where the shader is only
    evaluated once and then distributed to the samples that have been
    determined to be covered by the primitive currently being
    rasterized. This can cause aliasing where the input color and
    texture coordinates 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 operations that were traditionally
    executed per-fragment operate independently on each sample.

    This also extends the shading language to allow control over the
    sample being processed. This includes built-in fragment input
    variables identifying the sample number and position being processed
    when executing fragment shaders per sample.

New Procedures and Functions

    void MinSampleShadingARB(clampf value);

New Tokens

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

        SAMPLE_SHADING_ARB                              0x8C36

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

        MIN_SAMPLE_SHADING_VALUE_ARB                    0x8C37

Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)

    None.

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

    Modify Section 3.2.1 Multisampling p. 93

    (add a new paragraph at the end of the section, p. 95)

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

    If MULTISAMPLE or SAMPLE_SHADING_ARB is disabled, sample shading has no
    effect.  Otherwise, an implementation must provide a minimum of

        max(ceil(MIN_SAMPLE_SHADING_VALUE_ARB*SAMPLES),1) 

    unique color values and sets of texture coordinates for each
    fragment. These are associated with the samples in an
    implementation-dependent manner. The value of
    MIN_SAMPLE_SHADING_VALUE_ARB is specified by calling

        void MinSampleShadingARB(clampf 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_ARB.

    When the sample shading fraction is 1.0, a separate set of colors and
    other associated data are evaluated for each sample, each set of values
    are evaluated at the sample location.


    Modify section 3.11, Fragment Shaders, p. 193

    Add the following paragraph to the section Shader Inputs, p. 196

    The built-in read-only variable gl_SampleID is filled with the
    sample number of the sample currently being processed. This variable
    is in the range 0 to gl_NumSamples-1, where gl_NumSamples is the total
    number of samples in the framebuffer, or one if rendering to a
    non-multisample framebuffer. Using this variable in a fragment shader
    causes the entire shader to be evaluated per-sample.  When rendering to a
    non-multisample buffer, or if multisample rasterization is disabled, 
    gl_SampleID will always be zero. gl_NumSamples is the sample count
    of the framebuffer regardless of whether multisample rasterization
    is enabled or not.

    The built-in read-only variable gl_SamplePosition contains the
    position of the current sample within the multi-sample draw buffer.
    The x and y components of gl_SamplePosition contain the sub-pixel
    coordinate of the current sample and will have values in the range
    zero to one.  The sub-pixel coordinate of the center of the pixel is
    always (0.5, 0.5).  Using this variable in a fragment shader
    causes the entire shader to be evaluated per-sample.  When rendering to a
    non-multisample buffer, or if multisample rasterization is disabled, 
    gl_SamplePosition will always be (0.5, 0.5).

    Add the following paragraph to the section Shader Outputs, p. 196

    The built-in integer array gl_SampleMask[] can be used to change the
    sample coverage for a fragment from within the shader.  The number
    of elements in the array is ceil(<s>/32), where <s> is the
    maximum number of color samples supported by the implementation.  
    If bit <n> of element <w> in the array is set to zero, sample
    <w>*32+<n> should be considered uncovered for the purposes of
    multisample fragment operations (Section 4.1.3).  Modifying the
    sample mask in this way may exclude covered samples from being 
    processed further at a per-fragment granularity.  However, setting
    sample mask bits to one will never enable samples not covered by the
    original primitive.  If the fragment shader is being evaluated at
    any frequency other than per-framgent, bits of the sample mask not
    corresponding to the current fragment shader invocation are ignored.

    Add the following prototypes to the list of built-in variables
    accessible from a fragment shader:

        in int gl_SampleID;
        in vec2 gl_SamplePosition;
        out int gl_SampleMask[];

    Add the following prototype to the list of built-in uniforms
    accessible from a fragment shader:

        uniform int gl_NumSamples;


Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)

    Modify Section 4.1.3, Multisample Fragment Operations, p. 200

    (modify first paragraph of section) This step modifies fragment alpha and
    coverage values based on the values of SAMPLE_ALPHA_TO_COVERAGE,
    SAMPLE_ALPHA_TO_ONE, SAMPLE_COVERAGE, SAMPLE_COVERAGE_VALUE,
    SAMPLE_COVERAGE_INVERT, and an output sample mask optionally written by
    the fragment shader.  No changes to the fragment alpha or coverage values
    are made at this step if MULTISAMPLE is disabled, or if the value of
    SAMPLE_BUFFERS is not one.

    (insert new paragraph after second paragraph, p. 201)

    Next, if a fragment shader is active and statically assigns to the
    built-in output variable gl_SampleMask, the fragment coverage is ANDed
    with the bits of the sample mask.  If such a fragment shader did not
    assign a value to gl_SampleMask due to flow control, the value ANDed with
    the fragment coverage is undefined.  If no fragment shader is active, or
    if the active fragment shader does not statically assign values to
    gl_SampleMask, the fragment coverage is not modified.
    

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

    None.

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

    None.

Additions to the AGL/GLX/WGL Specifications

    None

GLX Protocol

    TBD

Errors

    None.

New State

    Get Value                       Get Command    Type    Initial Value    Attribute
    ---------                       -----------    ----    -------------    ---------
    SAMPLE_SHADING_ARB              IsEnabled      B       FALSE            multisample/enable
    MIN_SAMPLE_SHADING_VALUE_ARB    GetFloatv      R+      0                multisample

New Implementation Dependent State

    None.

Modifications to The OpenGL Shading Language Specification, Version 1.10.59

    Including the following line in a shader can be used to control the
    language features described in this extension:

      #extension GL_ARB_sample_shading

    A new preprocessor #define is added to the OpenGL Shading Language:

      #define GL_ARB_sample_shading 1

    Add to section 7.2 "Fragment Shader Special Variables"

      
      The built-in output array gl_SampleMask[] sets the sample mask for
      the fragment being processed. Coverage for the current fragment is
      ANDed with the value of gl_SampleMask. Bit B of mask
      gl_SampleMask[M] corresponds to sample 32*M+B. This array must be
      sized in the fragment shader either implicitly or explicitly to be
      the same size as the implementation dependent maximum sample mask
      words determined by the maximum number of samples.  If the fragment
      shader statically assigns a value to gl_SampleMask[], the sample 
      mask will be undefined for any array elements of any fragment shader
      invocations that fails to assign a value.  If a shader does not
      statically assign a value to gl_SampleMask, the sample mask has no
      effect on the processing of a fragment.

      The built-in read-only variable gl_SampleID is filled with the
      sample number of the sample currently being processed. This
      variable is in the range 0 to gl_NumSamples-1, where gl_NumSamples is
      the total number of samples in the framebuffer, or one if rendering to
      a non-multisample framebuffer. Using this variable in a fragment shader
      causes the entire shader to be evaluated per-sample.

      The built-in read-only variable gl_SamplePosition contains the
      position of the current sample within the multi-sample draw
      buffer. The x and y components of gl_SamplePosition contain the
      sub-pixel coordinate of the current sample and will have values in
      the range zero to one.  Using this variable in a fragment shader
      causes the entire shader to be evaluated per-sample.

      ...

      The built-in variables that are accessible from a fragment shader are
      intrinsically given types as follows:

        int gl_SampleID;
        vec2 gl_SamplePosition;
        int gl_SampleMask[];
      

Issues


    1) Do we need both an enable and state?

       RESOLVED. Yes - that's just the way GL rolls

    2) How many times is the fragment shader run?

       RESOLVED. The shader must be run at least once for each unique
       set of texture coordinates and colors, so
       max(MIN_SAMPLE_SHADING_VALUE_ARB*SAMPLES,1) times.

    3) What cases can benefit from enabling this?

       RESOLVED. Something like alpha-tested rendering using textures
       don't benefit from multisampling right now - using this extension
       to run the fragment shader or fixed-function texturing multiple
       times per pixel can significantly improve quality.

    4) What do KIL and discard do?

       RESOLVED. They terminate a single invocation of the shader, so a
       single fragment may have some threads that discard and some that
       don't.

    5) Should there be an option to specify that all fragment shader inputs
    be interpolated at per-sample frequency?  If so, how?

      RESOLVED:  Yes. Via the enable

    6) Should the ability to specify per-sample or per-fragment
    interpolation on a per-varying basis be added via the language?

      RESOLVED: Not in this extension.

    7) Does gl_SampleMask belong here?

      RESOLVED: Yes, it's sample related and conteporary with the
      hardware required for the rest of this extension. Thematically it
      might match better with ARB_texture_multisample, but that
      extension targets hardware that cannot support gl_sampleMask.

    8) How should gl_SampleMask mask samples above the first 32?

      RESOLVED: By being an array with enough entries to encompass all
      the implementation-dependent maximum number of samples.

    9) Is per-sample shading ever triggered by properties of the fragment
    shader?

      RESOLVED:  Yes.  The variables "gl_SampleID" and "gl_SamplePosition"
      can be used to read properties of the current sample, which wouldn't
      make much sense if the fragment shader were run at a lower frequency
      than per-sample.

    10) Does gl_SamplePosition need to support layout() qualifiers such as
    "pixel_center_integer" in GLSL 1.50?

      RESOLVED:  Not in this extension.  "pixel_center_integer" was added in
      part for compatibility with shaders originally targeting Direct3D
      version 9.0 or earlier, where pixel centers were specified to be (X.0,
      Y.0) instead of OpenGL's (X.5, Y.5).  However, Direct3D 9.0 doesn't
      support anything like "gl_SamplePosition", and Direct3D versions that do
      support this functionality have adopted OpenGL's (X.5, Y.5) conventions.


Revision History

    Rev.    Date      Author    Changes
    ----  --------    --------  -----------------------------------------
    8     02/02/2010  pbrown    Clarify that use of gl_SamplePosition
                                triggers per-sample shading (bug 5911).
                                
    7     01/20/2010  Jon Leech Add rounding rule for computing number of
                                samples used depending on min sample  
                                shading setting.

    6     10/22/2009  pdaniell  Specify that gl_NumSamples should return
                                the sample count for the framebuffer
                                regardless of whether MULTISAMPLE is enabled
                                or not. This matches the API-level queries.

    5     09/17/2009  pbrown    Clean up some language on MinSampleShading.
                                Add a clarification requiring variables to
                                be sampled at sample locations when doing
                                full per-sample shading.  Add some more 
                                details on the gl_SampleMask array and its
                                operation in the multisample fragment ops.
                                Rename gl_MaxSampleId to gl_NumSamples and
                                adjust language.

    4     08/02/2009  Jon Leech Reformat to 80 columns and assign
                                ARB extension number

    3     06/25/2009  groth     Restore missing explanations of
                                MIN_SAMPLE_SHADING_VALUE_ARB

    2     05/15/2009  groth     Restore gl_sampleMask as an array

    1     05/13/2009  groth     Merge from NV_sample_shading_control,
                                NV_gpu_shader4_1, and AMD_sample_rate_shader
