#

Name

EXT_texture_filter_anisotropic

Name Strings

GL_EXT_texture_filter_anisotropic

Notice

Copyright NVIDIA Corporation, 1999.

Version

Last updated May 23, 2018

Number

OpenGL Extension #187
OpenGL ES Extension #41

Dependencies

Written based on the wording of the OpenGL 1.2 specification.

Overview

Texture mapping using OpenGL's existing mipmap texture filtering
modes assumes that the projection of the pixel filter footprint into
texture space is a square (ie, isotropic).  In practice however, the
footprint may be long and narrow (ie, anisotropic).  Consequently,
mipmap filtering severely blurs images on surfaces angled obliquely
away from the viewer.

Several approaches exist for improving texture sampling by accounting
for the anisotropic nature of the pixel filter footprint into texture
space.  This extension provides a general mechanism for supporting
anisotropic texturing filtering schemes without specifying a
particular formulation of anisotropic filtering.

The extension permits the OpenGL application to specify on
a per-texture object basis the maximum degree of anisotropy to
account for in texture filtering.

Increasing a texture object's maximum degree of anisotropy may
improve texture filtering but may also significantly reduce the
implementation's texture filtering rate.  Implementations are free
to clamp the specified degree of anisotropy to the implementation's
maximum supported degree of anisotropy.

A texture's maximum degree of anisotropy is specified independent
from the texture's minification and magnification filter (as
opposed to being supported as an entirely new filtering mode).
Implementations are free to use the specified minification and
magnification filter to select a particular anisotropic texture
filtering scheme.  For example, a NEAREST filter with a maximum
degree of anisotropy of two could be treated as a 2-tap filter that
accounts for the direction of anisotropy.  Implementations are also
permitted to ignore the minification or magnification filter and
implement the highest quality of anisotropic filtering possible.

Applications seeking the highest quality anisotropic filtering
available are advised to request a LINEAR_MIPMAP_LINEAR minification
filter, a LINEAR magnification filter, and a large maximum degree
of anisotropy.

Issues

Should there be a particular anisotropic texture filtering minification
and magnification mode?

  RESOLUTION:  NO.  The maximum degree of anisotropy should control
  when anisotropic texturing is used.  Making this orthogonal to
  the minification and magnification filtering modes allows these
  settings to influence the anisotropic scheme used.  Yes, such
  an anisotropic filtering scheme exists in hardware.

What should the minimum value for MAX_TEXTURE_MAX_ANISOTROPY_EXT be?

  RESOLUTION:  2.0.  To support this extension, at least 2 to 1
  anisotropy should be supported.

Should an implementation-defined limit for the maximum maximum degree of
anisotropy be "get-able"?

  RESOLUTION:  YES.  But you should not assume that a high maximum
  maximum degree of anisotropy implies anything about texture
  filtering performance or quality.

Should anything particular be said about anisotropic 3D texture filtering?

  Not sure.  Does the implementation example shown in the spec for
  2D anisotropic texture filtering readily extend to 3D anisotropic
  texture filtering?

New Procedures and Functions

None

New Tokens

Accepted by the <pname> parameters of GetTexParameterfv,
GetTexParameteriv, TexParameterf, TexParameterfv, TexParameteri,
and TexParameteriv:

    TEXTURE_MAX_ANISOTROPY_EXT          0x84FE

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

    MAX_TEXTURE_MAX_ANISOTROPY_EXT      0x84FF

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

 None

Additions to Chapter 3 of the 1.2 Specification (Rasterization)

– Sections 3.8.3 "Texture Parameters"

 Add the following entry to the end of Table 3.17:

 Name                         Type    Legal Values
 --------------------------   ------  --------------------------
 TEXTURE_MAX_ANISOTROPY_EXT   float   greater or equal to 1.0

– Sections 3.8.5 "Texture Minification" and 3.8.6 "Texture Magnification"

 After the first paragraph in Section 3.8.5:
 
 "When the texture's value of TEXTURE_MAX_ANISOTROPY_EXT is equal to 1.0,
 the GL uses an isotropic texture filtering approach as described in
 this section and Section 3.8.6.  However, when the texture's value
 of TEXTURE_MAX_ANISOTROPY_EXT is greater than 1.0, the GL implementation
 should use a texture filtering scheme that accounts for a degree
 of anisotropy up to the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 The particular scheme for anisotropic texture filtering is
 implementation dependent.  Additionally, implementations are free
 to consider the current texture minification and magnification modes
 to control the specifics of the anisotropic filtering scheme used.

 The anisotropic texture filtering scheme may only access mipmap
 levels if the minification filter is one that requires mipmaps.
 Additionally, when a minification filter is specified, the
 anisotropic texture filtering scheme may only access texture mipmap
 levels between the texture's values for TEXTURE_BASE_LEVEL and
 TEXTURE_MAX_LEVEL, inclusive.  Implementations are also recommended
 to respect the values of TEXTURE_MAX_LOD and TEXTURE_MIN_LOD to
 whatever extent the particular anisotropic texture filtering
 scheme permits this."

 The following describes one particular approach to implementing
 anisotropic texture filtering for the 2D texturing case:

 "Anisotropic texture filtering substantially changes Section 3.8.5.
 Previously a single scale factor P was determined based on the
 pixel's projection into texture space.  Now two scale factors,
 Px and Py, are computed.

   Px = sqrt(dudx^2 + dvdx^2)
   Py = sqrt(dudy^2 + dvdy^2)

   Pmax = max(Px,Py)
   Pmin = min(Px,Py)

   N = min(ceil(Pmax/Pmin),maxAniso)
   Lamda' = log2(Pmax/N)

 where maxAniso is the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 It is acceptable for implementation to round 'N' up to the nearest
 supported sampling rate.  For example an implementation may only
 support power-of-two sampling rates.

 It is also acceptable for an implementation to approximate the ideal
 functions Px and Py with functions Fx and Fy subject to the following
 conditions:

   1.  Fx is continuous and monotonically increasing in |du/dx| and |dv/dx|.
       Fy is continuous and monotonically increasing in |du/dy| and |dv/dy|.

   2.  max(|du/dx|,|dv/dx|} <= Fx <= |du/dx| + |dv/dx|.
       max(|du/dy|,|dv/dy|} <= Fy <= |du/dy| + |dv/dy|.

 Instead of a single sample, Tau, at (u,v,Lamda), 'N' locations in the mipmap
 at LOD Lamda, are sampled within the texture footprint of the pixel.

 Instead of a single sample, Tau, at (u,v,lambda), 'N' locations in
 the mipmap at LOD Lamda are sampled within the texture footprint of
 the pixel.  This sum TauAniso is defined using the single sample Tau.
 When the texture's value of TEXTURE_MAX_ANISOTROPHY_EXT is greater
 than 1.0, use TauAniso instead of Tau to determine the fragment's
 texture value.

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x - 1/2 + i/(N+1), y), v(x - 1/2 + i/(N+1), y)),  Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x, y - 1/2 + i/(N+1)), v(x, y - 1/2 + i/(N+1))),  Py >= Px
                /
                ---
                i=1


 It is acceptable to approximate the u and v functions with equally spaced
 samples in texture space at LOD Lamda:

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudx(i/(N+1)-1/2), v(x,y)+dvdx(i/(N+1)-1/2)), Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudy(i/(N+1)-1/2), v(x,y)+dvdy(i/(N+1)-1/2)), Py >= Px
                /
                ---
                i=1 

 "

Additions to Chapter 4 of the 1.2 Specification (Per-Fragment Operations and the Frame Buffer)

 None

Additions to Chapter 5 of the 1.2 Specification (Special Functions)

 None

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

 None

Additions to the GLX Specification

 None

Errors

 INVALID_VALUE is generated when TexParameter is called with <pname>
 of TEXTURE_MAX_ANISOTROPY_EXT and a <param> value or value of what
 <params> points to less than 1.0.

New State

(table 6.13, p203) add the entry:

Get Value Type Get Command Initial Value Description Sec Attribute ————————– —- —————– ————– ————— —– ——— TEXTURE_MAX_ANISOTROPY_EXT R GetTexParameterfv 1.0 Maximum degree 3.8.5 texture of anisotropy

New Implementation State

(table 6.25, p215) add the entry:

Get Value Type Get Command Minimum Value Description Sec Attribute —————————— —- ———— ————– ————— —– ——— MAX_TEXTURE_MAX_ANISOTROPY_EXT R GetFloatv 2.0 Limit of 3.8.5 - maximum degree of anisotropy

Issues

1) Should TEXTURE_MAX_ANISOTROPY_EXT be accepted by SamplerParameter*?

Yes, for implementations supporting sampler objects. The per-texture sampling state is overridden by the sampler object state, if present. The anisotropy parameter should not be an exception, as this would reduce the usefulness of sampler objects when anisotropic filtering is supported. This also matches the interaction described in ARB_sampler_objects, and the same behavior is still expected for API versions with core support for sampler objects.

Revision History

2018-05-23 (Nicolas Capens) - clarify interaction with sampler objects.

11/12/14 (Jon Leech) - Fix spelling of TEXTURE_MAX_ANISOTROPY (public Bug 1263).

9/26/07 (Jon Leech) - assigned OpenGL ES extension number so the extension can live in both API registries.

4/25/00 - clarify that TexParameterf and TexParameteri accept TEXTURE_MAX_ANISOTROPY_EXT as a pname.