Back to the OpenGL extension cross reference

GL_ARB_texture_rectangle


Name


     ARB_texture_rectangle

Name Strings


     GL_ARB_texture_rectangle

Contributors


     Pat Brown
Daniel Ginsburg
Michael Gold
Mark J. Kilgard
Jon Leech
Bill Licea-Kane
Barthold Lichtenbelt
Benjamin Lipchak
Brian Paul
John Rosasco
Jeremy Sandmel
Geoff Stahl

Contact


     Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
Geoff Stahl, Apple Computer (gstahl 'at' apple.com)

Notice


     Copyright 2005, OpenGL Architectural Review Board.

Status


     Complete. Approved by the ARB on June 8, 2004.

Amended language re-voted by the ARB on November 3, 2005.

Functionally identical to EXT_texture_rectangle and
NV_texture_rectangle extensions currently shipping, except for
the additions to the OpenGL Shading Language.

Version


     Date: October 4, 2005
Revision: 1.21

Number


     ARB Extension #38

Dependencies


     OpenGL 1.1 is required

OpenGL 1.4 (or ARB_texture_mirrored_repeat) affects the definition
of this extension.

ARB_texture_non_power_of_two trivially affects the definition of
this extension.

ATI_texture_mirror_once affects the definition of this extension.

EXT_paletted_texture affects the definition of this extension.

EXT_texture_compression_s3tc affects the definition of this
extension.

EXT_texture_mirror_clamp affects the definition of this extension.

The OpenGL Shading Language specification (provided by OpenGL 2.0
and/or ARB_shader_objects) interacts with this extension.

This extension is written against the OpenGL 2.0 specification.

Overview


     OpenGL texturing is limited to images with power-of-two dimensions
and an optional 1-texel border. The ARB_texture_rectangle extension
adds a new texture target that supports 2D textures without requiring
power-of-two dimensions.

Non-power-of-two sized (NPOTS) textures are useful for storing video
images that do not have power-of-two sized (POTS). Re-sampling
artifacts are avoided and less texture memory may be required by
using non-power-of-two sized textures. Non-power-of-two sized
textures are also useful for shadow maps and window-space texturing.

However, non-power-of-two sized textures have limitations that
do not apply to power-of-two sized textures. NPOTS textures may
not use mipmap filtering; POTS textures support both mipmapped
and non-mipmapped filtering. NPOTS textures support only the
GL_CLAMP, GL_CLAMP_TO_EDGE, and GL_CLAMP_TO_BORDER wrap modes;
POTS textures support GL_CLAMP_TO_EDGE, GL_REPEAT, GL_CLAMP,
GL_MIRRORED_REPEAT, and GL_CLAMP_TO_BORDER (and GL_MIRROR_CLAMP_ATI
and GL_MIRROR_CLAMP_TO_EDGE_ATI if ATI_texture_mirror_once is
supported) . NPOTS textures do not support an optional 1-texel
border; POTS textures do support an optional 1-texel border.

NPOTS textures are accessed by dimension-dependent (aka
non-normalized) texture coordinates. So instead of thinking of
the texture image lying in a [0..1]x[0..1] range, the NPOTS texture
image lies in a [0..w]x[0..h] range.

This extension adds a new texture target and related state (proxy,
binding, max texture size).

Issues


  1) Should rectangular textures simply be an extension to the 2D texture
target that allows non-power-of-two widths and heights?

No. The rectangular texture is an entirely new texture target type
called GL_TEXTURE_RECTANGLE_ARB. This is because while the texture
rectangle target relaxes the power-of-two dimensions requirements of
the texture 2D target, it also has limitations such as the absence of
both mipmapping and the GL_REPEAT and GL_MIRRORED_REPEAT wrap modes.
Additionally, rectangular textures do not use [0..1] normalized
texture coordinates.

The texture rectangle is an analogue to the pixel rectangle primitive
(see section 3.6 titled "Pixel Rectangles" in the core specification)
and the framebuffer. Just as the pixel rectangle primitive and
the framebuffer are accessed by integer-ized dimension-dependent 2D
coordinates, so is the texture rectangle. Just as pixel rectangles
and the framebuffer do not have mipmaps, nor do texture rectangles.

2) Should 1D, 2D, 3D, or cube map textures be allowed to be NPOTS by
this extension?

No. The ARB_texture_non_power_of_two extension relaxes the
power-of-two restrictions for these conventional texture targets to
support NPOTS while maintaining the normalized texture coordinates.

3) How is the image of a rectangular texture specified?

Using the standard OpenGL API for specifying a 2D texture
image: glTexImage2D, glSubTexImage2D, glCopyTexImage2D,
and glCopySubTexImage2D. The target for these commands is
GL_TEXTURE_RECTANGLE_ARB though.

This is similar to how the texture cube map functionality uses the 2D
texture image specification API though with its own texture target.

The texture target GL_TEXTURE_RECTANGLE_ARB should also
be used for glGetTexImage, glGetTexLevelParameteriv, and
glGetTexLevelParameterfv.

4) Should anything be said about performance?

No, but developers should not be surprised if conventional POTS
textures will render slightly faster than texture rectangle textures.
This is particularly likely to be true when texture rectangle
textures are minified leading to texture cache thrashing due to
lack of support for mipmaps.

5) Is mipmap filtering permitted?

Mipmap filtering is not permitted. Since this is the case the
default minification filter for GL_TEXTURE_RECTANGLE_ARB targets is
GL_LINEAR.

6) What texture wrap modes are allowed and what is the default
state?

Only the GL_CLAMP, GL_CLAMP_TO_EDGE, and CLAMP_TO_BORDER
wrap modes are allowed. CLAMP_TO_EDGE is the default state.
GL_REPEAT and GL_MIRRORED_REPEAT are not supported with the
GL_TEXTURE_RECTANGLE_ARB texture target.

7) Are texture borders supported?

Borders are not supported.

8) Are paletted textures supported?

Paletted rectangular textures are not supported.

9) Can compressed texture images be specified for a rectangular texture?

The generic texture compression internal formats introduced by
ARB_texture_compression are supported for rectangular textures
because the image is not presented as compressed data and the
ARB_texture_compression extension always permits generic texture
compression internal formats to be stored in uncompressed form.
Implementations are free to support generic compression internal
formats for rectangular textures if supported but such support is
not required.

This extensions makes a blanket statement that specific compressed
internal formats for use with glCompressedTexImage<n>D are NOT
supported for rectangular textures. This is because several existing
hardware implementations of texture compression formats such as S3TC
are not designed for compressing rectangular textures. This does
not preclude future texture compression extensions from supporting
compressed internal formats that do work with rectangular extensions
(by relaxing the current blanket error condition).

10) How are rectangular textures enabled?

Rectangular textures are enabled by enabling the
GL_TEXTURE_RECTANGLE_ARB texture target via glEnable
(GL_TEXTURE_RECTANGLE_ARB). This enable is prioritized above
GL_TEXTURE_2D and below GL_TEXTURE_3D.

From lowest priority to highest priority: GL_TEXTURE_1D,
GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_3D,
GL_TEXTURE_CUBE_MAP.

11) How are texture coordinates addressed for rectangular textures?

Texture coordinates are addressed without being normalized from
[0..1], instead [0..w] and [0..h] are used, where w and h are width
and height of the texture respectively.

12) How should applications determine the available maximum texture
dimensions available?

Implementation dependent rectangular texture size limitations are
queried using the GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB parameter and
may be different that standard texture size limits.

13) How does the handling of the R texture component differ from
the handling of S and T?

The R texture coordinate for rectangular textures is handled
as it would be for standard two dimensional textures. Thus the
coordinates range from [0..1] and the wrapping mode is unchanged
from the default.

14) Does this extension work with OpenGL 1.4's shadow mapping?

Yes. The one non-obvious allowance to support OpenGL 1.4's shadow
mapping is that the R texture coordinate wrap mode remains UNCHANGED
for rectangular textures. Clamping of the R texture coordinate
for rectangular textures uses the standard [0,1] interval rather
than the [0,w_s] or [0,h_s] intervals as in the case of S and T.
This is because R represents a depth value in the [0,1] range
whether using a 2D or rectangular texture.

15) How does this extension interact with GLSL based on the "OpenGL
Shading Language Extension Conventions"?

Unfortunately, this extension was specified and implemented
contemporaneously with the GLSL Extension Conventions and because
of this timing does not follow its guidance for #extension and
adornment of new GLSL names. Because this extension has both an
API interaction (adding a new rectangle texture target) and a GLSL
interaction (functions and sampler types for accessing texture
rectangles), you can't practically use the GLSL texture rectangle
functionality without the API functionality. For this reason,
detecting the GL_ARB_texture_rectangle string is sufficient for
assuming the GLSL functionality is present.

Conceptually, you can consider the declaration
#extension GL_ARB_texture_rectangle : require, to allow support
for texture rectangles, to be implicitly prepended to every
GLSL shader when ARB_texture_rectangle is advertised.

All future GLSL extensions should follow the "OpenGL Shading Language
Extension Conventions" however.

16) How can a GLSL shader tell if this extension is supported?

"GL_ARB_texture_rectangle" preprocessor macro is predefined to be 1.

17) Should GL_SAMPLER_2D_RECT_ARB and GL_SAMPLER_2D_RECT_SHADOW_ARB be
returned by the "type" parameter of glGetActiveUniformARB when
returning the type of a sampler2DRect or sampler2DRectShadow sampler
uniform?

Yes, there is already language in the ARB_shader_objects extension
saying this so there's no additional language added to this
extension. The language is missing from OpenGL 2.0 so we add the
ARB_shader_objects language as part of this specification too.

18) Can a shader still turn off support for this extension?

Yes, a shader can still include all variations of
#extension GL_ARB_texture_rectangle in its source code. This
includes #extension GL_ARB_texture_rectangle : disable, to
disable support for it.


New Procedures and Functions


    None

New Tokens


    Accepted by the <cap> parameter of Enable, Disable and IsEnabled;
by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv
and GetDoublev; and by the <target> parameter of BindTexture,
GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri,
TexParameterfv and TexParameteriv:

TEXTURE_RECTANGLE_ARB 0x84F5

Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
GetFloatv and GetDoublev:

TEXTURE_BINDING_RECTANGLE_ARB 0x84F6

Accepted by the <target> parameter of GetTexLevelParameteriv,
GetTexLevelParameterfv, GetTexParameteriv and TexImage2D:

PROXY_TEXTURE_RECTANGLE_ARB 0x84F7

Accepted by the <pname> parameter of GetBooleanv, GetDoublev,
GetIntegerv and GetFloatv:

MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8

Accepted by the <target> parameter of GetTexImage,
GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D,
CopyTexImage2D, TexSubImage2D and CopySubTexImage2D:

TEXTURE_RECTANGLE_ARB

Returned by <type> parameter of GetActiveUniform when the location
<index> for program object <program> is of type sampler2DRect:

SAMPLER_2D_RECT_ARB 0x8B63

Returned by <type> parameter of GetActiveUniform when the location
<index> for program object <program> is of type sampler2DRectShadow:

SAMPLER_2D_RECT_SHADOW_ARB 0x8B64

Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)


  - (2.15.3, pg. 80-81) "Uniform Variables" under "Shader Variables"

Add SAMPLER_2D_RECT_ARB and SAMPLER_2D_RECT_SHADOW_ARB to the list
of returned types in the sentence starting "The type returned can
be any of ..."

- (2.15.4, pg. 86) "Texture Access" under "Shader Execution"

Replace the three bullets with the following language:

"...the results of a texture lookup are undefined if:

* The sampler used in a texture lookup function is of type
sampler1D or sampler2D or sampler2DRect, and the texture object's
internal format is DEPTH_COMPONENT, and the TEXTURE_COMPARE_MODE
is not NONE.

* The sampler used in a texture lookup function is of type
sampler1DShadow or sampler2DShadow or sampler2DRectShadow,
and the texture object's internal format is DEPTH_COMPONENT,
and the TEXTURE_COMPARE_MODE is NONE.

* The sampler used in a texture lookup function is of type
sampler1DShadow or sampler2DShadow or sampler2DRectShadow,
and the texture object's internal format is not DEPTH_COMPONENT."

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)


    These changes describe use of the TEXTURE_RECTANGLE_ARB texture
target, supported formats, texture dimensions, and texture proxies:

- (3.6.3, pg. 118) "Pixel Transfer Modes" under "Color Table
Specification" or the ColorTableEXT description in the
EXT_paletted_texture specification

If EXT_paletted_texture is supported, add the following statement
after paragraph 5 of the sub-section:

"The error INVALID_ENUM is generated if the target to ColorTable (or
ColorTableEXT or the various ColorTable and ColorTableEXT alternative
commands) is TEXTURE_RECTANGLE_ARB or PROXY_TEXTURE_RECTANGLE_ARB."

- (3.8.1, p. 151) "Texture Image Specification"

Change the first sentence of the fourth paragraph on this page to:

Textures with a base internal format of DEPTH COMPONENT are supported
by texture image specification commands only if target is TEXTURE_1D,
TEXTURE_2D, TEXTURE_RECTANGLE_ARB, PROXY_TEXTURE_1D, PROXY_TEXTURE_2D
or PROXY_TEXTURE_RECTANGLE_ARB.

- (3.8.1, pg. 156) "Texture Image Specification"

Add a sentence to the middle of the 20th paragraph of the
section (first paragraph on the page), directly after "... for
image arrays of level 0 through k, where k is the log base 2 of
MAX_TEXTURE_SIZE." reading:

"The maximum allowable width of a rectangular texture image,
and the maximum allowable height of a rectangular texture
image, must be at least the implementation-dependent value of
MAX_RECTANGLE_TEXTURE_SIZE_ARB."

- (3.8.1, pg. 156) "Texture Image Specification"

In the 22th paragraph of this section (sixth paragraph on the page),
change the sentence following "The command void TexImage2D ... a
two-dimensional texture image." through the rest of the paragraph
in the section describing two-dimensional texturing to read:

"<target> must be one of TEXTURE_2D for a two-dimensional texture,
or one of TEXTURE_RECTANGLE_ARB for a rectangle texture, or one
of TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X,
TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y,
TEXTURE_CUBE_MAP_POSITIVE_Z, or TEXTURE_CUBE_MAP_NEGATIVE_Z for a cube
map texture. Additionally, <target> may be either PROXY_TEXTURE_2D
for a two-dimensional proxy texture, PROXY_TEXTURE_RECTANGLE_ARB for
a rectangle proxy texture or PROXY_TEXTURE_CUBE_MAP for a cube map
proxy texture as discussed in section 3.8.10. The other parameters
match the corresponding parameters of TexImage3D."

Add this paragraph following the above two-dimensional texturing
introduction, reading:

When the target is TEXTURE_RECTANGLE_ARB, the INVALID_VALUE error is
generated if border is any value other than zero or the level is any
value other than zero. In the case of a rectangular texture, ws and
hs equal the specified width and height respectively of the
rectangular texture image while ds is 1."

If EXT_paletted_texture is supported, add this paragraph too:

"Rectangular textures do not support paletted formats. The error
INVALID_ENUM is generated if the target is TEXTURE_RECTANGLE_ARB or
PROXY_TEXTURE_RECTANGLE_ARB and the format is COLOR_INDEX or the
internal format is COLOR_INDEX or one of the COLOR_INDEX<n>_EXT
internal formats."

- (3.8.1, pg. 156) "Texture Image Specification"

Amend the fourth paragraph on the page to read:

"A two-dimensional texture consists of a single two-dimensional
texture image. A rectangle texture consists of a single 2D texture
image. A cube map texture is a set of six two-dimensional texture
images. The six cube map texture targets form a single cube map
texture though each target names a distinct face of the cube
map. The TEXTURE_CUBE_MAP_* targets listed above update their
appropriate cube map face 2D texture image. The six cube map
two-dimensional image tokens such as TEXTURE_CUBE_MAP_POSITIVE_X
are used when specifying, updating, or querying one of a cube map's
six two-dimensional images, but when enabling cube map texturing
or binding to a cube map texture object (that is when the cube map
is accessed as a whole as opposed to a particular two-dimensional
image), the TEXTURE_CUBE_MAP target is specified."

- (3.8.1, pg. 157) "Texture Image Specification"

Append to the end of the third to the last paragraph in the section:

"A rectangular texture array has depth ds=1, with height hs and
width ws defined by the specified image height and width
parameters."

- (3.8.2, pg. 159) "Alternate Texture Image Specification Commands"

Add TEXTURE_RECTANGLE_ARB to the target list of the second paragraph
of the section to say:

... "Currently, <target> must be TEXTURE_2D, TEXTURE_RECTANGLE_ARB,
TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X,
TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y,
TEXTURE_CUBE_MAP_POSITIVE_Z, or TEXTURE_CUBE_MAP_NEGATIVE_Z." ...

- (3.8.2, pg. 160) "Alternate Texture Image Specification Commands"

Add TEXTURE_RECTANGLE_ARB to the target list in the fifth paragraph
of the section to say:

... "Currently the target arguments of TexSubImage1D and
CopyTexSubImage1D must be TEXTURE_1D, the <target> arguments of
TexSubImage2D and CopyTexSubImage2D must be one of TEXTURE_2D,
TEXTURE_RECTANGLE_ARB, TEXTURE_CUBE_MAP_POSITIVE_X,
TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, or
TEXTURE_CUBE_MAP_NEGATIVE_Z, and the <target> arguments of
TexSubImage3D and CopyTexSubImage3D must be TEXTURE_3D." ...

Also append to the end of this paragraph:

"If target is TEXTURE_RECTANGLE_ARB and level is not zero, the error
INVALID_VALUE is generated."

- (3.8.3, pg. 164) "Compressed Texture Images"

Add the following paragraph after the second paragraph in the
section, which introduces the CompressedTexImage<n>D commands:

"The error INVALID_ENUM is generated if the target parameter to one
of the CompressedTexImage<n>D commands is TEXTURE_RECTANGLE_ARB or
PROXY_TEXTURE_RECTANGLE_ARB."

Add the following paragraph after introducing the
CompressedTexSubImage<n>D commands:

"The error INVALID_ENUM is generated if the target parameter to one
of the CompressedTexSubImage<n>D commands is TEXTURE_RECTANGLE_ARB
or PROXY_TEXTURE_RECTANGLE_ARB."

- (3.8.4, pg. 166) "Texture Parameters"

Add TEXTURE_RECTANGLE_ARB to paragraph one to say:

... "<target> is the target, either TEXTURE_1D, TEXTURE_2D,
TEXTURE_RECTANGLE_ARB, TEXTURE_3D, or TEXTURE_CUBE_MAP." ...

- (3.8.4, pg. 168) "Texture Parameters"

Add the following paragraph to the end of the section:

"Certain texture parameter values may not be specified for
textures with a target of TEXTURE_RECTANGLE_ARB. The error
INVALID_ENUM is generated if the target is TEXTURE_RECTANGLE_ARB
and the TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R
parameter is set to REPEAT, MIRRORED_REPEAT,
MIRROR_CLAMP_EXT (MIRROR_CLAMP_ATI), MIRROR_CLAMP_TO_EDGE_EXT
(MIRROR_CLAMP_TO_EDGE_ATI) or MIRROR_CLAMP_TO_BORDER_EXT. The error
INVALID_ENUM is generated if the target is TEXTURE_RECTANGLE_ARB
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_ARB
and TEXTURE_BASE_LEVEL is set to any value other than zero."

- (3.8.7, pg. 170) "Texture Wrap Modes"

Add this final additional paragraph:

"Texture coordinates are clamped differently for rectangular
textures. The r texture coordinate is wrapped as described above.
When the texture target is TEXTURE_RECTANGLE_ARB, the s and t
coordinates are wrapped as follows: CLAMP causes the s coordinate
to be clamped to the range [0, wt]. CLAMP causes the t coordinate
to be clamped to the range [0, ht]. CLAMP_TO_EDGE causes the s
coordinate to be clamped to the range [0.5, wt-0.5]. CLAMP_TO_EDGE
causes the t coordinate to be clamped to the range [0.5, ht - 0.5].
CLAMP_TO_BORDER causes the s coordinate to be clamped to the range
[-0.5, wt + 0.5]. CLAMP_TO_BORDER causes the t coordinate to be
clamped to the range [-0.5, ht + 0.5]."

- (3.8.8, pg. 171) "Texture Minification"

Under the "Scale Factor and Level of Detail" sub-section, change the
fourth paragraph in the subsection to read:

"Let s(x,y) be the function that associates an s texture coordinate
with each set of window coordinates (x,y) that lie within a primitive;
define t(x,y) and r(x,y) analogously. For non-rectangular textures,
let u(x,y) = wt * s(x,y), v(x,y) = ht * t(x,y), and w(x,y) = dt *
r(x,y), where wt, ht, and dt are as defined by equations 3.15,
3.16, and 3.17 with ws, hs, and ds equal to the width, height,
and depth of the image array whose level is level_base. However,
for rectangular textures let u(x, y) = s(x, y), v(x, y) = t(x, y),
and w(x, y) = r(x, y)."

- (3.8.8, pg. 173) "Texture Minification"

Update the last sentence in the first partial paragraph on the page
to read:

"Depending on whether the texture's target is rectangular or
non-rectangular, this means the texel at location (i,j,k) becomes
the texture value, with i given by

/ floor (u), s < 1 and non-rectangular texture
|
i = | wt - 1, s == 1 and non-rectangular texture (3.19)
|
| floor(u) s < wt and rectangular texture
|
\ wt-1 s >= wt and rectangular texture

(Recall that if TEXTURE_WRAP_S is REPEAT, then 0 <= s < 1.)
Similarly, j is found as

/ floor(v), t < 1 and non-rectangular texture
|
j = | ht - 1, t == 1 and non-rectangular texture (3.20)
|
| floor(v) t < ht and rectangular texture
|
\ ht-1 t >= ht and rectangular texture

and k is found as

/ floor (w), r < 1
k = | (3.21)
\ dt - 1, r == 1"

- (3.8.8, pg. 171) "Texture Minification"

Change the last sentence in the first partial paragraph on the page,
directly after equation 3.21 to read:

"For a two-dimensional or rectangular texture, k is irrelevant; the
texel at location (i,j) becomes the texture value."

- (3.8.8, pg. 174) "Texture Minification"

Change the sentence preceding equation 3.26:

"For a two-dimensional or rectangular texture,"

- (3.8.8, pg. 175) "Mipmapping"

Follow the paragraph on the page which ends with "... must be
defined, as discussed in section 3.8.10." with:

"Rectangular textures do not support mipmapping (it is an error to
specify a minification filter that requires mipmapping)."

- (3.8.11, pg. 178) "Texture State and Proxy State"

Change the first sentence of the first paragraph to say:

"The state necessary for texture can be divided into two categories.
First, there are the ten sets of mipmap arrays (one each for the
one-, two-, and three-dimensional texture targets, one for the
rectangular texture target (though the rectangular texture target
has only one mipmap level), and six for the cube map texture
targets) and their number." ...

- (3.8.11, pg. 179) "Texture State and Proxy State"

Change the sixth and fifth to last sentences of the first paragraph
to say:

"In the initial state, the value assigned to TEXTURE_MIN_FILTER is
NEAREST_MIPMAP_LINEAR, except for rectangular textures where the
initial value is LINEAR, and the value for TEXTURE_MAG_FILTER is
LINEAR. s, t, and r warp modes are all set to REPEAT, except for
rectangular textures where the initial value is CLAMP_TO_EDGE."

- (3.8.11, pg. 179) "Texture State and Proxy State"

Change the second paragraph of the section to say:

"In addition to the one-, two-, three-dimensional, rectangular, and
the six cube map sets of image arrays, the partially instantiated
one-, two-, and three-dimensional, rectangular, and one cube map
sets of proxy image arrays are maintained." ...

- (3.8.11, pg. 179) "Texture State and Proxy State"

Change the third paragraph to:

"One- and two-dimensional and rectangular proxy arrays are operated
on in the same way when TexImage1D is executed with target specified
as PROXY_TEXTURE_1D, or TexImage2D is executed with target specified
as PROXY_TEXTURE_2D or PROXY_TEXTURE_RECTANGLE_ARB."

- (3.8.11, pg. 180) "Texture State and Proxy State"

Change the second sentence of the fifth paragraph of the section to:

"Therefore PROXY_TEXTURE_1D, PROXY_TEXTURE_2D,
PROXY_TEXTURE_RECTANGLE_ARB, PROXY_TEXTURE_3D, and
PROXY_TEXTURE_CUBE_MAP cannot be used as textures, and their images
must never be queried using GetTexImage." ...

- (3.8.12, pg. 156) "Texture Objects"

Change the first sentence of the first paragraph to say:

"In addition to the default textures TEXTURE_1D, TEXTURE_2D,
TEXTURE_RECTANGLE_ARB, TEXTURE_3D, and TEXTURE_CUBE_MAP, named
one-dimensional, two-dimensional, rectangular, and three-dimensional
texture objects and cube map texture objects can be created and
operated on." ...

- (3.8.12, pg. 180) "Texture Objects"

Change the second paragraph in the section to say:

"A texture object is created by binding an unused name to
TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_ARB, TEXTURE_3D, or
TEXTURE_CUBE_MAP." ... "If the new texture object is bound to
TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_ARB, TEXTURE_3D, or
TEXTURE_CUBE_MAP, it remains a one-dimensional, two-dimensional,
rectangular, three-dimensional, or cube map texture until it is
deleted."

- (3.8.12, pg. 180) "Texture Objects"

Change the third paragraph to say:

"BindTexture may also be used to bind an existing texture object to
either TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_ARB, TEXTURE_3D, or
TEXTURE_CUBE_MAP."

- (3.8.12, pg. 180) "Texture Objects"

Change paragraph five of the section to say:

"In the initial state, TEXTURE_1D, TEXTURE_2D,
TEXTURE_RECTANGLE_ARB, TEXTURE_3D, and TEXTURE_CUBE_MAP have
one-dimensional, two-dimensional, rectangular, three-dimensional,
and cube map state vectors associated with them respectively." ...
"The initial, one-dimensional, two-dimensional, rectangular,
three-dimensional, and cube map texture is therefore operated upon,
queried, and applied as TEXTURE_1D, TEXTURE_2D,
TEXTURE_RECTANGLE_ARB, TEXTURE_3D, and TEXTURE_CUBE_MAP respectively
while 0 is bound to the corresponding targets."

- (3.8.12, pg. 181) "Texture Objects"

Change paragraph six of the section to say:

... "If a texture that is currently bound to one of the targets
TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_ARB, TEXTURE_3D, or
TEXTURE_CUBE_MAP is deleted, it is as though BindTexture has been
executed with the same <target> and <texture> zero." ...

- (3.8.15 pg. 189) "Texture Application"

Replace the beginning sentences of the first paragraph with:

"Texturing is enabled or disabled using the generic Enable and
Disable commands, respectively, with the symbolic constants
TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_ARB, TEXTURE_3D, or
TEXTURE_CUBE_MAP to enable the one-dimensional, two-dimensional,
rectangular, three-dimensional, or cube map texturing respectively.
If both two- and one-dimensional textures are enabled, the
two-dimensional texture is used. If the rectangular and either of
the two- or one-dimensional textures is enabled, the rectangular
texture is used. If the three-dimensional and any of the
rectangular, two-dimensional, or one-dimensional textures is
enabled, the three-dimensional texture is used. If the cube map
texture and any of the three-dimensional, rectangular,
two-dimensional, or one-dimensional textures is enabled, then cube
map texturing is used.

- (3.11.2, pg. 195) "Texture Access" under "Shader Execution"

Replace the three bullets with the following language:

"...the results of a texture lookup are undefined if:

* The sampler used in a texture lookup function is of type
sampler1D or sampler2D or sampler2DRect, and the texture object's
internal format is DEPTH_COMPONENT, and the TEXTURE_COMPARE_MODE
is not NONE.

* The sampler used in a texture lookup function is of type
sampler1DShadow or sampler2DShadow or sampler2DRectShadow,
and the texture object's internal format is DEPTH_COMPONENT,
and the TEXTURE_COMPARE_MODE is NONE.

* The sampler used in a texture lookup function is of type
sampler1DShadow or sampler2DShadow or sampler2DRectShadow,
and the texture object's internal format is not DEPTH_COMPONENT."

Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment Operations and the Framebuffer)


    None

Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)


  - (5.4, pg. 242) "Display Lists"

In the third to last paragraph of the section, add
PROXY_TEXTURE_RECTANGLE_ARB to the list of PROXY_* tokens.

Additions to Chapter 6 of the OpenGL 2.0 Specification (State and State Requests)


  - (6.1.3, pg. 247) "Enumerated Queries"

Change the fourth paragraph to say:

"The GetTexParameter parameter <target> may be one of TEXTURE_1D,
TEXTURE_2D, TEXTURE_RECTANGLE_ARB, TEXTURE_3D, or TEXTURE_CUBE_MAP,
indicating the currently bound one-dimensional, two-dimensional,
rectangular, three-dimensional, or cube map texture object. For
GetTexLevelParameter, <target> may be one of TEXTURE_1D, TEXTURE_2D,
TEXTURE_RECTANGLE_ARB, TEXTURE_3D, TEXTURE_CUBE_MAP_POSITIVE_X,
TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z,
TEXTURE_CUBE_MAP_NEGATIVE_Z, PROXY_TEXTURE_1D, PROXY_TEXTURE_2D,
PROXY_TEXTURE_RECTANGLE_ARB, PROXY_TEXTURE_3D, or
PROXY_TEXTURE_CUBE_MAP, indicating the one-dimensional texture
object, two-dimensional texture object, rectangular texture object,
three-dimensional texture object, or one of the six distinct 2D
images making up the cube map texture object or one-dimensional,
two-dimensional, rectangular, three-dimensional, or cube map proxy
state vector. Note that TEXTURE_CUBE_MAP is not a valid <target>
parameter for GetTexLevelParameter because it does not specify a
particular cube map face."

- (6.1.4, pg. 248) "Texture Queries"

Change the first paragraph to read:

... "It is somewhat different from the other get commands; <tex> is
a symbolic value indicating which texture (or texture face in the
case of a cube map texture target name) is to be obtained.
TEXTURE_1D indicates a one-dimensional texture, TEXTURE_2D indicates
a two-dimensional texture, TEXTURE_RECTANGLE_ARB indicates a
rectangular texture, TEXTURE_3D indicates a three-dimensional
texture, and TEXTURE_CUBE_MAP_POSITIVE_X,
TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, and
TEXTURE_CUBE_MAP_NEGATIVE_Z indicate the respective face of a cube
map texture."

- (6.1.4, pg. 249) "Texture Queries"

Add a final sentence to the fourth paragraph of the section,
immediately after ... "or DEPTH COMPONENT causes the error INVALID
ENUM.":

"Calling GetTexImage with a lod not zero when the tex is
TEXTURE_RECTANGLE_ARB causes the error INVALID_VALUE."

Additions to version 1.10.59 of the OpenGL Shading Language specification


    A new preprocessor #define is added to the OpenGL Shading Language:

#define GL_ARB_texture_rectangle 1

Change the second to last paragraph on page 12 (#extension directive):

The initial state of the compiler is as if the directive

#extension all : disable

was issued, telling the compiler that all error and warning reporting
must be done according to this specification, ignoring any extensions.
The only execption to this rule is the GL_ARB_texture_rectangle
extension. If the string "GL_ARB_texture_rectangle" is present in the
EXTENSIONS string, as queried with GetString(), then the compiler will
behave as if

#extension GL_ARB_texture_rectangle : require

is present in the shader.

Add the following (previously reserved) keywords to the first part of
section 3.6 on page 14:

sampler2DRect
sampler2DRectShadow

Add to section 8.7 "Texture Lookup Functions"

Syntax:

vec4 texture2DRect(sampler2DRect sampler, vec2 coord)
vec4 texture2DRectProj(sampler2DRect sampler, vec3 coord)
vec4 texture2DRectProj(sampler2DRect sampler, vec4 coord)

Description:

"Use the texture coordinate coord to do a texture lookup in the
rectangle texture currently bound to sampler. For the projective
("Proj") version, the texture coordinate (coord.s, coord.t) is
divided by the last component of coord. The third component of
coord is ignored for the vec4 coord variant.

No "bias" parameter or "Lod" suffixed functions for rectangle
textures are supported because mipmaps are not allowed for
rectangular textures."

Syntax:

vec4 shadow2DRect(sampler2DRectShadow sampler, vec3 coord)
vec4 shadow2DRectProj(sampler2DRectShadow sampler, vec4 coord)

Description

"Use texture coordinate coord to do a depth comparison lookup on
the rectangular depth texture bound to sampler, as described in
section 3.8.14 of version 2.0 of the OpenGL specification. The 3rd
component of coord (coord.p) is used as the R value. The texture
bound to sampler must be a depth texture, or results are undefined.
For the projective version ("Proj"), the texture coordinate
(coord.s, coord.t, coord.p) is divided by the last component of
coord, giving a R value of coord.p / coord.q.

No "bias" parameter or "Lod" suffixed functions for rectangle
textures are supported because mipmaps are not allowed for
rectangle textures."

Additions to the GLX Specification


    None

GLX Protocol


    None

Dependencies on OpenGL 1.4 and ARB_texture_mirrored_repeat


    If OpenGL 1.4 (or ARB_mirrored_repeat) is not supported, references
to the MIRRORED_REPEAT (or MIRRORED_REPEAT_ARB) wrap mode in this
document should be ignored.

Dependencies on ATI_texture_mirror_once


    If ATI_texture_mirror_once is not supported, references to the
MIRROR_CLAMP_ATI and MIRROR_CLAMP_TO_EDGE_ATI wrap modes in this
document should be ignored.

Dependencies on EXT_paletted_texture


    If EXT_paletted_texture is not supported, references to the
COLOR_INDEX, COLOR_INDEX<n>_EXT, ColorTable, and ColorTableEXT
should be ignored.

Dependencies on EXT_texture_compression_s3tc


    If EXT_texture_compression_s3tc is not supported, references
to CompressedTexImage2D and CompressedTexSubImageARB and the
COMPRESSED_*_S3TC_DXT*_EXT enumerants should be ignored.

Dependencies on EXT_texture_mirror_clamp


    If EXT_texture_mirror_clamp is not supported, references to the
MIRROR_CLAMP_EXT, MIRROR_CLAMP_TO_EDGE_EXT, and
MIRROR_CLAMP_TO_BORDER_EXT wrap modes in this document should be
ignored.

Errors


    INVALID_ENUM is generated when ColorTable (or ColorTableEXT or the
various ColorTable and ColorTableEXT alternative commands) is called
and the target is TEXTURE_RECTANGLE_ARB or
PROXY_TEXTURE_RECTANGLE_ARB.

INVALID_ENUM is generated when TexImage2D is called and the target
is TEXTURE_RECTANGLE_ARB or PROXY_TEXTURE_RECTANGLE_ARB and the
format is COLOR_INDEX or the internalformat is COLOR_INDEX or one of
the COLOR_INDEX<n>_EXT internal formats.

INVALID_VALUE is generated when TexImage2D is called when the target
is TEXTURE_RECTANGLE_ARB if border is any value other than zero or
the level is any value other than zero.

INVALID_VALUE is generated when TexImage2D is called when the target
is TEXTURE_RECTANGLE_ARB if the width is less than zero or the
height is less than zero.

INVALID_VALUE is generated when TexSubImage2D or CopyTexSubImage2D
is called when the target is TEXTURE_RECTANGLE_ARB if the level is
any value other than zero.

INVALID_ENUM is generated when one of the CompressedTexImage<n>D
commands is called when the target parameter is
TEXTURE_RECTANGLE_ARB or PROXY_TEXTURE_RECTANGLE_ARB.

INVALID_ENUM is generated when one of the CompressedTexSubImage<n>D
commands is called when the target parameter is TEXTURE_RECTANGLE_ARB
or PROXY_TEXTURE_RECTANGLE_ARB.

INVALID_ENUM is generated when TexParameter is called with a target
of TEXTURE_RECTANGLE_ARB and the TEXTURE_WRAP_S, TEXTURE_WRAP_T,
or TEXTURE_WRAP_R parameter is set to REPEAT, MIRRORED_REPEAT,
MIRROR_CLAMP_ATI, or MIRROR_CLAMP_TO_EDGE_ATI.

INVALID_ENUM is generated when TexParameter is called with a target
of TEXTURE_RECTANGLE_ARB and the TEXTURE_MIN_FILTER is set to a
value other than NEAREST or LINEAR.

INVALID_VALUE is generated when TexParameter is called with a target
of TEXTURE_RECTANGLE_ARB and the TEXTURE_BASE_LEVEL is set to any
value other than zero.

INVALID_VALUE is generated when GetTexImage is called with a lod not
zero when the tex is TEXTURE_RECTANGLE_ARB.

New State


  - (Table 6.15, Texture Objects, pg. 241) amend/add the following entries:

Get Value Type Get Command Initial Value Description Sec Attribute
----------------------------- ------- ----------- ------------- --------------------- ------ --------------
TEXTURE_RECTANGLE_ARB 2* x B IsEnabled False True if rectangular 3.8.15 texture/enable
texturing is enabled

TEXTURE_BINDING_RECTANGLE_ARB 2* x Z+ GetIntegerv 0 Texture object 3.8.11 texture
for texture rectangle

TEXTURE_RECTANGLE_ARB n x I GetTexImage see 3.8 rectangular texture 3.8 -
image for lod 0


- (Table 6.16, Texture Objects (cont.), pg. 242) amend/add the following entries:

Get Value Type Get Command Initial Value Description Sec Attribute
------------------ ----- -------------- -------------- ------------------- ----- --------------
TEXTURE_MIN_FILTER n x Z6 GetTexParameter See 3.8 except Texture minification 3.8.8 texture
for rectangular function
which is
LINEAR

TEXTURE_WRAP_S n x Z5 GetTexParameter REPEAT except Texture wrap mode S 3.8.7 texture
for rectangular
which is
CLAMP_TO_EDGE

TEXTURE_WRAP_T n x Z5 GetTexParameter REPEAT except Texture wrap mode T 3.8.7 texture
for rectangular (2D, 3D, cubemap,
which is rectangle textures
CLAMP_TO_EDGE only)

TEXTURE_WRAP_R n x Z5 GetTexParameter REPEAT except Texture wrap mode R 3.8.7 texture
for rectangular (3D textures only)
which is
CLAMP_TO_EDGE

New Implementation Dependent State


  - (Table 6.28, Implementation Dependent Values, pg. 254) add the following entry:

Get Value Type Get Command Minimum Value Description Sec Attribute
-------- ---- ----------- ------------- ----------- ----- --------------
MAX_RECTANGLE_TEXTURE_SIZE_ARB Z+ GetIntegerv 64 Maximum rectangular 3.8.1 -
texture image
dimension

Backwards Compatibility


    This extension is semantically equivalent to EXT_texture_rectangle
and NV_texture_rectangle. The tokens, and name strings now refer
to ARB instead of EXT or NV. Enumerant values are unchanged.

Revision History


    3/5/2004 - Updated page numbers and other numbers to reflect OpenGL
1.5; removed bogus "Convolution" language saying how glGetTexImage
applies convolution (language was in 1.2.1 but removed in 1.3).
ARB_texture_non_power_of_two and EXT_texture_mirror_clamp interactions
added.

2/23/2005 - Fix the GLSL interaction: 1) GLSL functions require
a vector (not scalar) parameter for the texture coordinate set: 2)
The actual reserved types are sampler2DRect and sampler2DRectShadow
(not samplerRect and samplerRectShadow); and 3) the shadow functions
were missing.

7/8/2005 - Further fixes to GLSL interaction based on ARB meeting
discussion: 1) Add OpenGL 2.0 language interaction for when
shadow accesses are defined for rectangle textures; 2) add an
issue to document the discussion; 3) bumped revision to 1.1; 4)
documented GLSL preprocessor define; 5) documented sampler enums;
and generally update the specification page numbers to be written
against OpenGL 2.0. Also added to the contributors list.

7/15/2005 - This is revision 1.2.
1) Allow loading of DEPTH_COMPENENT textures for rectangular
texture targets. 2) Switched some of the paramters ws, hs, ds for wt, ht,
dt, and vice-versa to be in line with the cleanup already done in the
OpenGL 2.0 specification. 3) Added issue 18. 4) Deleted the 'dependencies
on ARB_texture_non_power_of_two' section since that is core OpenGL
2.0 functionality. 5) Removed some redundant language. 6) Added language
describing changes to the GLSL spec explaining the #extension behavior.
7) Added to the contributors list and sorted it by last name.

10/4/2005 - Revision 1.21 - Whitespace cleanup

Implementation Support


   List of OpenGL implementations supporting the GL_ARB_texture_rectangle extension

Original File


   Original text file for the GL_ARB_texture_rectangle extension


Page generated on Sun Nov 20 18:37:08 2005