Name

    ARB_seamless_cube_map

Name Strings

    GL_ARB_seamless_cube_map

Contributors

    Bill Licea-Kane, AMD
    Bruce Merry, ARM
    Graham Sellers, AMD
    Ian Romanick, Intel
    Jeff Bolz, NVIDIA
    Pat Brown, NVIDIA
    Pierre Boudier, AMD

Contact

    Graham Sellers, AMD (graham.sellers 'at' amd.com)

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:         07/21/2009
    Author revision:            4

Number

    ARB Extension #65

Dependencies

    OpenGL 1.1 is required.

    ARB_texture_cube_map is required.

    EXT_texture_filter_anisotropic affects the definition of this extension.

    This extension is written against the OpenGL 3.1 Specification.

Overview

    When sampling from cube map textures, a three-dimensional texture
    coordinate is used to select one of the cube map faces and generate
    a two dimensional texture coordinate ( s t ), at which a texel is
    sampled from the determined face of the cube map texture. Each face
    of the texture is treated as an independent two-dimensional texture,
    and the generated ( s t ) coordinate is subjected to the same
    clamping and wrapping rules as for any other two dimensional texture
    fetch.

    Although it is unlikely that the generated ( s t ) coordinate lies
    significantly outside the determined cube map face, it is often the
    case that the locations of the individual elements required during a
    linear sampling do not lie within the determined face, and their
    coordinates will therefore be modified by the selected clamping and
    wrapping rules. This often has the effect of producing seams or
    other discontinuities in the sampled texture.

    This extension allows implementations to take samples from adjacent
    cube map faces, providing the ability to create seamless cube maps.

IP Status

    None.

New Procedures and Functions

    None.

New Tokens

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

    TEXTURE_CUBE_MAP_SEAMLESS                   0x884F


Additions to Chapter 3 of the 3.1 Specification (Rasterization)

    Section 3.8.7, Cube Map Texture Selection, p. 143, change the last
    paragraph from

    "This new ( s t ) is used to find a texture value in the determined
     face's two-dimensional texture image using the rules given in
     sections 3.8.7 through 3.8.9."

    to:

    Seamless Cube Map Filtering
    ---------------------------

    Seamless cube map filtering is enabled or disabled by calling Enable
    or Disable, respectively, with the symbolic constant
    TEXTURE_CUBE_MAP_SEAMLESS.

    When seamless cube map filtering is disabled, the new (s t) is used
    to find a texture value in the determined face's two-dimensional
    image using the rules given in sections 3.8.9 through 3.8.10.

    When seamless cube map filtering is enabled, the rules for texel
    selection in sections 3.8.9 through 3.8.10 are modified so that
    texture wrap modes are ignored. Instead,

    * If NEAREST filtering is done within a miplevel, always apply wrap
      mode CLAMP_TO_EDGE.
    * If LINEAR filtering is done within a miplevel, always apply wrap mode
      CLAMP_TO_BORDER. Then,
      o If a texture sample location would lie in the texture border in
        either u or v, instead select the corresponding texel from the
        appropriate neighboring face.
      o If a texture sample location would lie in the texture border in
        both u and v (in one of the corners of the cube), there is no
        unique neighboring face from which to extract one texel. The
        recommended method is to average the values of the three
        available samples. However, implementations are free to
        construct this fourth texel in another way, so long as, when the
        three available samples have the same value, this texel also has
        that value.

    The required state is one bit indicating whether seamless cube map
    filtering is enabled or disabled. Initially, it is disabled.

    Add final paragraphs to Section 3.8.7

    "When TEXTURE_MAX_ANISOTROPY_EXT is greater than 1.0, an
     implementation may sample from the texture at multiple locations in
     order to produce a filtered texel value. In this case, some of the
     required samples may lie outside the determined cube map face. If
     TEXTURE_CUBE_MAP_SEAMLESS is enabled, it is implementation defined
     as to whether these samples are taken from the determined face, or
     from the appropriate adjacent cube map face."

Errors

    None.

Dependencies on EXT_texture_filter_anisotropic

    If EXT_texture_filter_anisotropic is not supported, remove the
    final paragraph added to Section 3.8.6 which references
    TEXTURE_MAX_ANISOTROPY_EXT.

New State

    In table 6.42, Miscellaneous, p. 279, add the following:

    Get Value                     Type    Get Command           Init Val      Description                  Sec.   Attribute
    ---------------------------   ------  --------------------  --------      --------------------------   ------ ---------
    TEXTURE_CUBE_MAP_SEAMLESS       B     IsEnabled             FALSE         Seamless cube map filtering  3.8.6  -

New Implementation Dependent State

    None.

Issues

    1) Should this be a new wrap mode, or a separate state?

       RESOLVED: It cannot be a normal wrap mode because it does not
       apply per dimension, but rather to a texture as a whole.
       Therefore, it is a separate state item.

    2) What is the interaction with anisotropic filtering as described
       in EXT_texture_filter_anisotropic?

       RESOLVED: EXT_texture_filter_anisotropic leaves the
       implementation of anisotropic filtering implementation defined.
       Therefore, this extension does the same.

    3) Should this be per-texture, or a global state?

       RESOLVED: While in some cases it may be desirable to mix seamless
       and non-seamless cube map texture sampling, it is sufficient to
       leave this spec defining a global state and provide per-texture
       support in another extension.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------
     4    07/21/09  Jon Leech Reformat to 80 columns and update
                              ambiguous sample location to match
                              the 3.2 spec (bug 5357).

     3    07/20/09  Jon Leech Assign enum value and remove _ARB suffix.

     2    07/01/09  wwlk      Updated per bug 5292.
                              Re-written against the OpenGL 3.1 specification.

     1    05/07/09  gsellers  Initial draft based on
                              AMD_texture_cube_face_select
