Name

    EXT_texture_mirror_clamp_to_edge

Name Strings

    GL_EXT_texture_mirror_clamp_to_edge

Contact

    Christophe Riccio, Unity Technologies (christophe.riccio 'at' unity3d.com)

Contributors

    Contributors to ARB_texture_mirror_clamp_to_edge
    Ian Romanick
    Daniel Koch

Notice

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

Status

    Completed on September 7, 2017.

Version

    Last Modified Date: September 7, 2017
    Revision 2

Number

    ES Extension #291

Dependencies

    OpenGL ES 2.0 is required.

    This extension interacts with OpenGL ES 3.0.

    This extension interacts with OpenGL ES 3.2.

    This extension interacts with OES_texture_3D.

    This extension is written against the OpenGL ES 3.2 Specification.

Overview

    EXT_texture_mirror_clamp_to_edge extends the set of texture wrap modes to
    include an additional mode (GL_MIRROR_CLAMP_TO_EDGE_EXT) that effectively uses
    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 TexParameter{if}, SamplerParameter{if}
    and SamplerParameter{if}v, and by the <params> parameter of
    TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when
    their <pname> parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or
    TEXTURE_WRAP_R:

        MIRROR_CLAMP_TO_EDGE_EXT      0x8743 (same value as OpenGL core MIRROR_CLAMP_TO_EDGE)

Additions to Chapter 8 if the OpenGL ES 3.2 Specification
(Textures and Samplers)

  In section 8.10 (Texture Parameters) modify the table entries for Table 8.16
  (Texture parameters and their values) for TEXTURE_WRAP_S, TEXTURE_WRAP_T,
  and TEXTURE_WRAP_R and add the following to the "Legal Values" column:

    Name             Type   Legal Values
    ---------------  ----   ------------
    TEXTURE_WRAP_S   enum   (.. as before)
                            MIRROR_CLAMP_TO_EDGE
    TEXTURE_WRAP_T   enum   (.. as before)
                            MIRROR_CLAMP_TO_EDGE
    TEXTURE_WRAP_R   enum   (.. as before)
                            MIRROR_CLAMP_TO_EDGE

  In section 8.14.2 (Coordinate Wrapping and Texel Selection) add the
  following row to Table 8.19 (Texel location wrap mode application):

    Wrap mode                Result of wrap(coord)
    ---------                ---------------------
    (previous entries..)
    MIRROR_CLAMP_TO_EDGE     min(1-1/(2*size), max(1/(2*size), abs(coord)))

Additions to the GLX Specification

    None

GLX Protocol

    None

Dependencies on OES_texture_3D or equivalent

    If OES_texture_3D or equivalent functionality is not implemented,
    then the references to clamping of 3D textures in this file are
    invalid, and references to TEXTURE_WRAP_R should be ignored.

Dependencies on OpenGL ES 3.0 or equivalent

    If OpenGL ES 3.0 or equivalent is not supported, then ignore all
    references to sampler objects and SamplerParameter* functions.

Dependencies on OpenGL ES 3.2 or equivalent

    If OpenGL ES 3.2 or equivalent is not supported, then ignore all
    references to the TexParameterI* and SamplerParameterI* functions.

New State

    Only the type information changes for these parameters:

    Update Table 21.10 (Textures - state per texture object)
    Get Value           Get Command       Type    Initial Value  (...)
    ---------           -----------       ----    -------------
    TEXTURE_WRAP_S      GetTexParameter   n x Z5  see sec 8.19   (...)
    TEXTURE_WRAP_T      GetTexParameter   n x Z5  see sec 8.19   (...)
    TEXTURE_WRAP_R      GetTexParameter   n x Z5  see sec 8.19   (...)

    Update Table 21.12 (Textures - state per sampler object)
    Get Value           Get Command             Type    Initial Value  (...)
    ---------           -----------             ----    -------------
    TEXTURE_WRAP_S      GetSamplerParameteriv   n x Z5  see sec 8.19   (...)
    TEXTURE_WRAP_T      GetSamplerParameteriv   n x Z5  see sec 8.19   (...)
    TEXTURE_WRAP_R      GetSamplerParameteriv   n x Z5  see sec 8.19   (...)

New Implementation Dependent State

    None

Issues

    None

Revision History

    Revision 2 - September 7, 2017 (criccio)
    - Require OpenGL ES 2.0 instead of OpenGL ES 3.0

    Revision 1 - September 5, 2017 (criccio)
    - Initial EXT version based on ARB_texture_mirror_clamp_to_edge


