blob: ef892fc8108561b2fc67798526f2bafefeadebbb [file] [log] [blame]
Name
EXT_texture_border_clamp
Name Strings
GL_EXT_texture_border_clamp
Contact
Daniel Koch, NVIDIA (dkoch 'at' nvidia 'dot' com)
Contributors
Jussi Rasanen, NVIDIA
Greg Roth, NVIDIA
Dominik Witczak, Mobica
Graham Connor, Imagination
Ben Bowman, Imagination
Jonathan Putsman, Imagination
Maurice Ribble, Qualcomm
Status
Complete.
Version
Date: April 23, 2014
Revision: 6
Number
OpenGL ES Extension #182
Dependencies
OpenGL ES 2.0 is required.
This extension is written against the OpenGL ES 3.0.2
specification.
OpenGL ES 3.0 affects the definition of this extension.
OES_texture_3D affects the definition of this extension.
EXT_texture_compression_s3tc trivially affects the definition
of this extension.
KHR_texture_compression_astc_{ldr,hdr} trivially affect the
definition of this extension.
Overview
OpenGL ES provides only a single clamping wrap mode: CLAMP_TO_EDGE.
However, the ability to clamp to a constant border color can be
useful to quickly detect texture coordinates that exceed their
expected limits or to dummy out any such accesses with transparency
or a neutral color in tiling or light maps.
This extension defines an additional texture clamping algorithm.
CLAMP_TO_BORDER_EXT clamps texture coordinates at all mipmap levels
such that NEAREST and LINEAR filters of clamped coordinates return
only the constant border color. This does not add the ability for
textures to specify borders using glTexImage2D, but only to clamp
to a constant border value set using glTexParameter and
glSamplerParameter.
New Procedures and Functions
void TexParameterIivEXT(enum target, enum pname, const int *params);
void TexParameterIuivEXT(enum target, enum pname, const uint *params);
void GetTexParameterIivEXT(enum target, enum pname, int *params);
void GetTexParameterIuivEXT(enum target, enum pname, uint *params);
void SamplerParameterIivEXT(uint sampler, enum pname, const int *params);
void SamplerParameterIuivEXT(uint sampler, enum pname, const uint *params);
void GetSamplerParameterIivEXT(uint sampler, enum pname, int *params);
void GetSamplerParameterIuivEXT(uint sampler, enum pname, uint *params);
New Tokens
Accepted by the <pname> parameter of TexParameteriv, TexParameterfv,
SamplerParameteriv, SamplerParameterfv, TexParameterIivEXT,
TexParameterIuivEXT, SamplerParameterIivEXT, SamplerParameterIuivEXT,
GetTexParameteriv, GetTexParameterfv, GetTexParameterIivEXT,
GetTexParameterIuivEXT, GetSamplerParameteriv, GetSamplerParameterfv,
GetSamplerParameterIivEXT, and GetSamplerParameterIuivEXT:
TEXTURE_BORDER_COLOR_EXT 0x1004
Accepted by the <param> parameter of TexParameteri, TexParameterf,
SamplerParameteri and SamplerParameterf, and by the <params> parameter of
TexParameteriv, TexParameterfv, TexParameterIivEXT, TexParameterIuivEXT,
SamplerParameterIivEXT, SamplerParameterIuivEXT and returned by the
<params> parameter of GetTexParameteriv, GetTexParameterfv,
GetTexParameterIivEXT, GetTexParameterIuivEXT, GetSamplerParameteriv,
GetSamplerParameterfv, GetSamplerParameterIivEXT, and
GetSamplerParameterIuivEXT when their <pname> parameter
is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R:
CLAMP_TO_BORDER_EXT 0x812D
Note that the {Get}TexParameterI{i ui}vEXT and
{Get}SamplerParameterI{i ui}vEXT functions also accept all the
same parameters and values as are accepted by the existing
{Get}TexParameter{if}v and {Get}SamplerParameter{if}v commands,
respectively.
Additions to Chapter 3 of the OpenGL ES 3.0.2 Specification
(Rasterization)
Modifications to Section 3.8.2 "Sampler Objects"
Add the following to the list of SamplerParameter commands (p.123):
void SamplerParameterI{i ui}vEXT(uint sampler, enum pname,
const T *params);
Modify the last sentence of the description of the commands to state:
"In the first form of the command, <param> is a value to which to
set a single-valued parameter; in the remaining forms, <params> is an
array of parameters whose type depends on the parameter being set."
Replace the last sentence of the 3rd paragraph on p.123 (beginning with
"The values accepted in the <pname> parameter..." with the following:
"<pname> must be one of the sampler state names in Table 6.10, otherwise
an INVALID_ENUM error is generated. An INVALID_ENUM error is generated
if SamplerParameter{if} is called for a non-scalar parameter
(TEXTURE_BORDER_COLOR_EXT)."
Replace the 4th paragraph on p.123 (beginning with "Data conversions...")
with the following:
"Data conversions are performed as specified in section 2.3.1, except
that if the values for TEXTURE_BORDER_COLOR_EXT are specified with
a call to SamplerParameterIiv or SamplerParameterIuiv, the values are
unmodified and stored with an internal data type of integer. If specified
with SamplerParameteriv, they are converted to floating point using
equation 2.2. Otherwise, border color values are unmodified and stored
as floating-point."
Modifications to Section 3.8.6 "Compressed Texture Images"
Add column to Table 3.16 with heading "Border Type" fill in the
values as follows:
"unorm" for the following compressed internal formats:
COMPRESSED_R11_EAC, COMPRESSED_RG11_EAC, COMPRESSED_RGB8_ETC2,
COMPRESSED_SRGB8_ETC2, COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, COMPRESSED_RGBA8_ETC2_EAC,
COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT,
COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT,
COMPRESSED_RGBA_ASTC_*_KHR, COMPRESSED_SRGB8_ALPHA8_ASTC_*_KHR
"snorm" for the following compressed internal formats:
COMPRESSED_SIGNED_R11_EAC, COMPRESSED_SIGNED_RG11_EAC
"float" for the following compressed internal formats:
(currently none -- to be added by any extension adding BPTC support)
Add the following to the table caption:
"The 'Border Type' field determines how border colors are clamped as
described in section 3.8.10."
Modifications to Section 3.8.7 "Texture Parameters"
Add the following to the list of TexParameter commands (p.223):
void TexParameterI{i ui}vEXT(enum target, enum pname,
const T *params);
Modify the last sentence of the description of the commands to state:
"In the first form of the command, <param> is a value to which to
set a single-valued parameter; in the remaining forms, <params> is an
array of parameters whose type depends on the parameter being set."
Add a new paragraph at the end of p.145 after the paragraph about data
conversions:
"In addition, if the values for TEXTURE_BORDER_COLOR_EXT are specified
with TexParameterIiv or TexParameterIuiv, the values are unmodified and
stored with an internal data type of integer or unsigned integer,
respectively. If specified with TexParameteriv, they are converted to
floating-point using equation 2.2. Otherwise, the values are unmodified
and stored as floating-point. An INVALID_ENUM error is generated if
TexParameter{if} is called for a non-scalar parameters
(TEXTURE_BORDER_COLOR_EXT)."
Modify Table 3.17, edit the following rows (adding
CLAMP_TO_BORDER_EXT to each of the wrap modes):
Name Type Legal Values
============== ==== ====================
TEXTURE_WRAP_S enum CLAMP_TO_EDGE, REPEAT, MIRRORED_REPEAT,
CLAMP_TO_BORDER_EXT
TEXTURE_WRAP_T enum CLAMP_TO_EDGE, REPEAT, MIRRORED_REPEAT,
CLAMP_TO_BORDER_EXT
TEXTURE_WRAP_R enum CLAMP_TO_EDGE, REPEAT, MIRRORED_REPEAT,
CLAMP_TO_BORDER_EXT
and add the following row:
Name Type Legal Values
============== ======== ====================
TEXTURE_BORDER_COLOR_EXT 4 floats, any 4 values
ints, or
uints
Modifications to Section 3.8.9 "Cube Map Texture Selection"
In the "Seamless Cube Map Filtering" subsection change the rule
about LINEAR filtering to state:
"* If LINEAR filtering is done within a miplevel, always apply
wrap mode CLAMP_TO_BORDER_EXT. Then, ..."
Modifications to Section 3.8.10 "Texture Minification"
Modify Table 3.19, edit the cell that says:
"border clamping (used only for cube maps with LINEAR filter)"
and replace it with "CLAMP_TO_BORDER_EXT".
In the subsection "Coordinate Wrapping and Texel Selection"
add the following text at the end of the description for when
TEXTURE_MIN_FILTER is NEAREST:
"If the selected (i,j,k), (i,j) or i location refers to a border texel
that satisfies any of the conditions:
i < 0, j < 0, k < 0, i >= w_t, j >= h_t, k >= d_t
then the border values defined by TEXTURE_BORDER_COLOR_EXT are used
in place of the non-existent texel. If the texture contains color
components, the values of TEXTURE_BORDER_COLOR_EXT are interpreted
as an RGBA color to match the texture's internal format in a manner
consistent with table 3.11. The internal data type of the border
colors must be consistent with the type returned by the texture as
described in chapter 3, or the result is undefined. Border values are
clamped before they are used, according to the format in which the
texture components are stored. For signed and unsigned normalized
fixed-point formats, border values are clamped to [-1,1] and [0,1]
respectively. For floating-point and integer formats, border values
are clamped to the representable range of the format. For compressed
formats, border values are clamped as signed normalized ("snorm"),
unsigned normalized ("unorm"), or floating-point as described in
Table 3.16 for each format. If the texture contains depth components,
the first component of TEXTURE_BORDER_COLOR_EXT is interpreted as a
depth value."
Add the following text at the end of the description for when
TEXTURE_MIN_FILTER is LINEAR:
"For any texel in the equation above that refers to a border texel
outside the defined range of the image, the texel value is taken
from the texture border color as with NEAREST filtering."
Modifications to Section 3.7.14 "Texture state"
Modify the second paragraph as follows:
"Next, there are four sets of texture properties... Each set consists
of the selected minification and magnification filters, the wrap modes
for s, t, r (three-dimensional only), the TEXTURE_BORDER_COLOR_EXT,
two floating-point numbers ... In the initial state, ... wrap modes
are set to REPEAT, and the value of TEXTURE_BORDER_COLOR_EXT is
(0,0,0,0). ..."
Additions to Chapter 6 of the OpenGL ES 3.0.2 Specification
(State and State Requests)
Modifications to Section 6.1.3 "Enumerated Queries"
Add the following command in a list with GetTexParameter{if}v:
void GetTexParameterI{i ui}v(enum target, enum pname, T *data);
Append the following to the description of the GetTexParameter* commands:
"Querying <pname> TEXTURE_BORDER_COLOR_EXT with GetTexParameterIiv or
GetTexParameterIuiv returns the border color values as signed integers
or unsigned integers, respectively; otherwise the values are returned
as described in section 6.1.2. If the border color is queried with a
type that does not match the original type with which it was specified,
the result is undefined."
Modifications to Section 6.1.5 "Sampler Queries"
Add the following command in a list with GetSamplerParameter{if}v:
void GetSamplerParameterI{i ui}v(uint sampler, enum pname, T *params);
Append the following to the description of the GetSamplerParameter*
commands:
"Querying TEXTURE_BORDER_COLOR_EXT with GetSamplerParameterIiv or
GetSamplerParameterIuiv returns the border color values as signed integers
or unsigned integers, respectively; otherwise the values are returned
as described in section 6.1.2. If the border color is queried with a
type that does not match the original type with which it was specified,
the result is undefined."
Errors
An INVALID_ENUM error is generated if TexParameter{if} is called for
a non-scalar parameter (TEXTURE_BORDER_COLOR_EXT).
An INVALID_ENUM error is generated by TexParameterI*v if
<target> is not one of the valid types of texture targets accepted
by TexParameter{if}v.
An INVALID_ENUM error is generated by TexParameterI*v if <pname>
is not one of the values listed in Table 3.17.
An INVALID_ENUM error is generated by TexParameterI*v if the type
of the parameter specified by <pname> is enum, and the value(s)
specified by <params> is not among the legal values shown in
Table 3.17.
An INVALID_ENUM error is generated by GetTexParameterI*v if
<target> is not one of the valid types of texture targets accepted
by GetTexParameter{if}v.
An INVALID_ENUM error is generated by GetTexParameterI*v if
<pname> is not one of values accepted by GetTexParameter{if}v.
An INVALID_ENUM error is generated if SamplerParameter{if} is called
for a non-scalar parameter (TEXTURE_BORDER_COLOR_EXT).
An INVALID_OPERATION error is generated by SamplerParameterI*v
if <sampler> is not the name of a sampler object previously returned
from a call to GenSamplers.
An INVALID_ENUM error is generated by SamplerParameterI*v if
<pname> is not the name of a parameter accepted by SamplerParameter*.
An INVALID_OPERATION error is generated by GetSamplerParameterI*v
if <sampler> is not the name of a sampler object previously returned
from a call to GenSamplers.
An INVALID_ENUM error is generated by GetSamplerParameterI*v if
<pname> is not the name of a parameter accepted by GetSamplerParameter*.
New State
Modify table 6.10:
Change the type information changes for these parameters.
Initial
Get Value Type Get Command Value Description Sec.
--------- ------ ----------- ------- ----------- ----
TEXTURE_WRAP_S n x Z4 GetSamplerParameter (as before...)
TEXTURE_WRAP_T n x Z4 GetSamplerParameter (as before...)
TEXTURE_WRAP_R n x Z4 GetSamplerParameter (as before...)
Add the following parameter:
Get Value Type Get Command Value Description Sec.
--------- ------ ----------- ------- ----------- ----
TEXTURE_BORDER_COLOR_EXT 4 x C GetSamplerParameter 0.0,0.0,0.0,0.0 border color 3.8
Dependencies on OpenGL ES 3.0
If OpenGL ES 3.0 is not supported, but OES_texture_3D is supported,
replace references to TEXTURE_WRAP_R with TEXTURE_WRAP_R_OES.
If OpenGL ES 3.0 is not supported, delete all references to the
TexParameterI*, GetTexParameterI*, SamplerParameterI*, and
GetSamplerParameterI* entry points and all related text about
signed and unsigned integer textures.
Dependencies on OES_texture_3D
If neither OpenGL ES 3.0 nor OES_texture_3D is supported, ignore all
references to three-dimensional textures and the token TEXTURE_WRAP_R
as well as any reference to r wrap modes. References to (i,j,k), k,
and d_t in section 3.8.10 should also be removed.
Dependencies on EXT_texture_compression_s3tc
If EXT_texture_compression is not supported, ignore all references to
S3TC compressed textures.
Dependencies on KHR_texture_compression_astc_{ldr,hdr}
If none of the KHR_texture_compression_astc extensions are supported,
ignore all references to ASTC compressed textures.
Issues
(1) Which is the correct equation to use for converting
TEXTURE_BORDER_COLOR_EXT when specified via SamplerParameteriv
or TexParameteriv?
RESOLVED: Early versions of GL 4.4 referenced both equations 2.1 and 2.2.
As per clarification in Bug 11185, the correct answer is equation 2.2.
(2) Does SamplerParmeter{if} set an error if called with
a non-scalar parameter?
RESOLVED: Yes. This should be analogous to TexParameteriv.
This error seems to be missing from GL 4.4. Filed bug 11186
to get this rectified.
(3) Should the second argument to GetTexParameterI* be <value> or <pname>?
RESOLVED: the GL specs call it <value>, but the headers call it <pname>.
The GetSamplerParameterI* version calls it <pname>, so we are doing the
same here for consistency. This was corrected in OpenGL ES 3.1.
Revision History
Rev. Date Author Changes
---- ---------- --------- -------------------------------------
6 23-04-2014 dkoch Fix various typos (Bug 12132).
5 13-03-2014 dkoch Update contributors.
4 10-03-2014 Jon Leech Change suffix to EXT.
3 13-01-2014 dkoch Fixed a number of types. Issue 3.
2 07-11-2013 dkoch Resolved issue 1. Corrected equation.
1 04-11-2013 dkoch Initial draft based on NV_texture_border_clamp
and OpenGL 4.4.