Name

    OES_texture_cube_map

Name Strings

    GL_OES_texture_cube_map

Contact

    Benj Lipchak (benj.lipchak 'at' amd.com)

Notice

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

Status

    Ratified by the Khronos BOP

Version

    Version 2, April 16, 2015

Number

    OpenGL ES Extension #20

Dependencies

    OpenGL ES 1.0 is required.

    This extension is based on the ARB_texture_cube_map extension specification.

Overview

    This extension provides a new texture generation scheme for cube
    map textures.  Instead of the current texture providing a 1D, 2D,
    or 3D lookup into a 1D, 2D, or 3D texture image, the texture is a
    set of six 2D images representing the faces of a cube.  The (s,t,r)
    texture coordinates are treated as a direction vector emanating from
    the center of a cube.  At texture generation time, the interpolated
    per-fragment (s,t,r) selects one cube face 2D image based on the
    largest magnitude coordinate (the major axis).  A new 2D (s,t) is
    calculated by dividing the two other coordinates (the minor axes
    values) by the major axis value.  Then the new (s,t) is used to
    lookup into the selected 2D texture image face of the cube map.

    Unlike a standard 1D, 2D, or 3D texture that have just one target,
    a cube map texture has six targets, one for each of its six 2D texture
    image cube faces.  All these targets must be consistent, complete,
    and have equal width and height (ie, square dimensions).

    This extension also provides two new texture coordinate generation modes
    for use in conjunction with cube map texturing.  The reflection map
    mode generates texture coordinates (s,t,r) matching the vertex's
    eye-space reflection vector.  The reflection map mode
    is useful for environment mapping without the singularity inherent
    in sphere mapping.  The normal map mode generates texture coordinates
    (s,t,r) matching the vertex's transformed eye-space
    normal.  The normal map mode is useful for sophisticated cube
    map texturing-based diffuse lighting models.

    The intent of the new texgen functionality is that an application using
    cube map texturing can use the new texgen modes to automatically
    generate the reflection or normal vectors used to look up into the
    cube map texture.

    An application note:  When using cube mapping with dynamic cube
    maps (meaning the cube map texture is re-rendered every frame),
    by keeping the cube map's orientation pointing at the eye position,
    the texgen-computed reflection or normal vector texture coordinates
    can be always properly oriented for the cube map.  However if the
    cube map is static (meaning that when view changes, the cube map
    texture is not updated), the texture matrix must be used to rotate
    the texgen-computed reflection or normal vector texture coordinates
    to match the orientation of the cube map.  The rotation can be
    computed based on two vectors: 1) the direction vector from the cube
    map center to the eye position (both in world coordinates), and 2)
    the cube map orientation in world coordinates.  The axis of rotation
    is the cross product of these two vectors; the angle of rotation is
    the arcsin of the dot product of these two vectors.

Issues

    Please refer to the ARB_texture_cube_map extension specification.

New Procedures and Functions

        void glTexGenfOES(GLenum coord, GLenum pname, GLfloat param);
        void glTexGenfvOES(GLenum coord, GLenum pname, const GLfloat *params);
        void glTexGeniOES(GLenum coord, GLenum pname, GLint param);
        void glTexGenivOES(GLenum coord, GLenum pname, const GLint *params);
        void glTexGenxOES(GLenum coord, GLenum pname, GLfixed param);
        void glTexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params);

        void glGetTexGenfvOES(GLenum coord, GLenum pname, GLfloat *params);
        void glGetTexGenivOES(GLenum coord, GLenum pname, GLint *params);
        void glGetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params);

New Tokens

    Accepted by the <pname> parameter of TexGenfOES, TexGeniOES, TexGenxOES,
    TexGenfvOES, TexGenivOES, TexGenxvOES, GetTexGenfvOES, GetTexGenivOES, and
    GetTexGenxvOES:

        TEXTURE_GEN_MODE_OES                0x2500

    Accepted by the <params> parameter of TexGenfOES, TexGeniOES, TexGenxOES,
    TexGenfvOES, TexGenivOES, and TexGenxvOES when <pname> parameter is
    TEXTURE_GEN_MODE_OES:

        NORMAL_MAP_OES                      0x8511
        REFLECTION_MAP_OES                  0x8512

    Accepted by the <cap> parameter of Enable, Disable, IsEnabled, by the
    <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetFixedv, and
    by the <target> parameter of BindTexture, GetTexParameterfv, 
    GetTexParameteriv, GetTexParameterxv, TexParameterf, TexParameteri,
    TexParameterx, TexParameterfv, TexParameteriv, and TexParameterxv:

        TEXTURE_CUBE_MAP_OES                0x8513

    Accepted by the <cap> parameter of Enable, Disable, IsEnabled, by the
    <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetFixedv, and
    by the <coord> parameter of TexGenfOES, TexGeniOES, TexGenxOES, TexGenfvOES, 
    TexGenivOES, TexGenxvOES, GetTexGenfvOES, GetTexGenivOES, and
    GetTexGenxvOES:

        TEXTURE_GEN_STR_OES                 0x8D60

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

        TEXTURE_BINDING_CUBE_MAP_OES        0x8514

    Accepted by the <target> parameter of TexImage2D, CopyTexImage2D, 
    TexSubImage2D, and CopySubTexImage2D:

        TEXTURE_CUBE_MAP_POSITIVE_X_OES     0x8515
        TEXTURE_CUBE_MAP_NEGATIVE_X_OES     0x8516
        TEXTURE_CUBE_MAP_POSITIVE_Y_OES     0x8517
        TEXTURE_CUBE_MAP_NEGATIVE_Y_OES     0x8518
        TEXTURE_CUBE_MAP_POSITIVE_Z_OES     0x8519
        TEXTURE_CUBE_MAP_NEGATIVE_Z_OES     0x851A

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

        MAX_CUBE_MAP_TEXTURE_SIZE_OES       0x851C

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

 --  Section 2.11.4 "Generating Texture Coordinates"

      Change the last sentence in the 1st paragraph (page 37) to:

      "If <pname> is TEXTURE_GEN_MODE_OES, then either <params> points to
      or <param> is an integer that is one of the symbolic constants
      REFLECTION_MAP_OES, or NORMAL_MAP_OES."  OBJECT_LINEAR, EYE_LINEAR, 
      and SPHERE_MAP texture coordinate generation modes are not supported.

      Add these paragraphs after the 4th paragraph (page 38):

      "If TEXTURE_GEN_MODE_OES indicates REFLECTION_MAP_OES, compute the
      reflection vector r as described for the SPHERE_MAP mode.  Then the
      value assigned to an s coordinate is s = rx; the value assigned to a t
      coordinate is t = ry; and the value assigned to a r coordinate is r = rz.

      If TEXTURE_GEN_MODE_OES indicates NORMAL_MAP_OES, compute the normal
      vector nf as described in section 2.10.3.  Then the value assigned
      to an s coordinate is s = nfx; the value assigned to a t coordinate is
      t = nfy; and the value assigned to a r coordinate is r = nfz.  (The values
      nfx, nfy, and nfz are the components of nf.)

      A texture coordinate generation function is enabled or disabled
      using Enable and Disable with an argument of TEXTURE_GEN_STR_OES.  
      TEXTURE_GEN_S, TEXTURE_GEN_T, TEXTURE_GEN_R and TEXTURE_GEN_Q
      argument values to Enable and Disable are not supported.

      The last paragraph's last sentence (page 38) should be changed to:

      "Initially all texture generation modes are set to REFLECTION_MAP_OES"

Additions to Chapter 3 of the 1.5 Specification (Rasterization)

 --  Section 3.8.1 "Texture Image Specification"

     Change the second and third to last sentences on page 116 to:

     "<target> must be one of TEXTURE_2D for a 2D texture, or one of
     TEXTURE_CUBE_MAP_POSITIVE_X_OES, TEXTURE_CUBE_MAP_NEGATIVE_X_OES,
     TEXTURE_CUBE_MAP_POSITIVE_Y_OES, TEXTURE_CUBE_MAP_NEGATIVE_Y_OES,
     TEXTURE_CUBE_MAP_POSITIVE_Z_OES, or TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
     for a cube map texture."

     Add the following paragraphs after the first paragraph on page 117:

     "A 2D texture consists of a single 2D texture image.  A cube
     map texture is a set of six 2D texture images.  The six cube map
     texture targets form a single cube map texture though each target
     names a distinct face of the cube map.  The TEXTURE_CUBE_MAP_*_OES
     targets listed above update their appropriate cube map face 2D
     texture image.  Note that the six cube map 2D image tokens such as
     TEXTURE_CUBE_MAP_POSITIVE_X_OES are used when specifying, updating,
     or querying one of a cube map's six 2D image, but when enabling
     cube map texturing or binding to a cube map texture object (that is
     when the cube map is accessed as a whole as opposed to a particular
     2D image), the TEXTURE_CUBE_MAP_OES target is specified.

     When the target parameter to TexImage2D is one of the six cube map
     2D image targets, the error INVALID_VALUE is generated if the width
     and height parameters are not equal.

     If cube map texturing is enabled at the time a primitive is
     rasterized and if the set of six targets are not "cube complete",
     then it is as if texture mapping were disabled.  The targets of
     a cube map texture are "cube complete" if the array 0 of all six
     targets have identical, positive, and square dimensions, the array
     0 of all six targets were specified with the same internalformat,
     and the array 0 of all six targets have the same border width."

     After the 14th paragraph (page 116) add:

     "In a similiar fashion, the maximum allowable width and height
     (they must be the same) of a cube map texture must be at least
     2^(k-lod) for image arrays level 0 through k, where k is the
     log base 2 of MAX_CUBE_MAP_TEXTURE_SIZE_OES."

 --  Section 3.8.2 "Alternate Texture Image Specification Commands"

     Update the second paragraph (page 120) to say:

     ... "Currently, <target> must be
     TEXTURE_2D, TEXTURE_CUBE_MAP_POSITIVE_X_OES,
     TEXTURE_CUBE_MAP_NEGATIVE_X_OES, TEXTURE_CUBE_MAP_POSITIVE_Y_OES,
     TEXTURE_CUBE_MAP_NEGATIVE_Y_OES, TEXTURE_CUBE_MAP_POSITIVE_Z_OES,
     or TEXTURE_CUBE_MAP_NEGATIVE_Z_OES." ...

     Add after the second paragraph (page 120), the following:

     "When the target parameter to CopyTexImage2D is one of the six cube
     map 2D image targets, the error INVALID_VALUE is generated if the
     width and height parameters are not equal."

 --  Section 3.8.3 "Texture Parameters"

     Change paragraph one (page 124) to say:

     ... "<target> is the target, either TEXTURE_2D or TEXTURE_CUBE_MAP_OES."

     Add a final paragraph saying:

     "Texture parameters for a cube map texture apply to cube map
     as a whole; the six distinct 2D texture images use the
     texture parameters of the cube map itself.

 --  Section 3.8.5 "Texture Minification" under "Mipmapping"

     Change the first full paragraph on page 130 to:

     ... "If texturing is enabled for two-dimensional texturing but not cube map
     texturing (and TEXTURE_MIN_FILTER is one that requires a mipmap) at the
     time a primitive is rasterized and if the set of arrays
     TEXTURE_BASE_LEVEL through q = min{p,TEXTURE_MAX_LEVEL} is incomplete,
     based on the dimensions of array 0, then it is as if texture mapping were
     disabled."

     Follow the first full paragraph on page 130 with:

     "If cube map texturing is enabled and TEXTURE_MIN_FILTER is one that
     requires mipmap levels at the time a primitive is rasterized and
     if the set of six targets are not "mipmap cube complete", then it
     is as if texture mapping were disabled.  The targets of a cube map
     texture are "mipmap cube complete" if the six cube map targets are
     "cube complete" and the set of arrays TEXTURE_BASE_LEVEL through
     q are not incomplete (as described above)."

 --  Section 3.8.7 "Texture State and Proxy State"

     Change the first sentence of the first paragraph (page 131) to say:

     "The state necessary for texture can be divided into two categories.
     First, there are the nine sets of mipmap arrays (one each for the
     one-, two-, and three-dimensional texture targets and six for the
     cube map texture targets) and their number." ...

     Change the second paragraph (page 132) to say:

     "In addition to the one-, two-, three-dimensional, and the six cube
     map sets of image arrays, the partially instantiated one-, two-,
     and three-dimensional and one cube map sets of proxy image arrays
     are maintained." ...

 --  Section 3.8.8 "Texture Objects"

     Change the first sentence of the first paragraph (page 132) to say:

     "In addition to the default textures TEXTURE_2D and TEXTURE_CUBE_MAP_OES,
     named two-dimensional texture objects and cube map texture objects can be
     created and operated on." ...

     Change the second paragraph (page 132) to say:

     "A texture object is created by binding an unused name to
     TEXTURE_2D or TEXTURE_CUBE_MAP_OES." ...
     "If the new texture object is bound to TEXTURE_2D or TEXTURE_CUBE_MAP_OES,
     it remains a two-dimensional or cube map texture until it is deleted."

     Change the third paragraph (page 133) to say:

     "BindTexture may also be used to bind an existing texture object to
     either TEXTURE_2D or TEXTURE_CUBE_MAP_OES."

     Change paragraph five (page 133) to say:

     "In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP_OES have two-
     dimensional and cube map state vectors associated with them respectively."
     ...  "The initial two-dimensional and cube map texture is therefore
     operated upon, queried, and applied as TEXTUER_2D and TEXTURE_CUBE_MAP_OES
     respectively while 0 is bound to the corresponding targets."

     Change paragraph six (page 133) to say:

     ... "If a texture that is currently bound to one of the targets TEXTURE_2D
     or TEXTURE_CUBE_MAP_OES is deleted, it is as though BindTexture has been
     executed with the same <target> and <texture> zero." ...

 --  Section 3.8.10 "Texture Application"

     Replace the beginning sentences of the first paragraph (page 138)
     with:

     "Texturing is enabled or disabled using the generic Enable
     and Disable commands, respectively, with the symbolic constants
     TEXTURE_2D or TEXTURE_CUBE_MAP_OES to enable the two-dimensional or cube
     map texturing respectively.  If the cube map texture and the two-
     dimensional texture are enabled, then cube map texturing is used.  If
     texturing is disabled, a rasterized fragment is passed on unaltered to the
     next stage of the GL (although its texture coordinates may be discarded).
     Otherwise, a texture value is found according to the parameter values of
     the currently bound texture image of the appropriate dimensionality.

     However, when cube map texturing is enabled, the rules are
     more complicated.  For cube map texturing, the (s,t,r) texture
     coordinates are treated as a direction vector (rx,ry,rz) emanating
     from the center of a cube.  (The q coordinate can be ignored since
     it merely scales the vector without affecting the direction.) At
     texture application time, the interpolated per-fragment (s,t,r)
     selects one of the cube map face's 2D image based on the largest
     magnitude coordinate direction (the major axis direction).  If two
     or more coordinates have the identical magnitude, the implementation
     may define the rule to disambiguate this situation.  The rule must
     be deterministic and depend only on (rx,ry,rz).  The target column
     in the table below explains how the major axis direction maps to
     the 2D image of a particular cube map target.

      major axis
      direction     target                             sc     tc    ma
      ----------    -------------------------------    ---    ---   ---
       +rx          TEXTURE_CUBE_MAP_POSITIVE_X_OES    -rz    -ry   rx
       -rx          TEXTURE_CUBE_MAP_NEGATIVE_X_OES    +rz    -ry   rx
       +ry          TEXTURE_CUBE_MAP_POSITIVE_Y_OES    +rx    +rz   ry
       -ry          TEXTURE_CUBE_MAP_NEGATIVE_Y_OES    +rx    -rz   ry
       +rz          TEXTURE_CUBE_MAP_POSITIVE_Z_OES    +rx    -ry   rz
       -rz          TEXTURE_CUBE_MAP_NEGATIVE_Z_OES    -rx    -ry   rz

     Using the sc, tc, and ma determined by the major axis direction as
     specified in the table above, an updated (s,t) is calculated as
     follows

        s   =   ( sc/|ma| + 1 ) / 2
        t   =   ( tc/|ma| + 1 ) / 2

     This new (s,t) is used to find a texture value in the determined
     face's 2D texture image using the rules given in sections 3.8.5
     and 3.8.6." ...

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

     None

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

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

 --  Section 6.1.3 "Enumerated Queries"

     Change the fourth paragraph (page 183) to say:

     "The GetTexParameter parameter <target> may be one of TEXTURE_2D,
     or TEXTURE_CUBE_MAP_OES, indicating the currently bound two-dimensional
     or cube map texture object."

Additions to the GLX Specification

     None

Errors

     INVALID_VALUE is generated when the target parameter to TexImage2D
     or CopyTexImage2D is one of the six cube map 2D image targets and
     the width and height parameters are not equal.

New State

(table 6.12, p202) add the following entries:

Get Value                        Type    Get Command   Initial Value   Description           Sec    Attribute
---------                        ----    -----------   -------------   -----------           ------ --------------
TEXTURE_CUBE_MAP_OES             B       IsEnabled     False           True if cube map      3.8.10 texture/enable
                                                                       texturing is enabled
TEXTURE_BINDING_CUBE_MAP_OES     Z+      GetIntegerv   0               Texture object        3.8.8  texture
                                                                       for TEXTURE_CUBE_MAP
TEXTURE_CUBE_MAP_POSITIVE_X_OES  nxI     N/A           see 3.8         positive x face       3.8    -
                                                                       cube map texture
                                                                       image at lod i
TEXTURE_CUBE_MAP_NEGATIVE_X_OES  nxI     N/A           see 3.8         negative x face       3.8    -
                                                                       cube map texture
                                                                       image at lod i
TEXTURE_CUBE_MAP_POSITIVE_Y_OES  nxI     N/A           see 3.8         positive y face       3.8    -
                                                                       cube map texture
                                                                       image at lod i
TEXTURE_CUBE_MAP_NEGATIVE_Y_OES  nxI     N/A           see 3.8         negative y face       3.8    -
                                                                       cube map texture
                                                                       image at lod i
TEXTURE_CUBE_MAP_POSITIVE_Z_OES  nxI     N/A           see 3.8         positive z face       3.8    -
                                                                       cube map texture
                                                                       image at lod i
TEXTURE_CUBE_MAP_NEGATIVE_Z_OES  nxI     N/A           see 3.8         negative z face       3.8    -
                                                                       cube map texture
                                                                       image at lod i

(table 6.14, p204) add the following entries:

Get Value            Type Get Command    Initial Value      Description Sec     Attribute
---------            ---- -----------    -------------      ----------- ------  ---------
TEXTURE_GEN_MODE_OES Z2   GetTexGenivOES REFLECTION_MAP_OES Function used for   2.10.4 texture
                                                            texgen (for s,t,r)
TEXTURE_GEN_STR_OES  B    IsEnabled      FALSE              True if texgen is   2.10.4 texture
                                                            enabled (for s,t,r)

New Implementation Dependent State

(table 6.24, p214) add the following entry:

Get Value                       Type    Get Command   Minimum Value   Description           Sec    Attribute
---------                       ----    -----------   -------------   -----------           ------ --------------
MAX_CUBE_MAP_TEXTURE_SIZE_OES   Z+      GetIntegerv   16              Maximum cube map      3.8.1  -
                                                                      texture image
                                                                      dimension

Revision History

Version 1, November 8, 2007 (Benj Lipchak) - First version cleaned up for ES
Version 2, April 16, 2015 (Jon Leech) - Remove border width term bt (nonexistent in ES)
