Name
EXT_shader_texture_lod
Name Strings
GL_EXT_shader_texture_lod
Contributors
Benj Lipchak
Ben Bowman
and contributors to the ARB_shader_texture_lod spec,
which provided the basis for this spec.
Contact
Benj Lipchak, Apple (lipchak 'at' apple.com)
IP Status
No known IP issues.
Status
Draft
Version
Last Modified Date: February 24, 2011
Revision: 3
Number
OpenGL ES Extension #77
Dependencies
This extension is written against the OpenGL ES 2.0 Specification.
This extension is written against The OpenGL ES Shading Language,
Language Version 1.00, Document Revision 17.
This extension interacts with EXT_texture_filter_anisotropic.
Overview
This extension adds additional texture functions to the
OpenGL ES Shading Language which provide the shader writer
with explicit control of LOD.
Mipmap texture fetches and anisotropic texture fetches
require implicit derivatives to calculate rho, lambda
and/or the line of anisotropy. These implicit derivatives
will be undefined for texture fetches occurring inside
non-uniform control flow or for vertex shader texture
fetches, resulting in undefined texels.
The additional texture functions introduced with
this extension provide explicit control of LOD
(isotropic texture functions) or provide explicit
derivatives (anisotropic texture functions).
Anisotropic texture functions return defined texels
for mipmap texture fetches or anisotropic texture fetches,
even inside non-uniform control flow. Isotropic texture
functions return defined texels for mipmap texture fetches,
even inside non-uniform control flow. However, isotropic
texture functions return undefined texels for anisotropic
texture fetches.
The existing isotropic vertex texture functions:
vec4 texture2DLodEXT(sampler2D sampler,
vec2 coord,
float lod);
vec4 texture2DProjLodEXT(sampler2D sampler,
vec3 coord,
float lod);
vec4 texture2DProjLodEXT(sampler2D sampler,
vec4 coord,
float lod);
vec4 textureCubeLodEXT(samplerCube sampler,
vec3 coord,
float lod);
are added to the built-in functions for fragment shaders
with "EXT" suffix appended.
New anisotropic texture functions, providing explicit
derivatives:
vec4 texture2DGradEXT(sampler2D sampler,
vec2 P,
vec2 dPdx,
vec2 dPdy);
vec4 texture2DProjGradEXT(sampler2D sampler,
vec3 P,
vec2 dPdx,
vec2 dPdy);
vec4 texture2DProjGradEXT(sampler2D sampler,
vec4 P,
vec2 dPdx,
vec2 dPdy);
vec4 textureCubeGradEXT(samplerCube sampler,
vec3 P,
vec3 dPdx,
vec3 dPdy);
are added to the built-in functions for vertex shaders
and fragment shaders.
New Procedures and Functions
None
New Tokens
None
Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)
None
Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)
In Section 3.7.7, replace the final paragraph on p. 76 with:
"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) analogously. Let u(x, y) = wt * s(x, y) and
v(x, y) = ht * t(x, y), where wt and ht are equal to the width and height
of the level zero array.
Let
dUdx = wt*dSdx; dUdy = wt*dSdy;
dVdx = ht*dTdx; dVdy = ht*dTdy; (3.12a)
where dSdx indicates the derivative of s with respect to window x,
and similarly for dTdx.
For a polygon, rho is given at a fragment with window coordinates
(x, y) by
rho = max (
sqrt(dUdx*dUdx + dVdx*dVdx),
sqrt(dUdy*dUdy + dVdy*dVdy)
); (3.12b)"
Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment Operations and the Frame Buffer)
None
Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions)
None
Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State
Requests)
None
Additions to Appendix A of the OpenGL ES 2.0 Specification (Invariance)
None
Additions to version 1.00.17 of the OpenGL ES Shading Language Specification
"A new preprocessor #define is added to the OpenGL Shading Language:
#define GL_EXT_shader_texture_lod 1
Including the following line in a shader can be used to control the
language features described in this extension:
#extension GL_EXT_shader_texture_lod :
Where is as specified in section 3.3."
Additions to Chapter 8 of version 1.00.17 of the OpenGL ES Shading Language
Specification
8.7 Texture Lookup Functions
Delete the last paragraph, and replace with:
"For the "Lod" functions, lod specifies lambda_base (see equation 3.11 in
The OpenGL ES 2.0 Specification) and specifies dSdx, dTdx = 0 and
dSdy, dTdy = 0 (see equation 3.12a in The OpenGL ES 2.0 Specification).
The "Lod" functions are allowed in a vertex shader. If enabled by the
preprocessor directive #extension, the "Lod" functions are also allowed in
a fragment shader.
For the "Grad" functions, dPdx is the explicit derivative of P with respect
to window x, and similarly dPdy with respect to window y. For the "ProjGrad"
functions, dPdx is the explicit derivative of the projected P with respect
to window x, and similarly for dPdy with respect to window y. For a two-
dimensional texture, dPdx and dPdy are vec2. For a cube map texture,
dPdx and dPdy are vec3.
Let
dSdx = dPdx.s;
dSdy = dPdy.s;
dTdx = dPdx.t;
dTdy = dPdy.t;
and
/ 0.0; for two-dimensional texture
dRdx = (
\ dPdx.p; for cube map texture
/ 0.0; for two-dimensional texture
dRdy = (
\ dPdy.p; for cube map texture
(See equation 3.12a in The OpenGL ES 2.0 Specification.)
If enabled by the preprocessor directive #extension, the "Grad" functions
are allowed in vertex and fragment shaders.
All other texture functions may require implicit derivatives. Implicit
derivatives are undefined within non-uniform control flow or for vertex
shader texture fetches."
Add the following entries to the texture function table:
vec4 texture2DGradEXT(sampler2D sampler,
vec2 P,
vec2 dPdx,
vec2 dPdy);
vec4 texture2DProjGradEXT(sampler2D sampler,
vec3 P,
vec2 dPdx,
vec2 dPdy);
vec4 texture2DProjGradEXT(sampler2D sampler,
vec4 P,
vec2 dPdx,
vec2 dPdy);
vec4 textureCubeGradEXT(samplerCube sampler,
vec3 P,
vec3 dPdx,
vec3 dPdy);
Interactions with EXT_texture_anisotropic
The Lod functions set the derivatives ds/dx, dt/dx, dr/dx,
dx/dy, dt/dy, and dr/dy = 0. Therefore Rhox and Rhoy = 0
0, Rhomax and Rhomin = 0.
Revision History:
3 - 2011-02-24
* Assign extension number
2 - 2010-01-20
* Naming updates
1 - 2010-01-19
* Initial ES version