Name OES_texture_npot Name Strings GL_OES_texture_npot Contact Bruce Merry (bruce.merry at arm.com) Contributors Khronos OpenGL ES working group Contributors to ARB_texture_non_power_of_two Notice Copyright (c) 2005-2013 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html IP Status None. Status Ratified by the Khronos BOP, July 22, 2005. Version Last Modifed Date: 2011-03-07 Author Revision: 3 Number OpenGL ES Extension #37 Dependencies OpenGL ES 1.0 or OpenGL ES 2.0 is required. This extension is written against OpenGL ES 1.1.12 and OpenGL ES 2.0.25. This extension interacts with OES_framebuffer_object, OES_texture_3D and APPLE_texture_2D_limited_npot. Overview This extension adds support for the REPEAT and MIRRORED_REPEAT texture wrap modes and the minification filters supported for non-power of two 2D textures, cubemaps and for 3D textures, if the OES_texture_3D extension is supported. Section 3.8.2 of the OpenGL ES 2.0 specification describes rules for sampling from an incomplete texture. There were specific rules added for non-power of two textures i.e. if the texture wrap mode is not CLAMP_TO_EDGE or minification filter is not NEAREST or LINEAR and the texture is a non-power-of-two texture, then sampling the texture will return (0, 0, 0, 1). These rules are no longer applied by an implementation that supports this extension. Additions to Chapter 3 of the OpenGL ES 2.0 Full Specification In section 3.7.1 (Texture Image Specification), remove the sentence "If is greater than zero, and either or is not a power of two, the error INVALID_VALUE is generated." In section 3.7.7 (Texture Minification), remove the paragraph "If any dimension of any array in a mipmap is not a power of two (e.g. if rounding down as described above is performed), then the mipmap is described as a non-power-of-two texture. Non-power-of-two textures have restrictions on the allowed texture wrap modes and filters, as described in section 3.8.2." Change the title of 3.7.10 (Texture Completeness and Non-Power-Of-Two Textures) to "Texture Completeness". In section 3.7.11 (Mipmap Generation), remove the sentence "If either the width or height of the level zero array are not a power or two, the error INVALID_OPERATION is generated." In section 3.8.2 (Shader Execution), remove the bullet points " - A two-dimensional sampler is called, the corresponding texture image is a non-power-of-two image (as described in the Mipmapping discussion of section 3.7.7), and either the texture wrap mode is not CLAMP_TO_EDGE, or the minification filter is neither NEAREST nor LINEAR. - A cube map sampler is called, any of the corresponding texture images are non-power-of-two images, and either the texture wrap mode is not CLAMP_TO_EDGE, or the minification filter is neither NEAREST nor LINEAR. " Additions to Chapter 3 of the OpenGL ES 1.1.12 Full Specification In section 3.7.1 (Texture Image Specification): Replace the discussion of valid dimensions with "If w_s and h_s are the specified image width and height, and if w_s or h_s is less than zero, then the error INVALID_VALUE is generated." Replace the discussion of image decoding with: "We shall refer to the decoded image as the texture array. A texture array has width and height w_s and h_s as defined above." Update Figure 3.8's caption: "... This is a texture with w_t = 8 and h_t = 4. ..." In section 3.7.7 (Texture Minification): In the subsection "Scale Factor and Level of Detail"... Replace the sentence defining the u and v functions with: "Let u(x,y) = w_s * s(x,y) and v(x,y) = h_s * t(x,y), where w_s and h_s are equal to the width and height of the image array whose level is zero." Replace 2^n and 2^m with w_s and h_s in Equations 3.16 and 3.17. { floor(u), s < 1 i = { (3.16) { w_s - 1, s = 1 { floor(v), t < 1 j = { (3.17) { h_s - 1, t = 1 Replace 2^n and 2^m with w_s and h_s in the equations for computing i_0, j_0, i_1, and j_1 used for LINEAR filtering. { floor(u - 1/2) mod w_s, TEXTURE_WRAP_S is REPEAT i_0 = { { floor(u - 1/2), otherwise { floor(v - 1/2) mod h_s, TEXTURE_WRAP_T is REPEAT j_0 = { { floor(v - 1/2), otherwise { (i_0 + 1) mod w_s, TEXTURE_WRAP_S is REPEAT i_1 = { { i_0 + 1, otherwise { (j_0 + 1) mod h_s, TEXTURE_WRAP_T is REPEAT j_1 = { { j_0 + 1, otherwise In the subsection "Mipmapping", replace the description of the number of sizes of image arrays with "If the image array of level zero has dimensions w_t x h_t, then there are floor(log2(max(w_t, h_t))) + 1 image arrays in the mipmap. Each array subsequent to the level zero array has dimensions max(1, floor(w_t/2^i)) x max(1, floor(h_t/2^i)) until the last array is reached with dimension 1 x 1. Interactions with OES_framebuffer_object If OES_framebuffer_object is supported, then GenerateMipmapOES does not generate an error if the base level is a non-power-of-two image. Interactions with OES_texture_3D If OES_texture_3D is supported, references to width and height should be extended to refer to depth as appropriate, and mipmap generation is permitted for non-power-of-two 3D textures. Interactions with APPLE_texture_2D_limited_npot This extension is a superset of the function in APPLE_texture_2D_limited_npot. Implementations may choose to advertise both extensions, but APPLE_texture_2D_limited_npot is not required to implement this extension on OpenGL ES 1.x. Issues 1) How does this extension interact with manual mipmap generation (GenerateMipmap and GenerateMipmapOES)? RESOLVED: These are supported for NPOT textures. The initial version of this extension did not remove the error when issuing these commands on an non-power-of-two texture, but multiple vendors implemented support for it anyway. 2) How does this extension interact with automatic mipmap generation in GL ES 1.1 (GENERATE_MIPMAP)? RESOLVED: These are supported for NPOT textures. 3) How should this extension interact with APPLE_texture_2D_limited_npot? RESOLVED: it will be a superset, but will not require it. 4) How should this extension interact with OES_texture_3D? RESOLVED: mipmap generation of NPOT 3D textures is supported. OES_texture_3D already specifies that OES_texture_npot enables support for mipmapped 3D textures, but it is unclear whether this should also allow mipmap generation for NPOT 3D textures. 5) How should this extension interact with OES_compressed_paletted_texture? UNRESOLVED Specifically, it's now possible for a row of texels to not be a multiple of the unit size (bytes for PALETTE4_xxx, 32-bit words for PALETTE8_xxx). Options seem to be A) Pad each row to a multiple of the unit size. B) Pad each image to a multiple of the unit size. C) No padding - images can start in the middle of a unit. New Tokens None. New Procedures and Functions None. Errors None. New State None. Revision History 3 2011-03-07 Bruce Merry Added issue 5 2 2011-03-01 Bruce Merry Filled in body and issues 1 2005-07-06 Aaftab Munshi Created the extension