Name

    SGIX_texture_supersample

Name Strings

    GL_SGIX_texture_supersample

Version

    $Date: 1997/07/17 03:04:37 $ $Revision: 1.1 $

Number

    XXX

Dependencies

    SGIX_texture_lod_bias affects the definition of this extension

Overview

    This extension introduces high quality texture minification 
    filters which do not require prefiltering or multiple level of detail
    maps.  The texture map is supersampled based on a pixel's projected 
    footprint in texture space.  The weighted average of the samples is 
    used as the texture value for the pixel.

Issues

    * Should 3D textures be supported? Not for now.
    * Should the TEXTURE_SUPERSAMPLE_WIDTH_SGIX greater than 1 be supported?
      Dignam would like to consider supporting them -- they will be quite slow.

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameter of TexParameteri and TexParameterf,
    and by the <pname> parameter of TexParameteriv and TexParameterfv.

        TEXTURE_SUPERSAMPLE_WIDTH_SGIX

    Accepted by the <param> parameter of TexParameteri and TexParameterf,
    and by the <params> parameter of TexParameteriv and TexParameterfv, when
    their <pname> parameter is TEXTURE_MIN_FILTER.  

        LINEAR_SUPERSAMPLE_SGIX
        FILTER4_SUPERSAMPLE_SGIX


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 with the addition of:

	Name				Type	    Legal Values
	----				----	    ------------
	TEXTURE_MIN_FILTER		integer	    LINEAR_SUPERSAMPLE_SGIX,
						    FILTER4_SUPERSAMPLE_SGIX

        TEXTURE_SUPERSAMPLE_WIDTH_SGIX  integer	    1, 2, or 4

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

   LamdaX = log2(Px)
   LamdaY = log2(Py)

   Nx = round (2^LamdaX);
   Ny = round (2^LamdaY);
  

   Instead of a single sample, Tau, at (u,v), Nx x Ny locations of the 
   texture at LOD 0 are sampled and averaged as follows:

                  i=Nx,j=Ny
                  ---
   Tau =1/(Nx*Ny) \ Tau( u_sub_ij, v_sub_ij);
	          /          
                  ---	       
         	  i=1,j=1
    where:

    u_sub_ij = u(x - 0.5 + i/(Nx+1), y - 0.5 + j/(Ny+1));
    v_sub_ij = v(x - 0.5 + i/(Nx+1), y - 0.5 + j/(Ny+1));


    It is acceptable to reduce the smaller of Nx and Ny as the pixel 
    footprint collapses to a line, so long as the sampling rate of the texture
    coordinates with respect to each of the screen coordinates is maintained.

    The sampling function for Tau(u,v) will be LINEAR if TEXTURE_MIN_FILTER is 
    LINEAR_SUPERSAMPLE_SGIX, and FILTER4_SGIS if TEXTURE_MIN_FILTER is 
    FILTER4_SUPERSAMPLE_SGIX.

    The default resampling filter is an equal weighted box filter.  A linear
    or cubic filter may be specified by setting the 
    TEXTURE_SUPERSAMPLE_WIDTH_SGIX from 1 to 2 or 4.

    When TEXTURE_SUPERSAMPLE_WIDTH_SGIX is 2, the width and height
    of the pixel footprint in screen space will double, and a linear filter
    centered at the center of the pixel will be used to weight each sample.

    When TEXTURE_SUPERSAMPLE_WIDTH_SGIX is 4, the width and height
    of the pixel footprint in screen space will quadruple, and the FILTER4_SGIS
    texture filter function will be used to weight each sample.

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

Dependencies on SGIX_texture_lod

   LamdaX and LamdaY are clamped to the range [MIN_LOD, MAX_LOD] if the 
   SGIS_texture_lod extension is supported.

Errors

    None

New State

								Initial
    Get Value			    Get Command	     Type	Value	  Attrib
    ---------			    -----------	     ----	-------	  ------
    TEXTURE_SUPERSAMPLE_WIDTH_SGIX  GetTexParameteriv Z1*         1        texture

New Implementation Dependent State

                                                                        Minimum
    Get Value                           Get Command     Type            Value
    ---------                           -----------     ----            -------
    MAX_TEXTURE_SUPERSAMPLE_WIDTH       GetIntegerv     Z1*              1
