Name

    EXT_texture_mirror_clamp

Name Strings

    GL_EXT_texture_mirror_clamp

Contributors

    Walt Donovan
    Dan Ginsburg

Contact

    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)

Status

    Shipping as of May 2004 for GeForce6.

Version

    Last Modified Date:  2004/05/17
    Version:             4

Number

    298

Issues

    How does EXT_texture_mirror_clamp extend ATI_texture_mirror_once?

        This EXT extension provides the two wrap modes that
        ATI_texture_mirror_once adds but also adds a third new wrap mode
        (GL_MIRROR_CLAMP_TO_BORDER_EXT).  This extension uses the same
        enumerant values for the ATI_texture_mirror_once modes.

    Why is the GL_MIRROR_CLAMP_TO_BORDER_EXT mode more interesting than
    the two other modes?

        Rather than clamp to 100% of the edge of the texture
        (GL_MIRROR_CLAMP_TO_EDGE_EXT) or to 50% of the edge and border
        color (GL_MIRROR_CLAMP), it is preferable to clamp to 100%
        of the border color (GL_MIRROR_CLAMP_TO_BORDER_EXT).  This
        avoids "bleeding" at smaller mipmap levels.

        Consider a texture that encodes a circular fall-off pattern such
        as for a projected spotlight.  A circular pattern is bi-symmetric
        so a "mirror clamp" wrap modes can reduce the memory footprint
        of the texture by a fourth.  Far outside the spotlight pattern,
        you'd like to sample 100% of the border color (typically black
        for a spotlight texture).  The way to achieve this without any
        bleeding of edge texels is with GL_MIRROR_CLAMP_TO_BORDER_EXT.

    Does this extension complete the orthogonality of the current five
    OpenGL 1.5 wrap modes?

         Yes.  There are two ways for repetition to operate (repeated
         & mirrored) and four ways for texture coordinate clamping to
         operate (unclamped, clamp, clamp to edge, & clamp to border).
         The complete table of all 8 modes looks like this:

                          Repeat            Mirror
                         +----------------  ----------------------
         Unclamped       | REPEAT           MIRRORED_REPEAT
         Clamp           | CLAMP            MIRROR_CLAMP
         Clamp to edge   | CLAMP_TO_EDGE    MIRROR_CLAMP_TO_EDGE
         Clamp to border | CLAMP_TO_BORDER  MIRROR_CLAMP_TO_BORDER

         OpenGL 1.0 introduced REPEAT & CLAMP.
         OpenGL 1.2 introduced CLAMP_TO_EDGE
         OpenGL 1.3 introduced CLAMP_TO_BORDER
         OpenGL 1.4 introduced MIRRORED_REPEAT
         ATI_texture_mirror_once introduced MIRROR_CLAMP & MIRROR_CLAMP_TO_EDGE
         EXT_texture_mirror_clamp introduces MIRROR_CLAMP_TO_BORDER

    Do these three new wrap modes work with 1D, 2D, 3D, and cube map
    texture targets?

         RESOLUTION: Yes.

    Do these three new wrap modes work with ARB_texture_non_power_of_two
    functionality?
    
         RESOLUTION: Yes.

    Do these three new wrap modes interact with NV_texture_rectangle?

         RESOLUTION:  Mirroring wrap modes are not supported by
         GL_TEXTURE_RECTANGLE_NV textures.  Conventional mirroring is
         already not supported for texture rectangles so supporting
         clamped mirroring modes should not be supported either.

    Does the specification of MIRROR_CLAMP_EXT & MIRROR_CLAMP_TO_EDGE_EXT
    match the ATI_texture_mirror_once specification?

         I believe yes.  The ATI_texture_mirror_once specification is
         somewhat vague what happens to texture coordinates at or very
         near (within half a texel of) zero.  The presumption is that a
         CLAMP_TO_EDGE behavior is used.  This specification is quite
         explicit that values near zero are clamped to plus or minus
         1/(2*N) respectively so that the CLAMP_TO_EDGE behavior is
         explicit.

    What should this extension be called?

         Calling the extension EXT_texture_mirror_once might cause
         confusion since this extension has additional functionality.
         Also, "once" never appears in the specification.
         EXT_texture_mirror_clamp is a good name because it implies
         support for all the clamped versions of mirroring.

    There is GL_MIRRORED_REPEAT and then GL_MIRROR_CLAMP_EXT,
    GL_MIRROR_CLAMP_TO_EDGE_EXT, and GL_MIRROR_CLAMP_TO_BORDER_EXT.
    Why does the first enumerant name say "MIRRORED" while the other
    three say "MIRROR"?

         This extension follows the naming precedent set by the
         ATI_texture_mirror_once specification.

         Moreover, MIRRORED_REPEAT uses "mirrored" to help that the
         mirroring repeats infinitely.  For the other three modes,
         there is just one mirror that occurs and then a clamp.

Dependencies

    Written based on the wording of the OpenGL 1.4.

    Extends ATI_texture_mirror_once by adding
    GL_MIRROR_CLAMP_TO_BORDER_EXT.

    NV_texture_rectangle trivially affects the definition of this
    extension.

Overview

    EXT_texture_mirror_clamp extends the set of texture wrap modes to
    include three modes (GL_MIRROR_CLAMP_EXT, GL_MIRROR_CLAMP_TO_EDGE_EXT,
    GL_MIRROR_CLAMP_TO_BORDER_EXT) that effectively use a texture map
    twice as large as the original image in which the additional half
    of the new image is a mirror image of the original image.

    This new mode relaxes the need to generate images whose opposite
    edges match by using the original image to generate a matching
    "mirror image".  This mode allows the texture to be mirrored only
    once in the negative s, t, and r directions.

New Procedure and Functions

    None

New Tokens

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

      MIRROR_CLAMP_EXT                     0x8742 (same value as MIRROR_CLAMP_ATI)
      MIRROR_CLAMP_TO_EDGE_EXT             0x8743 (same value as MIRROR_CLAMP_TO_EDGE_ATI)
      MIRROR_CLAMP_TO_BORDER_EXT           0x8912

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

    None

Additions to Chapter 3 if the OpenGL 1.2.1 Specification (Rasterization):

  - (3.8.4, page 136, as amended by the NV_texture_rectangle extension)

    Add the 3 new wrap modes to the list of wrap modes unsupported for
    the TEXTURE_RECTANGLE_NV texture target.

    "Certain texture parameter values may not be specified for textures
    with a target of TEXTURE_RECTANGLE_NV.  The error INVALID_ENUM
    is generated if the target is TEXTURE_RECTANGLE_NV and the
    TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R parameter is set to
    REPEAT, MIRRORED_REPEAT_IBM, MIRROR_CLAMP_EXT, MIRROR_CLAMP_TO_EDGE_EXT, and
    MIRROR_CLAMP_TO_BORDER_EXT.  The error INVALID_ENUM is generated
    if the target is TEXTURE_RECTANGLE_NV and the TEXTURE_MIN_FILTER is
    set to a value other than NEAREST or LINEAR (no mipmap filtering
    is permitted).  The error INVALID_ENUM is generated if the target
    is TEXTURE_RECTANGLE_NV and TEXTURE_BASE_LEVEL is set to any value
    other than zero."

  - Table 3.19, page 137: Change first three entries in table:

    "TEXTURE_WRAP_S    integer     CLAMP, CLAMP_TO_BORDER, CLAMP_TO_EDGE,
                                   MIRRORED_REPEAT, MIRROR_CLAMP_EXT,
                                   MIRROR_CLAMP_TO_BORDER_EXT,
                                   MIRROR_CLAMP_TO_EDGE_EXT, REPEAT
    TEXTURE_WRAP_T     integer     CLAMP, CLAMP_TO_BORDER, CLAMP_TO_EDGE,
                                   MIRRORED_REPEAT, MIRROR_CLAMP_EXT,
                                   MIRROR_CLAMP_TO_BORDER_EXT,
                                   MIRROR_CLAMP_TO_EDGE_EXT, REPEAT
    TEXTURE_WRAP_R     integer     CLAMP, CLAMP_TO_BORDER, CLAMP_TO_EDGE,
                                   MIRRORED_REPEAT, MIRROR_CLAMP_EXT,
                                   MIRROR_CLAMP_TO_BORDER_EXT,
                                   MIRROR_CLAMP_TO_EDGE_EXT, REPEAT"

  - (3.8.7, page 140) After the last paragraph of the section add:

    "Wrap Mode MIRROR_CLAMP_EXT

    Wrap mode MIRROR_CLAMP_EXT mirrors and clamps the texture coordinate,
    where mirroring and clamping a value f computes

      mirrorClamp(f) = min(1, max(1/(2*N), abs(f)))

    where N is the size of the one-, two-, or three-dimensional texture
    image in the direction of wrapping.

    Wrap Mode MIRROR_CLAMP_TO_EDGE_EXT

    Wrap mode MIRROR_CLAMP_TO_EDGE_EXT mirrors and clamps to edge the
    texture coordinate, where mirroring and clamping to edge a value f
    computes

      mirrorClampToEdge(f) = min(1-1/(2*N), max(1/(2*N), abs(f)))

    where N is the size of the one-, two-, or three-dimensional texture
    image in the direction of wrapping.

    Wrap Mode MIRROR_CLAMP_TO_BORDER_EXT

    Wrap mode MIRROR_CLAMP_TO_BORDER_EXT mirrors and clamps to border the
    texture coordinate, where mirroring and clamping to border a value
    f computes

      mirrorClampToBorder(f) = min(1+1/(2*N), max(1/(2*N), abs(f)))

    where N is the size of the one-, two-, or three-dimensional texture
    image in the direction of wrapping."

  - (3.8.8, page 142) Delete this phrase because it is out of date and
    unnecessary given the current way section 3.8.7 is written:

    "(if the wrap mode for a coordinate is CLAMP or CLAMP_TO_EDGE)"

Additions to Chapter 4:

    None

Additions to Chapter 5:

    None

Additions to Chapter 6:

    None

Additions to the GLX Specification

    None

Dependencies on NV_texture_rectangle

    If NV_texture_rectangle is not supported, ignore the statement that
    the initial value for the S, T, and R wrap modes is CLAMP_TO_EDGE
    for rectangular textures.

    Ignore the error for a texture target of TEXTURE_RECTANGLE_NV.

GLX Protocol

    None

Errors

    INVALID_ENUM is generated when TexParameter is called with
    a target of TEXTURE_RECTANGLE_NV and the TEXTURE_WRAP_S,
    TEXTURE_WRAP_T, or TEXTURE_WRAP_R parameter is set to REPEAT,
    MIRRORED_REPEAT_IBM, MIRROR_CLAMP_EXT, MIRROR_CLAMP_TO_EDGE_EXT,
    or MIRROR_CLAMP_TO_BORDER_EXT.

New State

    (table 6.15, p230) amend the following entries [Z5 changed to Z8]:

    Get Value       Type  Get Command      Initial Value    Description          Sec    Attribute
    --------------  ----  ---------------  ---------------  -------------------  -----  ---------
    TEXTURE_WRAP_S  n*Z8  GetTexParameter  REPEAT except    Texture wrap mode S  3.8.7  texture
                                           for rectangular
                                           which is
                                           CLAMP_TO_EDGE
    TEXTURE_WRAP_T  n*Z8  GetTexParameter  REPEAT except    Texture wrap mode T  3.8.7  texture
                                           for rectangular
                                           which is
                                           CLAMP_TO_EDGE
    TEXTURE_WRAP_R  n*Z8  GetTexParameter  REPEAT except    Texture wrap mode R  3.8.7  texture
                                           for rectangular
                                           which is
                                           CLAMP_TO_EDGE

New Implementation Dependent State

    None
