Name

    NV_texture_border_clamp

Name Strings

    GL_NV_texture_border_clamp

Contributors

     Jussi Rasanen, NVIDIA
     Greg Roth, NVIDIA

Contact

    Greg Roth, NVIDIA (groth 'at' nvidia 'dot' com)

Status

    Complete

Version

    Date: Aug 24, 2012
    Revision: 2

Number

    OpenGL ES Extension #149

Dependencies

    OpenGL ES 2.0 is required.

    This extension is written against the OpenGL ES 2.0.25
    specification.

    OES_texture_3D affects the definition of this extension.

Overview

    OpenGL ES provides only a single clamping wrap mode: CLAMP_TO_EDGE.
    However, the ability to clamp to a constant border color can be
    useful to quickly detect texture coordinates that exceed their
    expected limits or to dummy out any such accesses with transparency
    or a neutral color in tiling or light maps.

    This extension defines an additional texture clamping algorithm.
    CLAMP_TO_BORDER_NV clamps texture coordinates at all mipmap levels
    such that NEAREST and LINEAR filters of clamped coordinates return
    only the constant border color. This does not add the ability for
    textures to specify borders using glTexImage2D, but only to clamp
    to a constant border value set using glTexParameter.

New Procedures and Functions

    None.

New Tokens

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

        TEXTURE_BORDER_COLOR_NV                         0x1004

    Accepted by the <param> parameter of TexParameteri and
    TexParameterf, and by the <params> parameter of TexParameteriv and
    TexParameterfv, and returned by the <params> parameter of
    GetTexParameteriv and GetTexParameterfv when their <pname> parameter
    is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R_OES:

        CLAMP_TO_BORDER_NV                              0x812D

Additions to Chapter 3 of the OpenGL ES 2.0.25 Specification
(Rasterization)

    Modify Section 3.7.4 "Texture Parameters"

    Append to the end of the first paragraph:

    If the values for TEXTURE_BORDER_COLOR_NV are specified as integers,
    they are converted to floating-point as described in section 2.1.2.
    Each of the four values set by TEXTURE_BORDER_COLOR_NV is clamped to
    lie in [0, 1].

    Modify Table 3.10, edit the following lines:

    Name                    Type      Legal Values
    ==============          =======   ====================
    TEXTURE_WRAP_S          integer   CLAMP_TO_EDGE, REPEAT, MIRRORED_REPEAT,
                                      CLAMP_TO_BORDER_NV
    TEXTURE_WRAP_T          integer   CLAMP_TO_EDGE, REPEAT, MIRRORED_REPEAT,
                                      CLAMP_TO_BORDER_NV
    TEXTURE_WRAP_R_OES      integer   CLAMP_TO_EDGE, REPEAT, MIRRORED_REPEAT,
                                      CLAMP_TO_BORDER_NV

    and add:

    Name                    Type      Legal Values
    ==============          =======   ====================
    TEXTURE_BORDER_COLOR_NV 4 floats  any 4 values in {0,1}

    Modify Section 3.7.6 "Texture Wrap Modes"

    Add after wrap mode CLAMP_TO_EDGE:

    Wrap Mode CLAMP_TO_BORDER_NV

    CLAMP_TO_BORDER_NV clamps texture coordinates at all mipmaps such
    that the texture filter always samples the constant border color for
    fragments whose corresponding texture coordinate is sufficiently far
    outside the range [0, 1].  The color returned when clamping is
    derived only from the constant border color.

    Texture coordinates are clamped to the range [min, max]. The minimum
    value is defined as

        min = -1 / 2N

    where N is the size of the one-, two-, or three-dimensional texture
    image in the direction of clamping.  The maximum value is defined as

        max = 1 - min

    so that clamping is always symmetric about the [0,1] mapped range of
    a texture coordinate.

    Modify Section 3.7.7 "Texture Minification"

    Add to the end of Subsection "Scale Factor and Level of Detail"

    If any of the selected Tijk or Tij in the above equations refer to a
    border texel with i < 0, j < 0, k < 0, i >= ws, j >= hs, or k >= ds,
    then the border values defined by TEXTURE_BORDER_COLOR_NV are used
    instead of the unspecified value or values. If the texture contains
    color components, the values of TEXTURE_BORDER_COLOR_NV are
    interpreted as an RGBA color to match the texture's internal format
    in a manner consistent with table 3.8. If the texture contains depth
    components, the first component of TEXTURE_BORDER_COLOR_NV is
    interpreted as a depth value.

    Modify Section 3.7.12 "Texture state"

    Modify the last two sentences of the section:

    Next, there are the two sets of texture properties; each consists
    of the selected minification and magnification filters, the wrap
    modes for s, t, and r, and the TEXTURE_BORDER_COLOR_NV. In the
    initial state, the value assigned to TEXTURE_MIN_FILTER is NEAREST_-
    MIPMAP_LINEAR, and the value for TEXTURE_MAG_FILTER is LINEAR. s, t,
    and r wrap modes are all set to REPEAT, and TEXTURE_BORDER_COLOR_NV
    is (0,0,0,0).

Errors

    None.

New State

    Modify table 6.8:

    Change the type information changes for these parameters.
                                                                Initial
    Get Value                 Type   Get Command      Value   Description    Sec.
    ---------                 ------ -----------      ------- -----------    ----
    TEXTURE_WRAP_S            n x Z4 GetTexParameter  REPEAT  Texture wrap   3.7
    TEXTURE_WRAP_T            n x Z4 GetTexParameter  REPEAT  Texture wrap   3.7
    TEXTURE_WRAP_R_OES        n x Z4 GetTexParameter  REPEAT  Texture wrap   3.7

    Add the following parameter:

    Get Value                 Type   Get Command      Value   Description    Sec.
    ---------                 ------ -----------      ------- -----------    ----
    TEXTURE_BORDER_COLOR_NV   2+ x C GetTexParameter  0,0,0,0 Texture border 3.7

Dependencies on OES_texture_3D

    If OES_texture_3D is not supported, ignore all references to
    three-dimensional textures and token TEXTURE_WRAP_R_OES as well
    as any reference to r wrap modes.  References to Tijk, k, and ds in
    section 3.7.6 should also be removed.

Issues

    None

Revision History

    Rev.    Date       Author       Changes
    ----   --------    ---------    -------------------------------------
     4     04 Sep 2012 groth        Restored langauge in 3.7.7 about texture borders
     3     29 Aug 2012 groth        Minor copy edits.
     2     24 Aug 2012 groth        Clarified constant color language and tex_3d dependency
     1     14 Aug 2012 groth        Initial draft based off ARB_texture_border_clamp

