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

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