Name

    SGIS_detail_texture

Name Strings

    GL_SGIS_detail_texture

Version

    $Date: 1995/07/09 06:48:46 $ $Revision: 1.31 $

Number

    21

Dependencies

    EXT_texture is required
    EXT_subtexture affects the definition of this extension
    EXT_copy_texture affects the definition of this extension
    EXT_texture_object affects the definition of this extension

Overview

    This extension introduces texture magnification filters that blend
    between the level 0 image and a separately defined "detail" image.
    The detail image represents the characteristics of the high frequency
    subband image above the band-limited level 0 image.  The detail image is
    typically a rectangular portion of the subband image which is modified
    so that it can be repeated without discontinuities along its edges.
    Detail blending can be enabled for all color channels, for the alpha
    channel only, or for the red, green, and blue channels only.  It is
    available only for 2D textures.

    WARNING - Silicon Graphics has filed for patent protection for some
	      of the techniques described in this extension document.

Issues

    *	Should detail textures be supported in 1D?  3D?  (Currently
	written to support 2D only)

    *	Is there any need to support detail textures with NEAREST
	or FILTER4 filtering?  (No)

    *	How does detail texture interact with a texture whose
	minimum LOD image is not layer zero?  (Handle this in the LOD
	extension.)

    *	Should six detail filters be defined, so that the MODE is part
	of the filter name?  (LINEAR_ADD_DETAIL_SGIS,
	LINEAR_ADD_DETAIL_ALPHA_SGIS, ...)  (No)

    *	I have scaled and biased the detail texture value to the range [-1,1]
	in this specification.	I believe that Iris GL scaled and biased to
	[-0.5,0.5].  The [-1,1] range seems clearer to me, if it allows F()
	to be limited to [0,1].  Is this acceptable?

    *	Should detail texture objects and 2D texture objects be separate
	sets, or should it be possible to use the same texture object both
	as a detail texture and as a 2D texture?  (Keep them separate)

New Procedures and Functions

    void DetailTexFuncSGIS(enum target,
			   sizei n,
			   const float* points);

    void GetDetailTexFuncSGIS(enum target,
			      float* points);

New Tokens

    Accepted by the <target> parameters of GetTexImage,
    GetTexLevelParameterfv, GetTexLevelParameteriv, GetTexParameterfv,
    GetTexParameteriv, TexImage2D, TexParameterf, TexParameterfv,
    TexParameteri, and TexParameteriv.	If the corresponding extensions are
    supported, also accepted by the <target> parameters of TexSubImage2DEXT,
    CopyTexImage2DEXT, CopyTexSubImage2DEXT, and BindTextureEXT:

	DETAIL_TEXTURE_2D_SGIS

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

	DETAIL_TEXTURE_2D_BINDING_SGIS

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

	LINEAR_DETAIL_SGIS
	LINEAR_DETAIL_ALPHA_SGIS
	LINEAR_DETAIL_COLOR_SGIS

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

	DETAIL_TEXTURE_LEVEL_SGIS
	DETAIL_TEXTURE_MODE_SGIS

    Accepted by the <pname> parameter of GetTexParameteriv and
    GetTexParameterfv:

	DETAIL_TEXTURE_FUNC_POINTS_SGIS

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
	TEXTURE_BORDER_COLOR		4 floats    any 4 values in [0,1]
	DETAIL_TEXTURE_LEVEL_SGIS	integer     any non-positive integer
	DETAIL_TEXTURE_MODE_SGIS	integer     ADD, MODULATE

	Table 3.7: Texture parameters and their values.

    3.8.2.1 Texture magnification with detail

    Three additional texture magnification filters are defined for texture
    magnification.  These values, which are assigned to TEXTURE_MAG_FILTER,
    are LINEAR_DETAIL_SGIS, LINEAR_DETAIL_ALPHA_SGIS, and
    LINEAR_DETAIL_COLOR_SGIS.  All three filters sample the level zero
    texture array exactly as it would be sampled with filter mode LINEAR.
    All three also sample the level zero texture array of a second
    texture, known as the detail texture, when three conditions are met.
    The detail texture corresponding to texture TEXTURE_2D is
    DETAIL_TEXTURE_2D_SGIS.  The conditions are:

	1.  The active texture must be TEXTURE_2D.

	2.  The internal formats of TEXTURE_2D and DETAIL_TEXTURE_2D_SGIS
	    must have been specified identically.

	3.  The level 0 array of DETAIL_TEXTURE_2D_SGIS must have nonzero width
	    and height.

    If these conditions are not met, it is as though the magnification
    texture filter was LINEAR.	(Although querying the magnification filter
    value will return the value as specified.)	If they are met, the level
    zero array of the detail texture is also linearly sampled, using the
    following arithmetic:

	n = log base 2 of the width of the level zero array of TEXTURE_2D
	m = log base 2 of the height of the level zero array of TEXTURE_2D
	N = log base 2 of the width of DETAIL_TEXTURE_2D_SGIS
	M = log base 2 of the height of DETAIL_TEXTURE_2D_SGIS
	L = DETAIL_TEXTURE_LEVEL_SGIS value of TEXTURE_2D

	u = s * 2**(n-L)
	v = t * 2**(m-L)

	i0 = floor(u - 1/2) mod 2**N
	j0 = floor(v - 1/2) mod 2**M

	i1 = (i0 + 1) mod 2**N
	j1 = (j0 + 1) mod 2**M

	A = frac(u - 1/2)
	B = frac(v - 1/2)

	Tdetail = (1-A) * (1-B) * detail[i0,j0] +
		    A	* (1-B) * detail[i1,j0] +
		  (1-A) *   B	* detail[i0,j1] +
		    A	*   B	* detail[i1,j1]

    Note that magnification corresponds to negative values of level-of-detail
    and minification corresponds to positive values.  Hence L, the value of the
    DETAIL_TEXTURE_LEVEL_SGIS parameter of TEXTURE_2D, must be negative.  The
    absolute value of L can be thought of as the number of levels that
    separate the level 0 image of TEXTURE_2D and the image of
    DETAIL_TEXTURE_2D, which is replicated as necessary to fill the appropriate
    number of texels.  For example, if L is -2, the detail texture image is
    replicated as necessary in x and y to form a single image whose dimensions
    are four times larger than the level zero array of TEXTURE_2D.

    The texture value computed from the primary texture (Ttexture) and
    the value computed from the detail texture (Tdetail) are combined
    in one of two ways to compute the final texture value (T).	The
    values of Ttexture, Tdetail, and T are treated as though they range
    from 0.0 through 1.0 in these equations.

    If DETAIL_TEXTURE_MODE_SGIS of TEXTURE_2D is ADD, then

	T' = Ttexture + F(LOD) * (2*Tdetail-1)

	     / 0      T' < 0
	T = <  T'     0 <= T' <= 1
	     \ 1      T' > 1

    where F is a function of the level-of-detail parameter LOD, which is
    represented by the Greek character lambda in the GL specification.	In
    effect, the detail texture is scaled and biased so that its range is
    [-1,1].  The resulting signed value is scaled by a function of LOD,
    added to the base texture, and clamped to [0,1].

    If DETAIL_TEXTURE_MODE_SGIS or TEXTURE_2D is MODULATE, then

	T' = Ttexture * (1 + F(LOD) * (2*Tdetail-1))

	     / 0      T' < 0
	T = <  T'     0 <= T' <= 1
	     \ 1      T' > 1

    Here again the detail texture is scaled and biased so that its range
    is [-1,1].	The resulting signed value is scaled by a function of LOD,
    and biased by 1.  This result scales the base texture, which is then
    clamped to [0,1].

    The function F of level-of-detail parameter LOD is specified by calling
    DetailTexFuncSGIS with <target> set to TEXTURE_2D, <points> pointing at
    an array of pairs of floating point values, and <n> set to the number
    of value pairs in <points>.  The first value of each value pair in
    <points> specifies a value of LOD, and the second value of each value
    pair specifies the corresponding function value.  The order in which
    the points are specified is not significant.  The <n> value pairs in
    <points> completely specify the function, replacing any previous
    specification that may have existed.  Since negative values of LOD
    correspond to magnification and positive values correspond to
    minification, the points should have negative values for LOD (though it
    is not an error to specify positive values).

    Function F is evaluated by sorting the value pairs specified by
    DetailTexFuncSGIS by LOD value, then fitting a curve through these
    points.  This curve may be linear between adjacent points, or it may be
    smoothed, but it will pass exactly through the points, limited only by
    the resolution of the implementation.  The value pair with the lowest
    LOD value specifies the function value F for all values of LOD less than
    or equal to that pair's LOD.  Likewise, the value pair with the greatest
    LOD value specifies the function value F for all values of LOD greater
    than or equal to that pair's LOD.  F is undefined if two or more value
    pairs have the same LOD value.

    If the texture magnification filter is LINEAR_DETAIL_SGIS, then both
    the color and the alpha components of T are computed as described
    in the equations above.  If the filter is LINEAR_DETAIL_COLOR_SGIS,
    then all components of T other than alpha are computed as described
    above, and the alpha component of T is computed as if the texture
    magnification filter were LINEAR.  Finally, if the filter is
    LINEAR_DETAIL_ALPHA_SGIS, the alpha component of T is computed as
    described in the equations above, and all other components of T
    are computed as if the texture magnification filter were LINEAR.

    All OpenGL texture commands that accept a target value of TEXTURE_2D
    also accept the target value DETAIL_TEXTURE_2D_SGIS.  These commands
    operate on and return state of the detail texture just as they do
    of the 2-dimensional texture.

    If EXT_texture_object is supported, detail texture objects can be
    created, operated on, and bound just as their 2D counterparts are.	The
    sets of detail textures and 2D textures are exclusive, however, so it
    is not possible to use a texture object both as a 2D texture and as
    a detail texture.  By default zero is bound to DETAIL_TEXTURE_2D_SGIS,
    just as zero is bound to TEXTURE_2D.

    Specification of a detail texture
    ---------------------------------

    A detail texture is specified by calling TexImage2D or CopyTexImage2DEXT
    with <target> set to DETAIL_TEXTURE_2D_SGIS, <level> set to 0, <border>
    set to 0, and the other parameters specified to generate the desired
    image.

    Minification vs. Magnification
    ------------------------------

    If the magnification filter is given by LINEAR_DETAIL_SGIS,
    LINEAR_DETAIL_ALPHA_SGIS, or LINEAR_DETAIL_COLOR_SGIS, and the
    minification filter is given by NEAREST_MIPMAP_NEAREST or
    LINEAR_MIPMAP_NEAREST, then c = 0.5.  The parameter c is used to
    determine whether minification or magnification filtering is done,
    as described in Section 3.8.2 of the GL Specification (Texture
    Magnification).

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

    None

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

    GetDetailTexFuncSGIS is not included in display lists.

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

    Although many of the parameter values of a detail texture have no
    effect on texture operation, they are maintained and may be queried.
    There is no value associated with the binding point
    DETAIL_TEXTURE_2D_SGIS, so it is not accepted as the <pname> parameter
    of GetBooleanv, GetIntegerv, GetFloatv, or GetDoublev.  The name of
    the detail texture that is bound to DETAIL_TEXTURE_2D_SGIS is queried
    by calling GetBooleanv, GetIntegerv, GetFloatv, or GetDoublev with
    <pname> set to DETAIL_TEXTURE_2D_BINDING_SGIS.  Zero is returned if
    no texture has been bound.

    The number of points in the detail texture function specification of
    a texture is queried by calling GetTexParameteriv or GetTexParameterfv
    with <target> set to the target of the desired texture and <pname> set
    to DETAIL_TEXTURE_FUNC_POINTS_SGIS.  The function
    GetDetailTexFuncSGIS returns in <points> all of the points in the detail
    texture function of texture <target>.

Additions to the GLX Specification

    None

GLX Protocol

    Two new GLX protocol commands are added.

	 DetailTexFuncSGIS
	     2		 12+4*2*n	 rendering command length
	     2		 2051		 rendering command opcode
	     4		 ENUM		 target
	     4		 INT32		 n
	     4*2*n	 LISTofFLOAT	 points

	 GetDetailTexFuncSGIS
	     1		 CARD8		 opcode (X assigned)
	     1		 17		 GLX opcode (glXVendorPrivateWithReply)
	     2		 4		 request length
	     4		 4096		 vendor specific opcode
	     4		 GLX_CONTEXT_TAG context tag
	     4		 ENUM		 target
	   =>
	     1		 1		 reply
	     1				 unused
	     2		 CARD16		 sequence number
	     4		 n		 reply length, m = n
	     4				 unused
	     4		 CARD32		 n
	     16				 unused
	     n*4	 LISTofFLOAT32	 points

	 Note that n may be zero, indicating that a GL error occurred.
	 Otherwise n must be even and n >= 2.

Dependencies on EXT_texture

    EXT_texture is required.

Dependencies on EXT_texture3D

    None, because detail texture is not specified for 3D textures.  This
    extensions is designed to allow a subsequent extension to define 3D
    detail textures, however.

Dependencies on EXT_subtexture

    If EXT_subtexture is not implemented, then the references to
    TexSubImage2DEXT and CopyTexSubImage2DEXT in this file are invalid,
    and should be ignored.

Dependencies on EXT_copy_texture

    If EXT_copy_texture is not implemented, then the references to
    CopyTexImage2DEXT and CopyTexSubImage2DEXT in this file are invalid,
    and should be ignored.

Dependencies on EXT_texture_object

    If EXT_texture_object is not implemented, then the references to
    BindTextureEXT are invalid, and should be ignored.

    If EXT_texture_object is implemented, the state values named

	DETAIL_TEXTURE_LEVEL_SGIS
	DETAIL_TEXTURE_MODE_SGIS
	DETAIL_TEXTURE_FUNC_POINTS_SGIS
	<DETAIL_TEXTURE_FUNC>

    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 detail parameters restored to their pushed values.

Errors

    INVALID_VALUE is generated if TexImage2D or CopyTexImage2DEXT
    parameter <target> is DETAIL_TEXTURE_2D_SGIS, and parameter <level>
    or parameter <border> is not zero.

    INVALID_VALUE is generated if BindTextureEXT parameter <target> is
    DETAIL_TEXTURE_2D_SGIS, and parameter <texture> is not the name of a
    detail texture, the name of an as yet unbound texture, or zero.

    INVALID_VALUE is generated if TexParameteri, TexParameterf,
    TexParameteriv, or TexParameterfv parameter <pname> is
    DETAIL_TEXTURE_MODE_SGIS, and parameter <param> is not ADD or MODULATE,
    or parameter <params> doesn't point to ADD or MODULATE.

    INVALID_VALUE is generated if TexParameteri, TexParameterf,
    TexParameteriv, or TexParameterfv parameter <pname> is
    DETAIL_TEXTURE_LEVEL_SGIS, and parameter <param> is positive,
    or parameter <params> points to a positive value.

    INVALID_ENUM is generated if DetailTexFuncSGIS or
    GetDetailTexFuncSGIS parameter <target> is not TEXTURE_2D.

    INVALID_VALUE is generated if DetailTexFuncSGIS parameter <n> is
    negative.

    INVALID_OPERATION is generated if DetailTexFuncSGIS or
    GetDetailTexFuncSGIS is executed between execution of Begin and the
    corresponding execution to End.

New State

    Get Value				Get Command		Type		Initial Value	Attribute
    ---------				-----------		----		-------------	---------
    DETAIL_TEXTURE_2D_BINDING_SGIS	GetIntegerv		Z+		0		texture
    DETAIL_TEXTURE_LEVEL_SGIS		GetTexParameteriv	n x Z-		-4		texture
    DETAIL_TEXTURE_MODE_SGIS		GetTexParameteriv	n x Z2		ADD		texture
    DETAIL_TEXTURE_FUNC_POINTS_SGIS	GetTexParameteriv	n x Z+		2		texture
    <DETAIL_TEXTURE_FUNC>		GetDetailTexFuncSGIS	n x m x R	{0, 0}, {-4, 1} texture

New Implementation Dependent State

    None
