Name

    ARB_depth_texture

Name Strings

    GL_ARB_depth_texture

Contact

    Brian Paul (brian_e_paul 'at' yahoo.com)

Notice

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

Status

    Complete.
    Approved by the ARB on February 14, 2002.
    Updated version (June 1, 2004) approved by the ARB on June 8, 2004.

Version

    Last Modified Date: November 29, 2004

Number

    ARB Extension #22

Dependencies

    OpenGL 1.1 is required.
    This extension is written against the OpenGL 1.3 Specification.

Overview

    This is a clarification of the GL_SGIX_depth_texture extension.  The
    original overview follows:

    This extension defines a new depth texture format.  An important
    application of depth texture images is shadow casting, but separating
    this from the shadow extension allows for the potential use of depth
    textures in other applications such as image-based rendering or
    displacement mapping.  This extension does not define new depth-texture
    environment functions, such as filtering or applying the depth values
    computed from a texture but leaves this to other extensions, such as
    the shadow extension.

IP Status

    None.

Issues

    (1) How is this extension different from GL_SGIX_depth_texture?

      This extension defines support for texture border values, querying
      depth texel resolution, and behavior when a depth texture is bound
      to a texture unit that's expecting RGBA texels.

    (2) What about texture borders and the border value?

      Texture borders are supported.  The texture border value used for
      depth textures is the first component of TEXTURE_BORDER_COLOR.

    (3) What happens when a depth texture is currently bound but RGBA
      texels are expected by the texture unit?

      The depth texture is treated as if it were a LUMINANCE texture.
      It's sometimes useful to render a depth component texture as a
      grayscale texture.

    (4) What happens when an RGBA texture is currently bound but depth
      texels are expected by the texture unit?

      We do texturing in the normal way for an RGBA texture.

    (5) What about 1D, 3D and cube maps textures?  Should depth textures
      be supported?

      RESOLVED:  For 1D textures, yes, for orthogonality.  For 3D and cube map
      textures, no.  In both cases, the R coordinate that would be ordinarily
      be used for a shadow comparison is needed for texture lookup and won't
      contain a useful value.  In theory, the shadow functionality could be
      extended to provide useful behavior for such targets, but this
      enhancement is left to a future extension.

    (6) Why "depth" textures instead of a generic, extended-precision,
      single-channel texture format?

      RESOLVED: We need a depth format so that glCopyTex[Sub]Image()
      can copy data from the depth buffer to the texture memory.

    (7) Is there any particular reason that depth textures should only be
        used as LUMINANCE textures?

      RESOLVED: Add DEPTH_TEXTURE_MODE to allow depth textures to be used
      as LUMINANCE, INTENSITY or ALPHA textures.

    (8) It is very unlikely that depth textures when used as LUMINANCE,
      INTENSITY or ALPHA textures are used at their full storage precision.
      Should there be a query for the actual number of bits used for
      depth textures?

      RESOLVED: No. OpenGL does not have queries for internal precision.
      Instead of adding it randomly for one feature, it should be looked
      in the broader context of providing it for more features.

     (9) How should GetTexImage work for depth textures?

      RESOLVED: Since GetTexImage is modeled on ReadPixels, reading depth
      components should require the DEPTH_COMPONENT format.  Specifying a
      color format when querying a texture image with a DEPTH_COMPONENT
      base internal format should be an invalid operation.  Likewise,
      specifying a DEPTH_COMPONENT format when querying a texture image
      with a color internal format should be an invalid operation.
      This is not only consistent with ReadPixels but how the
      EXT_paletted_texture and NV_texture_shader extensions amend
      GetTexImage to return non-color texture image data.

New Procedures and Functions

    None

New Tokens

    Accepted by the <internalFormat> parameter of TexImage1D, TexImage2D,
    CopyTexImage1D and CopyTexImage2D:

    DEPTH_COMPONENT
    DEPTH_COMPONENT16_ARB       0x81A5  (same as DEPTH_COMPONENT16_SGIX)
    DEPTH_COMPONENT24_ARB       0x81A6  (same as DEPTH_COMPONENT24_SGIX)
    DEPTH_COMPONENT32_ARB       0x81A7  (same as DEPTH_COMPONENT32_SGIX)

    Accepted by the <format> parameter of GetTexImage, TexImage1D,
    TexImage2D, TexSubImage1D, and TexSubImage2D:

    DEPTH_COMPONENT

    Accepted by the <pname> parameter of GetTexLevelParameterfv and
    GetTexLevelParameteriv:

    TEXTURE_DEPTH_SIZE_ARB      0x884A

    Accepted by the <pname> parameter of TexParameterf, TexParameteri,
    TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv:

    DEPTH_TEXTURE_MODE_ARB      0x884B

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

    None

Additions to Chapter 3 of the 1.3 Specification (Rasterization)

    Section 3.8.1, Texture Image Specification, p. 116, change last
    sentence of first paragraph to:

        "The format STENCIL_INDEX is not allowed."

    Section 3.8.1, Texture Image Specification, p. 116, change final
    paragraph to read:

        "The selected groups are processed exactly as for DrawPixels, stopping
        just before final conversion.  Each R, G, B, A or depth component (D)
        value so generated is clamped to [0,1]."

    Section 3.8.1, Texture Image Specification, p. 117, modify beginning of
    the first paragraph:

        "Components are then selected from the resulting R, G, B, A, or D
        values to obtain a texture with the base internal format specified
        by..."

    Section 3.8.1, Texture Image Specification, p. 117, add two new paragraphs
    after the beginning of the first paragraph:

        "Textures with a base internal format of DEPTH_COMPONENT are supported
        by texture image specification commands only if <target> is TEXTURE_1D,
        TEXTURE_2D, PROXY_TEXTURE_1D or PROXY_TEXTURE_2D.  Using this format in
        conjunction with any other <target> will result in an INVALID_OPERATION
        error."

        "Textures with a base internal format of DEPTH_COMPONENT require depth
        component data; textures with other base internal formats require RGBA
        component data.  The error INVALID_OPERATION is generated if the base
        internal format is DEPTH_COMPONENT and format is not DEPTH_COMPONENT,
        or if the base internal format is not DEPTH_COMPONENT and format is
        DEPTH_COMPONENT."

    Section 3.8.1, Texture Image Specification, p. 117, modify the last
    paragraph, which flows to p. 118:

        "... If a sized internal format is specified, the mapping of the R, G,
        B, A, and D values to texture components is equivalent to ..."

        (on p. 118) "... If a compressed internal format is specified, the
        mapping of the R, G, B, A, and D values to texture components is
        equivalent to..."

    Section 3.8.1, Texture Image Specification, p. 118, add a new row to Table
    3.15.

        Base Internal Format    RGBA Values     Internal Components
        --------------------    -----------     -------------------
        DEPTH_COMPONENT         D               D

    Section 3.8.1, Texture Image Specification, p. 118, add three new rows and
    one new column to Table 3.16.

        Sized Internal Format   Base Int. Format  ...   D bits
        ---------------------   ----------------        ------
        DEPTH_COMPONENT16_ARB   DEPTH_COMPONENT           16
        DEPTH_COMPONENT24_ARB   DEPTH_COMPONENT           24
        DEPTH_COMPONENT32_ARB   DEPTH_COMPONENT           32

    Section 3.8.2, Alternate Texture Image Specification Commands, p. 125,
    modify first paragraph to read:

        ... "The image is taken from the framebuffer exactly as if these
        arguments were passed to CopyPixels, with argument <type> set to
        COLOR or DEPTH_COMPONENT, depending on <internalformat>, stopping
        after pixel transfer processing is complete.  RGBA data is taken
        from the current color buffer while depth component data is taken
        from the depth buffer.  If no depth buffer is present, the error
        INVALID_OPERATION is generated.  Subsequent processing is identical
        to that described for TexImage2D, beginning with clamping of the R,
        G, B, A, or depth values from the resulting pixel groups." ...

    Section 3.8.4, Texture Parameters, p. 133, append table 3.19 with the
    following:

        Name                        Type  Legal Values
        --------------------------  ----  -------------------------------
        DEPTH_TEXTURE_MODE_ARB      enum  LUMINANCE, INTENSITY, ALPHA

    Before current section 3.8.5, Texture Wrap Modes, p. 134, insert the
    following new section.  Renumber subsections of 3.8 appropriately.

        "3.8.5 Depth Component Textures

        Depth textures can be treated as LUMINANCE, INTENSITY or ALPHA
        textures during texture filtering and application. Initially,
        depth textures are interpreted as LUMINANCE."

    Modify section 3.8.7, Texture Minification, p. 139.  Modify the last
    paragraph before the "Mipmapping" section to read:

        "If any of the selected tauijk, tauij, or taui in the above
        equations refer to a border texel with i < -bs, j < bs, k < -bs,
         i >= ws-bs, j >= hs-bs, or k >= ds-bs, then the border values
        given by the current setting of TEXTURE_BORDER_COLOR is used
        instead of the unspecified value or values.  If the texture
        contains color components, the components of the
        TEXTURE_BORDER_COLOR vector are interpreted as an RGBA color
        to match the texture's internal format in a manner consistent
        with table 3.15.  If the texture contains depth components,
        the R component of the TEXTURE_BORDER_COLOR vector is
        interpreted as the depth component value."

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

    None

Additions to Chapter 5 of the 1.3 Specification (Special Functions)

    None

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

    Section 6.1.3, Enumerated Queries, p. 200, edit paragraph two as follows:

        ..."Queries of TEXTURE_RED_SIZE, TEXTURE_GREEN_SIZE,
        TEXTURE_BLUE_SIZE, TEXTURE_ALPHA_SIZE, TEXTURE_LUMINANCE_SIZE,
        TEXTURE_INTENSITY_SIZE, and TEXTURE_DEPTH_SIZE_ARB return the
        actual resolutions of the stored image array components, not
        the resolutions specified when the image array was defined.

    Section 6.1.4, Texture Queries, p. 201, replace the sentence two of
    paragraph two as follows:

        "Calling GetTexImage with a color format when the internal
        format of the texture image is not a color format causes the error
        INVALID_OPERATION.  Likewise, calling GetTexImage with a format
        of DEPTH_COMPONENT when the internal format of the texture
        image is not a depth format cause the error INVALID_OPERATION.
        If the internal format of the texture image level is a color
        format (one of RED, GREEN, BLUE, ALPHA, RGB, BGR, RGBA, BGRA,
        LUMINANCE, or LUMINANCE_ALPHA), then the components are assigned
        among R, G, B, and A according to Table 6.1, starting with the
        first group in the first row, and continuing by obtaining groups
        in order from each row and proceeding from the first row to the
        last, and from the first image to the last for three-dimensional
        textures. If the internal format of the texture image level is a
        depth format (DEPTH_COMPONENT), then each depth component is
        assigned with the same ordering of rows and images."

    Replace the last sentence of paragraph four with:

        "Calling GetTexImage with format of COLOR_INDEX or STENCIL_INDEX
        causes the error INVALID_ENUM."

    Section 1.6.7, Color Table Query, p.203, replace sentence two of
    paragraph one with:

        "format and type accept the same values as do the corresponding
        parameters of GetTexImage except that a format of DEPTH_COMPONENT
        causes the error INVALID_ENUM."

    Section 1.6.8, Convolution Query, p.204, replace sentence two of
    paragraph one with:

        "format and type accept the same values as do the corresponding
        parameters of GetTexImage except that a format of DEPTH_COMPONENT
        causes the error INVALID_ENUM."

    Replace sentence two of paragraph two (specifying GetSeparableFilter)
    with:

        "format and type accept the same values as do the corresponding
        parameters of GetTexImage except that a format of DEPTH_COMPONENT
        causes the error INVALID_ENUM."

    Section 1.6.9, Histogram Query, p.205, replace sentence two of
    paragraph one with:

        "format and type accept the same values as do the corresponding
        parameters of GetTexImage except that a format of DEPTH_COMPONENT
        causes the error INVALID_ENUM."

    Section 1.6.10, Minmax Query, p.205, replace sentence two of
    paragraph one with:

        "format and type accept the same values as do the corresponding
        parameters of GetTexImage except that a format of DEPTH_COMPONENT
        causes the error INVALID_ENUM."

Additions to the GLX Specification

    None

Errors

    INVALID_OPERATION is generated by TexImage2D or CopyTexImage2D if
    <target> is not TEXTURE_2D or PROXY_TEXTURE_2D and <internalFormat>
    is DEPTH_COMPONENT, DEPTH_COMPONENT16_ARB, DEPTH_COMPONENT24_ARB, or
    DEPTH_COMPONENT32_ARB.

    INVALID_OPERATION is generated by TexImage1D or CopyTexImage1D if
    <target> is not TEXTURE_1D or PROXY_TEXTURE_1D and <internalFormat>
    is DEPTH_COMPONENT, DEPTH_COMPONENT16_ARB, DEPTH_COMPONENT24_ARB, or
    DEPTH_COMPONENT32_ARB.

    INVALID_OPERATION is generated by TexImage1D or TexImage2D if <format>
    is DEPTH_COMPONENT and <internalFormat> is not DEPTH_COMPONENT,
    DEPTH_COMPONENT16_ARB, DEPTH_COMPONENT24_ARB, or DEPTH_COMPONENT32_ARB.

    INVALID_OPERATION is generated by TexImage1D or TexImage2D if
    <internalFormat> is DEPTH_COMPONENT, DEPTH_COMPONENT16_ARB,
    DEPTH_COMPONENT24_ARB, or DEPTH_COMPONENT32_ARB, and <format> is not
    DEPTH_COMPONENT.

    INVALID_OPERATION is generated by TexSubImage1D or TexSubImage2D if
    <format> is DEPTH_COMPONENT and the base internal format of the
    texture is not DEPTH_COMPONENT, DEPTH_COMPONENT16_ARB,
    DEPTH_COMPONENT24_ARB, or DEPTH_COMPONENT32_ARB.

    INVALID_OPERATION is generated by TexSubImage1D or TexSubImage2D if
    <format> is not DEPTH_COMPONENT and the base internal format of
    the texture is DEPTH_COMPONENT, DEPTH_COMPONENT16_ARB,
    DEPTH_COMPONENT24_ARB, or DEPTH_COMPONENT32_ARB.

    INVALID_OPERATION is generated by TexImage3D if <internalFormat>
    is DEPTH_COMPONENT, DEPTH_COMPONENT16_ARB, DEPTH_COMPONENT24_ARB,
    or DEPTH_COMPONENT32_ARB.

    INVALID_OPERATION is generated by CopyTexImage1D or CopyTexImage2D if
    <internalFormat> is DEPTH_COMPONENT, DEPTH_COMPONENT16_ARB,
    DEPTH_COMPONENT24_ARB, or DEPTH_COMPONENT32_ARB, and there is no depth
    buffer.

    INVALID_OPERATION is generated by CopyTexSubImage1D or CopyTexSubImage2D
    if the base internal format of the texture is DEPTH_COMPONENT and there
    is no depth buffer.

    INVALID_ENUM is generated if TexParameter[if] parameter <pname>
    is DEPTH_TEXTURE_MODE_ARB and parameter <param> is not ALPHA,
    LUMINANCE, or INTENSITY.

    INVALID_OPERATION is generated if GetTexImage parameter <format>
    is one of RED, GREEN, BLUE, ALPHA, RGB, RGBA, BGR, BGRA, LUMINANCE,
    or LUMINANCE_ALPHA but the internal format of the texture level
    image is not a color format.

    INVALID_OPERATION is generated if GetTexImage parameter <format>
    is DEPTH_COMPONENT but the internal format of the texture level
    image is not a depth format.

    Eliminate the INVALID_ENUM generated if GetTexImage parameter
    <format> is DEPTH_COMPONENT.  (but this should still be an error for
    GetColorTable, GetConvolutionFilter, GetSeparableFilter, GetHistogram,
    and GetMinmax).

New State

    In table 6.12, Texture Objects, p. 202, add the following:

                                                 Initial
    Get Value          Type Get Command           Value  Description                           Sec. Attribute
    ------------------ ---- -------------------- ------- ------------------------------------- ---- ---------
    TEXTURE_DEPTH_SIZE  Z+  GetTexLevelParameter    0    xD texture image i's depth resolution  3.8     -

    In table 6.16, Texture Objects, p. 224, add the following:

    Get Value                   Type  Get Command           Initial Value  Description         Sec.   Attribute
    --------------------------  ----  --------------------  -------------  --------------      -----  ---------
    DEPTH_TEXTURE_MODE_ARB      Z_3   GetTexParameter[if]v  LUMINANCE      depth texture mode  3.8.13 texture



New Implementation Dependent State

    None

Revision History

    19 March 2001
        - initial version
    22 June 2001
        - added 1D textures to issue 4
    16 November 2001
        - removed TEXTURE_BORDER_DEPTH.  use the first component of
          TEXTURE_BORDER_COLOR to specify the depth border value.
        - Added new language in section 3.8.5 to describe how
          TEXTURE_BORDER_COLOR is used with depth textures.
        - Inserted new issue item #4.
    17 November 2001
        - Changed issue 4 resolution.
        - Rewrote section 3.8.4
    12 December 2001 (Pat Brown)
        - Retargeted against the OpenGL 1.3 specification.
        - Depth textures are allowed only on 1D and 2D targets.  Shadowing is
          problematic for 3D and cube map textures.
        - Updated base and sized internal format tables.
        - Documented a couple missing error conditions for TexImage and
          TexSubImage calls where <format> and the texture internal format are
          incompatible.
        - Minor cleanups to provide for depth components in wording that
          formerly assumed RGBA components only.
    13 December 2001
        - Removed a few lingering references to glTexImage3D.
        - Rewrite the first and last error conditions to be clearer.
        - replace "1.2" with "1.3" in a few places.
    - fixed a few more error conditions (Pat Brown)
    11 January 2002
        - fixed "intented" typo
        - added sentence saying that TEXTURE_LUMINANCE_SIZE may be used
          to query the effective resolution of a depth textures when it's
          interpreted as a luminance texture.
    18 January 2002
        - Allow depth textures to be used as LUMINANCE, INTENSITY or ALPHA
          textures (Bimal Poddar)
    21 January 2002
        - Added issue #8 to deal with actual depth texture precision.
          Fixed error to be INVALID_ENUM instead of INVALID_OPERATION.
    13 May 2004 (mjk)
        - Document GetTexImage behavior when depth texture formats are
          supported.
        - Document that GetColorTable, GetConvolutionFilter, GetHistogram,
          and GetMinmax now differ from GetTexImage in that
          DEPTH_COMPONENT is (still) not a legal format for these
          queries.
        - Document in "New Tokens" that DEPTH_COMPONENT is a newly accepted
          token for the <internalFormat> parameter of TexImage1D,
          TexImage2D, CopyTexImage1D and CopyTexImage2D; and the <format>
          parameter of GetTexImage, TexImage1D, TexImage2D, TexSubImage1D,
          and TexSubImage2D.
        - Fix mangled sentence in 3.8.5
    1 June 2004 (John Rosasco)
        - Added BGR and BGRA to the list of color internal formats in
          section 6.1.4.
    29 November 2004 (mjk)
        - Document that GetSeparableFilter now differ from GetTexImage
          in that DEPTH_COMPONENT is (still) not a legal format for
          these queries.
