Name SGIX_texture_mipmap_anisotropic Name Strings GL_SGIX_texture_mipmap_anisotropic Version $Date: 1998/10/21 00:42:24 $ $Revision: 1.4 $ Number XXX Dependencies EXT_texture3D affects the definition of this extension SGIX_texture_lod_bias affects the definition of this extension Overview This extension improves the filtering quality over the standard mipmap algorithm. The limitation of the standard mipmap algorithm is that a pixel's footprint in texture space is approximated by a symmetrically filtered sample. The approximation becomes worse as the pixel footprint becomes more anisotropic. The poor approximation usually results in the mapped image appearing excessively blurry. This extension replaces a single symmetric sample with the average of distributed smaller samples, which better approximates the pixel footprint shape. This anisotropic filtering method uses the existing mipmap and clipmap structures. Issues * Should this extension handle all anisotropic filtering methods? -- No. Since all other known anisotropic filter methods (summed-area, ripmap, non-mip supersampling) use different data structures, the control mechanisms will be different and therefore should be separate extensions. New Procedures and Functions None New Tokens Accepted by the parameter of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv: TEXTURE_MIPMAP_ANISOTROPY_SGIX 0x832E Accepted by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: MAX_MIPMAP_ANISOTROPY_SGIX 0x832F Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation) None Additions to Chapter 3 of the 1.1 Specification (Rasterization) GL Specification Table 3.9 is updated as follows: Name Type Legal Values ---- ---- ------------ TEXTURE_WRAP_S integer CLAMP, REPEAT TEXTURE_WRAP_T integer CLAMP, REPEAT TEXTURE_WRAP_R_EXT integer CLAMP, REPEAT TEXTURE_MIN_FILTER integer NEAREST, LINEAR, NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, LINEAR_MIPMAP_LINEAR, FILTER4_SGIS, LINEAR_CLIPMAP_LINEAR_SGIX, TEXTURE_MAG_FILTER integer NEAREST, LINEAR, FILTER4_SGIS, LINEAR_DETAIL_SGIS, LINEAR_DETAIL_ALPHA_SGIS, LINEAR_DETAIL_COLOR_SGIS, LINEAR_SHARPEN_SGIS, LINEAR_SHARPEN_ALPHA_SGIS, LINEAR_SHARPEN_COLOR_SGIS TEXTURE_BORDER_COLOR 4 floats any 4 values in [0,1] DETAIL_TEXTURE_LEVEL_SGIS integer any non-negative integer DETAIL_TEXTURE_MODE_SGIS integer ADD, MODULATE TEXTURE_MIN_LOD_SGIS float any value TEXTURE_MAX_LOD_SGIS float any value TEXTURE_BASE_LEVEL_SGIS integer any non-negative integer TEXTURE_MAX_LEVEL_SGIS integer any non-negative integer GENERATE_MIPMAP_SGIS boolean TRUE or FALSE TEXTURE_CLIPMAP_FRAME_SGIX float any non-negative value TEXTURE_CLIPMAP_CENTER_SGIX 2 integers any 2 non-negative integers TEXTURE_CLIPMAP_OFFSET_SGIX 2 integers any 2 non-negative integers TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 3 integers any 3 non-negative integer TEXTURE_LOD_BIAS_S_SGIX float any value TEXTURE_LOD_BIAS_T_SGIX float any value TEXTURE_LOD_BIAS_R_SGIX float any value TEXTURE_MIPMAP_ANISOTROPY int any value >= 1 Table 3.9: Texture parameters and their values. Texture Minification ------------------------ This extensions substantially changes Section 3.8.1. 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),TEXTURE_MIPMAP_ANISOTROPY_SGIX); Lamda = log2(Pmax/N) 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. i=N --- Tau = 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 = 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 --- Tau = 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 = 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.1 Specification (Per-Fragment Operations and the Frame Buffer) None Additions to Chapter 5 of the 1.1 Specification (Special Functions) None Additions to Chapter 6 of the 1.1 Specification (State and State Requests) None Additions to the GLX Specification None Dependencies on EXT_texture3D If EXT_texture3D is supported, the functions Px, Py, and Tau are modified to include dwdx, dwdy, and w. Dependencies on SGIX_texture_lod_bias If SGIX_texture_lod_bias is supported, dudx, dvdx, dwdx, dudy, dvdy, dwdy are replaced with dlodudx, dlodvdx, dlodwdx, dlodudy, dlodvdy, dlodwdy in the Px and Py functions. Errors None New State Initial Get Value Get Command Type Value Attrib --------- ----------- ---- ------- ------ TEXTURE_MIPMAP_ANISOTROPY_SGIX GetTexParameteriv Z1* 1 texture New Implementation Dependent State Minimum Get Value Get Command Type Value --------- ----------- ---- ------- MAX_MIPMAP_ANISOTROPY_SGIX GetIntegerv Z1* 2