Name

    ARB_texture_mirrored_repeat

Name Strings

    GL_ARB_texture_mirrored_repeat

Contact

    Bimal Poddar, Intel, bimal.poddar at intel.com
    Dan Brokenshire, IBM, brokensh at us.ibm.com
    Pat Brown, Nvidia, pbrown at nvidia.com

Notice

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

Status

    Complete. Approved by ARB on October 16, 2001.

Version

    Last modified date: 2001/09/20

Number

    ARB Extension #21

Dependencies

    This extension is written against the OpenGL 1.3 Specification.
    However, this extension does not require OpenGL 1.3.

Overview

    ARB_texture_mirrored_repeat extends the set of texture wrap modes to
    include a mode (GL_MIRRORED_REPEAT_ARB) that effectively uses a texture
    map twice as large at the original image in which the additional half,
    for each coordinate, 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".

Issues

 1. The spec clamps the final (u,v) coordinates to the range [0.5, 2^n-0.5].
    This will produce the same effect as trapping a sample of the border texel
    and using the corresponding edge texel.  The choice of technique is purely
    an implementation detail.


 2. The IBM_texture_mirrored_repeat extension inadvertantly used an HP
    enumerant value (0x8370) allocated by HP as an interleaved array format.
    Should the enumerant value be changed if this becomes an ARB extension?

    No, it is not worth the confusion created by having two different
    enumerant value for the same token.

 3. Should additional mirroring functions be added to this extension and
    perhaps rename it to ARB_texture_mirror. For example, include the two
    mirror modes (MIRROR_CLAMP_ATI and MIRROR_CLAMP_TO_EDGE_ATI) provided
    for in the GL_ATI_texture_mirror_once extension.

    No, these extensions are not interdependent and inclusion of the
    mirror once will likely hinder the adoption of this extension.

New Procedures 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:

      GL_MIRRORED_REPEAT_ARB                    0x8370

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

    None.

Additions to Chapter 3 of the GL Specification (Rasterization)

  Modify Table 3.19, editing only the following lines:

    Name              Type      Legal Values
    ==============    =======   ====================
    TEXTURE_WRAP_S    integer   CLAMP, CLAMP_TO_EDGE, REPEAT,
                                CLAMP_TO_BORDER_ARB, MIRRORED_REPEAT_ARB
    TEXTURE_WRAP_T    integer   CLAMP, CLAMP_TO_EDGE, REPEAT,
                                CLAMP_TO_BORDER_ARB, MIRRORED_REPEAT_ARB
    TEXTURE_WRAP_R    integer   CLAMP, CLAMP_TO_EDGE, REPEAT,
                                CLAMP_TO_BORDER_ARB, MIRRORED_REPEAT_ARB

  Add to end of Section 3.8.5 (Subsection "Texture Wrap Modes")

    If TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R is set to
    MIRRORED_REPEAT_ARB, the s (or t or r) coordinate is converted to:

        s - floor(s),           if floor(s) is even, or
        1 - (s - floor(s)),     if floor(s) is odd.

    The converted s (or t or r) coordinate is then clamped
    as described for CLAMP_TO_EDGE texture coordinate clamping.

Additions to Chapter 4 of the GL Specification (Per-Fragment Operations
and the Framebuffer)

    None

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

    None

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

    None

Additions to Appendix F of the GL Specification (ARB Extensions)

    None

Additions to the GLX Specification

    None

GLX Protocol

    None.

Errors

    None

New State

    Only the type information changes for these parameters:

                                                        Initial
    Get Value       Get Command     Type    Value   Description          Sec.   Attrib
    ---------       -----------     ----    ------- -----------          ----   ------
    TEXTURE_WRAP_S  GetTexParameteriv   n x Z5 REPEAT  Texture Wrap Mode S  3.8    texture
    TEXTURE_WRAP_T  GetTexParameteriv   n x Z5 REPEAT  Texture Wrap Mode T  3.8    texture
    TEXTURE_WRAP_R  GetTexParameteriv   n x Z5 REPEAT  Texture Wrap Mode R  3.8    texture

New Implementation Dependent State

    None


Revision History
    01/09/20 bpoddar    - Moved description for section 3.8.5 to the end
                          to avoid a forward reference
                        - Changed to using the old enumerant
                        - Minor typo/email address fixes

    01/09/11 bpoddar    - Updated for OpenGL 1.3 spec.
                        - Minor change to description of clamping.

    01/03/22 brokensh   Converted the IBM extension to a ARB extension
                        written against the latest specification.
