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