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 parameter of TexParameteri and TexParameterf, and by the parameter of TexParameteriv and TexParameterfv, when their 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