Name

    ARB_stencil_texturing

Name Strings

    GL_ARB_stencil_texturing

Contact

    Piers Daniell, NVIDIA Corporation (pdaniell 'at' nvidia.com)

Contributors

    Bruce Merry
    Jeff Bolz, NVIDIA
    Pat Brown, NVIDIA

Notice

    Copyright (c) 2012-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 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.
    Approved by the ARB on 2012/06/12.

Version

    Last Modified Date:         March 19, 2013
    Revision:                   5

Number

    ARB Extension #138

Dependencies

    OpenGL 1.1, ARB_depth_texture and EXT_packed_depth_stencil are required.

    This extension is written against The OpenGL 4.2 (Compatibility Profile)
    specification.

Overview

    This extension allows texturing of the stencil component of a packed depth
    stencil texture. Stencil values are returned as unsigned integers. It is
    not possible to sample both depth and stencil values from the same
    texture, and this extension allows the app to select which is sampled for
    the bound texture.

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameter of TexParameter* and GetTexParameter*:

        DEPTH_STENCIL_TEXTURE_MODE                       0x90EA

Additions to the OpenGL 4.2 (Compatibility Profile) Specification

Changes to Section 2.14.12 (Shader Execution), page 144

Add a new new bullet point on page 149:

    "* The sampler used in a texture lookup function is one of the shadow
    sampler types, the texture object's internal format is DEPTH_STENCIL,
    and the DEPTH_STENCIL_TEXTURE_MODE is not DEPTH_COMPONENT."

Then change the following paragraph that reads:

    "The stencil index texture internal component is ignored if the base
    internal format is DEPTH_STENCIL."

To the following:

    "The stencil index texture internal component is ignored if the base
    internal format is DEPTH_STENCIL and the DEPTH_STENCIL_TEXTURE_MODE
    is not STENCIL_INDEX.

    Texture lookups involving texture objects with an internal format of
    DEPTH_STENCIL can read the stencil value as described in section
    3.10.18 by setting the DEPTH_STENCIL_TEXTURE_MODE to STENCIL_INDEX.
    The stencil value is read as an integer and assigned to R_t. An unsigned
    integer sampler should be used to lookup the stencil component, otherwise
    the results are undefined."

Changes to Section 3.10.8 (Texture Parameters), page 322

In Table 3.22 (Texture parameters and their values) add the following
entry:

    "
    Name                        Type  Legal Values
    -------------               ----  ------------------------------
    DEPTH_STENCIL_TEXTURE_MODE  enum  DEPTH_COMPONENT, STENCIL_INDEX
    "

Changes to Section 3.10.13 (Combined Depth/Stencil Textures), page 342

Modify the paragraph to read:

    "If the texture image has a base internal format of DEPTH_STENCIL, then
    the stencil index texture component is ignored by default. The texture
    value <T> does not include a stencil index component, but includes
    only the depth component. In order to access the stencil index texture
    component the DEPTH_STENCIL_TEXTURE_MODE texture parameter should be
    set to STENCIL_INDEX. When this mode is set the depth component is ignored
    and the texture value includes only the stencil index component. The
    stencil index value is treated as an unsigned integer texture and
    returns an unsigned integer value when sampled. When sampling the stencil
    index only NEAREST filtering is supported. The DEPTH_STENCIL_TEXTURE_MODE
    is ignored for non depth/stencil textures."

Changes to Section 3.10.14 (Texture Completeness), page 343

Add a new bullet point for the conditions that cause the texture
to not be complete:

    "* The internal format of the texture is DEPTH_STENCIL, the
    DEPTH_STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX and either the
    magnification filter or the minification filter is not NEAREST."

Changes to Section 3.10.18 (Texture Comparison Modes), page 356

Modify the following paragraph:

    "Let Dt be the depth texture value and St be the stencil index component
    of a depth/stencil texture. If there is no stencil component the value of
    St is undefined. Let Dref be the reference value..."

Insert a new paragraph after the paragraphs that ends:

    "Then the effective texture value is computed as follows:
        If the base internal format is DEPTH_STENCIL and the value of
    DEPTH_STENCIL_TEXTURE_MODE is STENCIL_INDEX, then
            r = St
        Otherwise if the value of TEXTURE_COMPARE_MODE is NONE, then
            r = Dt
        Otherwise if the value of TEXTURE_COMPARE_MODE is
    COMPARE_REF_TO_TEXTURE, then r depends on the texture comparison
    function as shown in table 3.31.
        The resulting r is assigned ..."

Additions to Chapter 8 of the OpenGL Shading Language 4.20.6 Specification

Insert a new paragraph at the end of Section 8.9:

    "For depth/stencil textures, the sampler type should match the component
    being accessed as set through the OpenGL API. When the depth/stencil texture
    mode is set to DEPTH_COMPONENT, a floating-point sampler type should be used.
    When the depth/stencil texture mode is set to STENCIL_INDEX, an unsigned integer
    sampler type should be used. Doing a texture lookup with an unsupported
    combination will return undefined values."

Additions to the AGL/GLX/WGL Specifications

    None

Errors

    None

New State

    (Table 6.24, Textures) add the following entry:

    Get Value                       Type  Get Command        Initial Value   Description                             Section
    -------------                   ----  -----------        -------------   -----------                             -------
    DEPTH_STENCIL_TEXTURE_MODE      n*Z2  GetTexParameteriv  DEPTH_COMPONENT Depth stencil texture mode              3.10.8

New Implementation Dependent State

    None

Issues

    1) Should we support combined depth/stencil in one lookup?

       RESOLVED: No because depth is float and stencil is integer and we
       have no way to return both with the existing samplers. Also some
       implementations may not have an easy way to retrive both depth and
       stencil in one lookup.

    2) How does this interact with texture filters (e.g., LINEAR)?

       RESOLVED: Sampling the stencil values will behave like integer textures.
       There is no filtering.

    3) I assume DEPTH_STENCIL_TEXTURE_MODE is ignored unless the texture
       itself has a DEPTH_STENCIL internal format?

       RESOLVED: Correct.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------------
    5     03/19/13  Jon Leech Fix STENCIL_COMPONENT -> STENCIL_INDEX typo
                              (Bug 10077).

    4     05/04/12  pdaniell  Add missing spec stating how the stencil value
                              is assigned to the color vector result of the
                              texture lookup function. Clarified the filtering
                              used for stencil index sampling.

    3     05/03/12  pdaniell  Add enum value. Use DEPTH_COMPONENT and
                              STENCIL_INDEX instead of DEPTH and STENCIL for
                              the valid DEPTH_STENCIL_TEXTURE_MODEs. These
                              better represent "Pixel Formats".

    2     03/15/12  pdaniell  Fixes based on feedback from Bruce Merry.

    1     10/25/11  pdaniell  Initial version.
