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