Name APPLE_texture_2D_limited_npot Name Strings GL_APPLE_texture_2D_limited_npot Contributors Richard Schreyer The many contributors to ARB_texture_non_power_of_two Contact Benj Lipchak, Apple (lipchak 'at' apple.com) Status Complete Version Date: February 24, 2011 Revision: 1.3 Number OpenGL ES Extension #59 Dependencies OpenGL ES 1.0 is required. Written based on the wording of the OpenGL ES 1.1 specification. OES_texture_cube_map affects the definition of this extension. OES_texture_3D affects the definition of this extension. OES_texture_npot affects the definition of this extension. OES_framebuffer_object affects the definition of this extension. Overview Conventional OpenGL ES 1.X texturing is limited to images with power-of-two (POT) dimensions. APPLE_texture_2D_limited_npot extension relaxes these size restrictions for 2D textures. The restrictions remain in place for cube map and 3D textures, if supported. There is no additional procedural or enumerant API introduced by this extension except that an implementation which exports the extension string will allow an application to pass in 2D texture dimensions that may or may not be a power of two. In the absence of OES_texture_npot, which lifts these restrictions, neither mipmapping nor wrap modes other than CLAMP_TO_EDGE are supported in conjunction with NPOT 2D textures. A NPOT 2D texture with a wrap mode that is not CLAMP_TO_EDGE or a minfilter that is not NEAREST or LINEAR is considered incomplete. If such a texture is bound to a texture unit, it is as if texture mapping were disabled for that texture unit. New Procedures and Functions None New Tokens None Additions to Chapter 2 of the GL Specification (OpenGL Operation) None Additions to Chapter 3 of the GL Specification (Rasterization) -- 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. ..." -- 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"... Insert paragraph after the second 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.7.9." -- Section 3.7.9 "Texture Completeness" Rename to "Texture Completeness and Non-Power-Of-Two Textures" Add a bullet item to the list of conditions for completeness: "Each dimension of the zero level array is a power of two or both the texture wrap mode is CLAMP_TO_EDGE and the minification filter is NEAREST or LINEAR." 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 the GLX Specification None Interactions with OES_texture_cube_map If OES_texture_cube_map is supported, TexImage2D called with target TEXTURE_CUBE_MAP will *not* accept non-power-of-two texture dimensions, and will generate and INVALID_VALUE error. Otherwise omit all references to cube map textures. Interactions with OES_texture_3D If OES_texture_3D is supported, TexImage3D will *not* accept non-power-of- two texture dimensions, and will generate and INVALID_VALUE error. Interactions with OES_texture_npot If OES_texture_npot is supported, omit the restrictions on mipmapping and REPEAT wrap modes which lead to texture incompleteness for 2D textures. GLX Protocol None Errors The following error is altered to allow NPOT dimensions for 2D textures: INVALID_VALUE is generated by TexImage2D or glCopyTexImage2D if target is TEXTURE_CUBE_MAP_OES and width or height is not zero or cannot be represented as 2^n for some integer value of n. New State None New Implementation Dependent State None Revision History Date 02/24/2011 Revision: 1.3 (Benj) - remove interaction with OES_framebuffer_object relaxing GenerateMipmap POT base level requirements, since it doesn't make sense to generate mipmaps when mipmapping is disallowed for NPOT textures Date 06/23/2009 Revision: 1.2 (Jon Leech) - Assign extension number Date 04/20/2009 Revision: 1.2 - add interaction with OES_framebuffer_object relaxing GenerateMipmap POT base level requirements Date 04/16/2009 Revision: 1.1 - change wording to clarify that mirrored repeat wrap modes are also not allowed in the absence of OES_texture_npot Date 01/20/2009 Revision: 1.0 - draft proposal