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
Specification Update Policy
Khronos-approved extension specifications are updated in response to
issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
extensions which have been promoted to a core Specification, fixes will
first appear in the latest version of that core Specification, and will
eventually be backported to the extension document. This policy is
described in more detail at
https://www.khronos.org/registry/OpenGL/docs/update_policy.php
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