
Name

    ARB_texture_filter_anisotropic

Name Strings

    GL_ARB_texture_filter_anisotropic

Contact

    Piers Daniell (pdaniell 'at' nvidia.com)

Contributors

    Contributors to EXT_texture_filter_anisotropic
    Jon Leech, Khronos
    Daniel Koch, NVIDIA

Notice

    Copyright (c) 2017-2019 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 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

Status

    Complete.

Version

    Last Modified Date: February 26, 2019
    Revision: 6

Number

    ARB Extension #195

Dependencies

    OpenGL 1.2 required.

    This extension is written against the OpenGL 4.5 (Compatibility Profile)
    Specification (October 24, 2016).

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
    or -sampler object basis the maximum degree of anisotropy to account for
    in texture filtering.

    Increasing the 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 sampler or texture's maximum degree of anisotropy is specified
    independently from its 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.

New Procedures and Functions

    None

New Tokens

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

        TEXTURE_MAX_ANISOTROPY              0x84FE

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

        MAX_TEXTURE_MAX_ANISOTROPY          0x84FF

Additions to Chapter 8 of the OpenGL 4.5 Specification (Textures and Samplers)

 --  Sections 8.10 "Texture Parameters"

     Add the following entry to the end of Table 8.25, "Texture parameters
     and their values":

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

     In the errors section for TexParameter*() on page 267 add the following:

     "INVALID_VALUE is generated when TexParameter is called with <pname>
     of TEXTURE_MAX_ANISOTROPY and any value specified by <param> or
     <params> is less than 1.0."

 --  Sections 8.14 "Texture Minification" and 8.15 "Texture Magnification"

     After the first paragraph in Section 8.14:

     "When the texture's value of TEXTURE_MAX_ANISOTROPY is equal to 1.0,
     the GL uses an isotropic texture filtering approach as described in
     this section and Section 8.15.  However, when the texture's value
     of TEXTURE_MAX_ANISOTROPY 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 or the implementation-defined value of
     MAX_TEXTURE_MAX_ANISOTROPY.

     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 8.14.
     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)
       Lambda' = log2(Pmax/N)

     where maxAniso is the smaller of the texture's value of
     TEXTURE_MAX_ANISOTROPY or the implementation-defined value of
     MAX_TEXTURE_MAX_ANISOTROPY.

     It is acceptable for an 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,Lambda), 'N' locations in
     the mipmap at LOD Lambda are sampled within the texture footprint of
     the pixel.  This sum Tau_Aniso is defined using the single sample Tau.
     When the texture's value of TEXTURE_MAX_ANISOTROPHY is greater
     than 1.0, use Tau_Aniso instead of Tau to determine the fragment's
     texture value.

                     i=N
                     ---
     Tau_Aniso = 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
                     ---
     Tau_Aniso = 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 Lambda:

                     i=N
                     ---
     Tau_Aniso = 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
                     ---
     Tau_Aniso = 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 the GLX Specification

     None

New State

(table 23.19, p721) add the entry:

Get Value                   Type  Get Command        Initial Value   Description      Sec     Attribute
--------------------------  ----  -----------------  --------------  ---------------  -----   ---------
TEXTURE_MAX_ANISOTROPY       R    GetTexParameterfv  1.0             Maximum degree   8.14    texture
                                                                     of anisotropy

(table 23.23, p725) add the entry:

Get Value                   Type  Get Command            Initial Value   Description      Sec     Attribute
--------------------------  ----  ---------------------  --------------  ---------------  -----   ---------
TEXTURE_MAX_ANISOTROPY       R    GetSamplerParameterfv  1.0             Maximum degree   8.14    -
                                                                         of anisotropy


New Implementation State

(table 23.64, p766) add the entry:

Get Value                       Type  Get Command   Minimum Value   Description      Sec     Attribute
------------------------------  ----  ------------  --------------  ---------------  -----   ---------
MAX_TEXTURE_MAX_ANISOTROPY       R    GetFloatv     16.0            Limit of         8.14    -
                                                                    maximum degree
                                                                    of anisotropy

Issues

    1) 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.

    2) What should the minimum value for MAX_TEXTURE_MAX_ANISOTROPY be?

      RESOLUTION:  16.0.  To support this extension, at least 16 to 1
      anisotropy should be supported.  16.0 was chosen because this is what
      all modern GPUs support at the time the ARB version of this extension
      was forked from the EXT version.  The EXT version of this extension
      specified 2, but it was written in 1999.

    3) 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.

    4) Should anything particular be said about anisotropic 3D texture
      and cube texture filtering?

      RESOLUTION:  NO. It was decided by the OpenGL working group to leave
      anisotropic filtering for 3D or cube textures as undefined. Anisotropic
      filtering is only well-defined for 2D and 2D array textures. For
      defined results with 3D and cube textures isotropic filtering should
      be used by setting the anisotropy level to 1.0.

    5) Should the maximum degree of anisotropy be a sampler parameter?

       RESOLVED: Yes. The original EXT extension was created before sampler
       objects were defined.

Revision History

    Rev.    Date      Author     Changes
    ----  ---------- ---------  -----------------------------------------------
    6     2019-02-26 pdaniell   Update issue 4 question and resolution.
    5     2017-06-02 Jon Leech  Include anisotropy state in sampler objects
                                (opengl/API/issues/15).
    4     2017-05-29 dgkoch     Minor typography/gramatical fixes from OpenGL 4.6.
    3     2017-05-24 pdaniell   Fix issue 2 to reflect the new minimum max
                                anisotrpic version.
    2     2017-04-25 pdaniell   Increase minimum max anisotropic value to 16.
    1     2017-04-03 pdaniell   Initial draft for OpenGL 4.6 forked from
                                GL_EXT_texture_filter_anisotropic
