Name

    OES_texture_mirrored_repeat

Name Strings

    GL_OES_texture_mirrored_repeat

Contact


Notice

    Copyright (c) 2005-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


Version

    Last modified date: May 18, 2005

Number

    OpenGL ES Extension #22

Dependencies

    OpenGL ES 1.0 is required.

    This extension is based on the ARB_texture_mirrored_repeat
    extension specification.

Overview

    This extension extends the set of texture wrap modes to
    include a mode (GL_MIRRORED_REPEAT) 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

    Please refer to the ARB_textured_mirrored_repeat extension specification

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                        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, MIRRORED_REPEAT
    TEXTURE_WRAP_T    integer   CLAMP, CLAMP_TO_EDGE, REPEAT,
                                                CLAMP_TO_BORDER, MIRRORED_REPEAT
    TEXTURE_WRAP_R    integer   CLAMP, CLAMP_TO_EDGE, REPEAT,
                                                 CLAMP_TO_BORDER, MIRRORED_REPEAT

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