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

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 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
