Name

    SGIS_texture_lod

Name Strings

    GL_SGIS_texture_lod

Version

    $Date: 2005/06/02 18:12:32 $ $Revision: 1.1 $

Number

    24

Dependencies

    EXT_texture is required
    EXT_texture3D affects the definition of this extension
    EXT_texture_object affects the definition of this extension
    SGI_detail_texture affects the definition of this extension
    SGI_sharpen_texture affects the definition of this extension

Overview

    This extension imposes two constraints related to the texture level of
    detail parameter LOD, which is represented by the Greek character lambda
    in the GL Specification.  One constraint clamps LOD to a specified
    floating point range.  The other limits the selection of mipmap image
    arrays to a subset of the arrays that would otherwise be considered.

    Together these constraints allow a large texture to be loaded and
    used initially at low resolution, and to have its resolution raised
    gradually as more resolution is desired or available.  Image array
    specification is necessarily integral, rather than continuous.  By
    providing separate, continuous clamping of the LOD parameter, it is
    possible to avoid "popping" artifacts when higher resolution images
    are provided.

    Note: because the shape of the mipmap array is always determined by
    the dimensions of the level 0 array, this array must be loaded for
    mipmapping to be active.  If the level 0 array is specified with a
    null image pointer, however, no actual data transfer will take
    place.  And a sufficiently tuned implementation might not even
    allocate space for a level 0 array so specified until true image
    data were presented.

Issues

    *	Should detail and sharpen texture operate when the level 0 image
	is not being used?

	A: Sharpen yes, detail no.

    *	Should the shape of the mipmap array be determined by the
	dimensions of the level 0 array, regardless of the base level?

	A: Yes, this is the better solution.  Driving everything from
	   the base level breaks the proxy query process, and allows
	   mipmap arrays to be placed arbitrarily.  The issues of
	   requiring a level 0 array are partially overcome by the use
	   of null-point loads, which avoid data transfer and,
	   potentially, data storage allocation.

    *	With the arithmetic as it is, a linear filter might access an
	array past the limit specified by MAX_LEVEL or p.  But the
	results of this access are not significant, because the blend
	will weight them as zero.

New Procedures and Functions

    None

New Tokens

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

	TEXTURE_MIN_LOD_SGIS		0x813A
	TEXTURE_MAX_LOD_SGIS		0x813B
	TEXTURE_BASE_LEVEL_SGIS		0x813C
	TEXTURE_MAX_LEVEL_SGIS		0x813D

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

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    GL Specification Table 3.7 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
	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

	Table 3.7: Texture parameters and their values.

    Base Array
    ----------

    Although it is not explicitly stated, it is the clear intention
    of the OpenGL specification that texture minification filters
    NEAREST and LINEAR, and all texture magnification filters, be
    applied to image array zero.  This extension introduces a
    parameter, BASE_LEVEL, that explicitly specifies which array
    level is used for these filter operations.  Base level is specified
    for a specific texture by calling TexParameteri, TexParameterf,
    TexParameteriv, or TexParameterfv with <target> set to TEXTURE_1D,
    TEXTURE_2D, or TEXTURE_3D_EXT, <pname> set to TEXTURE_BASE_LEVEL_SGIS,
    and <param> set to (or <params> pointing to) the desired value.  The
    error INVALID_VALUE is generated if the specified BASE_LEVEL is
    negative.

    Level of Detail Clamping
    ------------------------

    The level of detail parameter LOD is defined in the first paragraph
    of Section 3.8.1 (Texture Minification) of the GL Specification, where
    it is represented by the Greek character lambda.  This extension
    redefines the definition of LOD as follows:

	LOD'(x,y) = log_base_2 (Q(x,y))


	       /  MAX_LOD	LOD' > MAX_LOD
	LOD = (   LOD'		LOD' >= MIN_LOD and LOD' <= MAX_LOD
	       \  MIN_LOD	LOD' < MIN_LOD
		\ undefined	MIN_LOD > MAX_LOD

    The variable Q in this definition represents the Greek character rho,
    as it is used in the OpenGL Specification.  (Recall that Q is computed
    based on the dimensions of the BASE_LEVEL image array.)  MIN_LOD is the
    value of the per-texture variable TEXTURE_MIN_LOD_SGIS, and MAX_LOD is
    the value of the per-texture variable TEXTURE_MAX_LOD_SGIS.

    Initially TEXTURE_MIN_LOD_SGIS and TEXTURE_MAX_LOD_SGIS are -1000 and
    1000 respectively, so they do not interfere with the normal operation of
    texture mapping.  These values are respecified for a specific texture
    by calling TexParameteri, TexParemeterf, TexParameteriv, or
    TexParameterfv with <target> set to TEXTURE_1D, TEXTURE_2D, or
    TEXTURE_3D_EXT, <pname> set to TEXTURE_MIN_LOD_SGIS or
    TEXTURE_MAX_LOD_SGIS, and <param> set to (or <params> pointing to) the
    new value.  It is not an error to specify a maximum LOD value that is
    less than the minimum LOD value, but the resulting LOD values are
    not defined.

    LOD is clamped to the specified range prior to any use.  Specifically,
    the mipmap image array selection described in the Mipmapping Subsection
    of the GL Specification is based on the clamped LOD value.  Also, the 
    determination of whether the minification or magnification filter is
    used is based on the clamped LOD.

    Mipmap Completeness
    -------------------

    The GL Specification describes a "complete" set of mipmap image arrays
    as array levels 0 through p, where p is a well defined function of the
    dimensions of the level 0 image.  This extension modifies the notion
    of completeness: instead of requiring that all arrays 0 through p
    meet the requirements, only arrays 0 and arrays BASE_LEVEL through
    MAX_LEVEL (or p, whichever is smaller) must meet these requirements.
    The specification of BASE_LEVEL was described above.  MAX_LEVEL is
    specified by calling TexParameteri, TexParemeterf, TexParameteriv, or
    TexParameterfv with <target> set to TEXTURE_1D, TEXTURE_2D, or
    TEXTURE_3D_EXT, <pname> set to TEXTURE_MAX_LEVEL_SGIS, and <param> set
    to (or <params> pointing to) the desired value.  The error
    INVALID_VALUE is generated if the specified MAX_LEVEL is negative.
    If MAX_LEVEL is smaller than BASE_LEVEL, or if BASE_LEVEL is greater
    than p, the set of arrays is incomplete.

    Array Selection
    ---------------

    Magnification and non-mipmapped minification are always performed
    using only the BASE_LEVEL image array.  If the minification filter
    is one that requires mipmapping, one or two array levels are
    selected using the equations in the table below, and the LOD value
    is clamped to a maximum value that insures that no array beyond
    the limits specified by MAX_LEVEL and p is accessed.

	Minification Filter	    Maximum LOD	    Array level(s)
	-------------------	    -----------	    --------------
	NEAREST_MIPMAP_NEAREST	    M + 0.4999	    floor(B + 0.5)
	LINEAR_MIPMAP_NEAREST	    M + 0.4999	    floor(B + 0.5)
	NEAREST_MIPMAP_LINEAR	    M		    floor(B), floor(B)+1
	LINEAR_MIPMAP_LINEAR	    M		    floor(B), floor(B)+1

	where:

	    M = min(MAX_LEVEL,p) - BASE_LEVEL
	    B = BASE_LEVEL + LOD

    For NEAREST_MIPMAP_NEAREST and LINEAR_MIPMAP_NEAREST the specified
    image array is filtered according to the rules for NEAREST or
    LINEAR respectively.  For NEAREST_MIPMAP_LINEAR and
    LINEAR_MIPMAP_LINEAR both selected arrays are filtered according to
    the rules for NEAREST or LINEAR, respectively.  The resulting values
    are then blended as described in the Mipmapping section of the
    OpenGL specification.

    Additional Filters
    ------------------
    
    Sharpen filters (described in SGIS_sharpen_texture) operate on array
    levels BASE_LEVEL and BASE_LEVEL+1.  If the minimum of MAX_LEVEL and p
    is not greater than BASE_LEVEL, then sharpen texture reverts to a
    LINEAR magnification filter.  Detail filters (described in
    SGIS_detail_texture) operate only when BASE_LEVEL is zero.

    Texture Capacity
    ----------------

    In Section 3.8 the OpenGL specification states:
    
	"In order to allow the client to meaningfully query the maximum
	 image array sizes that are supported, an implementation must not
	 allow an image array of level one or greater to be created if a
	 `complete' set of image arrays consistent with the requested
	 array could not be supported."

    Given this extension's redefinition of completeness, the above
    paragraph should be rewritten to indicate that all levels of the
    `complete' set of arrays must be supportable.  E.g.

	"In order to allow the client to meaningfully query the maximum
	 image array sizes that are supported, an implementation must not
	 allow an image array of level one or greater to be created if a
	 `complete' set of image arrays (all levels 0 through p) consistent
	 with the requested array could not be supported."

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

    None

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

    None

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

    None

Additions to the GLX Specification

    None

Dependencies on EXT_texture

    EXT_texture is required.

Dependencies on EXT_texture3D

    If EXT_texture3D is not supported, references to 3D texture mapping and
    to TEXTURE_3D_EXT in this document are invalid and should be ignored.

Dependencies on EXT_texture_object

    If EXT_texture_object is implemented, the state values named

	TEXTURE_MIN_LOD_SGIS
	TEXTURE_MAX_LOD_SGIS
	TEXTURE_BASE_LEVEL_SGIS
	TEXTURE_MAX_LEVEL_SGIS

    are added to the state vector of each texture object. When an attribute
    set that includes texture information is popped, the bindings and
    enables are first restored to their pushed values, then the bound
    textures have their LOD and LEVEL parameters restored to their pushed
    values.

Dependencies on SGIS_detail_texture

    If SGIS_detail_texture is not supported, references to detail texture
    mapping in this document are invalid and should be ignored.

Dependencies on SGIS_sharpen_texture

    If SGIS_sharpen_texture is not supported, references to sharpen texture
    mapping in this document are invalid and should be ignored.

Errors

    INVALID_VALUE is generated if an attempt is made to set
    TEXTURE_BASE_LEVEL_SGIS or TEXTURE_MAX_LEVEL_SGIS to a negative value.

New State

								Initial
    Get Value			Get Command	    Type	Value	Attrib
    ---------			-----------	    ----	-------	------
    TEXTURE_MIN_LOD_SGIS	GetTexParameterfv   n x R	-1000	texture
    TEXTURE_MAX_LOD_SGIS	GetTexParameterfv   n x R	 1000	texture
    TEXTURE_BASE_LEVEL_SGIS	GetTexParameteriv   n x R	    0	texture
    TEXTURE_MAX_LEVEL_SGIS	GetTexParameteriv   n x R	 1000	texture

New Implementation Dependent State

    None
