XXX - Not complete yet!!!
Name
SGI_filter4_parameters
Name Strings
GLU_SGI_filter4_parameters
Version
$Date: 1996/06/25
Number
85
Dependencies
GL_SGIS_texture_filter4
Overview
This extension provides interpolation coefficients just as they are required
for GL_FILTER4_SGIS filtering in glTexFilterFuncSGIS. The interpolation
weights themselves are typically a set of equidistant samples along a
smooth curve defined by several piecewise cubic polynomials, representing a
two pixel wide span. By reflecting these across the X axis, a four pixel
wide span is produced, supporting 4x1 1D texture filtering.
By calculating the cross product of coefficients in 2D or 3D, 4x4 and 4x4x4
interpolation coefficients can be derived by other software, using this two
pixel wide span of filter function.
The coefficients are produced by one or another mathematical scheme.
According to Mitchell-Netravali, many of the desired characteristics of
other 4x1 interpolation schemes can be accomplished by setting B and C in
their piecewise cubic formula. Notably, the blurriness/sharpness of the
resulting image can be adjusted with B and C. The reference is:
Mitchell, Don. and Netravali, Arun, "Reconstruction Filters for Computer
Graphics", SIGGRAPH '88, p. 221-228.
According to Lagrange interpolation, four piecewise cubic polynomials (two
redundant ones) are used to produce coefficients resulting in images at a
high sharpness level. The reference is: Dahlquist and Bjorck,
"Numerical Methods", Prentice-Hall, 1974, pp 284-285.
Issues
What other types of 4x1 interpolation formulas should be supported, if any?
Should TexFilterFuncSGIS be called for the user?
- yes, TexFilterFuncSGIS should be called instead of having the user
do this. This is to be consistent with the rest of GLU, i.e.,
mipmap utilities. Note that GLU was designed this way so that it
could be accelerated.
New Procedures and Functions
GLint gluTexFilterFuncSGI(GLenum target, GLenum filtertype,
const GLfloat *parms, GLint n, GLfloat *weights)
New Tokens
Accepted by the filtertype parameter are GLU_LAGRANGIAN_SGI and
GLU_MITCHELL_NETRAVALI_SGI. If filtertype is GLU_MITCHELL_NETRAVALI_SGI,
the parms parameter may point to a vector of two floats containing B and
C control values. The default value for both B & C is 0.5.
Additions to the GLU Specification
target should be either GL_TEXTURE_1D or GL_TEXTURE_2D.
To specify Lagrange interpolation,
GLU_LAGRANGIAN_SGI is passed into filtertype and the parms parameter
must be NULL. To specify Mitchell-Netravali interpolation,
GLU_MITCHELL_NETRAVALI_SGI is passed into filtertype. If
filtertype is GLU_MITCHELL_NETRAVALI_SGI, the parms parameter may point
to a vector of two floats containing B and C control values or the parms
parameter may be NULL in which case both B and C default to 0.5.
In either case, n must be set to a power of two plus one and less than
or equal to 1025 and weights must point to n GLfloat's worth of memory.
After the coefficients are successfully generated and saved in weights,
TexFilterFuncSGIS is then called to save them as state information.
Note that gluTexFilterFuncSGI only customizes filter4 filtering behavior;
filter4 still needs to be enabled by calling TexParameter with pname set
to TEXTURE_MIN_FILTER or TEXTURE_MAG_FILTER, and params set to
GL_FILTER4_SGIS.
gluTexFilterFuncSGI returns 0 upon success otherwise a GLU error code is
returned. See Errors.
Also see the TexFilterFuncSGIS specification.
GLenum target= GL_TEXTURE_2D;
GLfloat *weights, control[2];
GLint n, rc;
n = 33; /* (power of two) + 1 */
weights = (GLfloat *)malloc(n*sizeof(GLfloat));
rc= gluTexFilterFuncSGI(target, GLU_LAGRANGIAN_SGI,(const GLfloat *)0,
n, weights);
if (rc == 0) {
printf("Success!\n");
/* glTexFilterFuncSGIS(target, GL_FILTER4_SGIS, n,
* (const float *)weights);
* has been called within gluTexFilterFuncSGI.
*/
}
else {
printf("Failure! %s\n",gluErrorString(rc));
}
/* enable filter4 */
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_FILTER4_SGIS);
glTexParameteri(target, GL_TEXTURE_MAX_FILTER, GL_FILTER4_SGIS);
...
control[0] = 0.45; /* Set "B" control value */
control[1] = 0.35; /* Set "C" control value */
rc= gluTexFilterFuncSGI(target, GLU_MITCHELL_NETRAVALI_SGI,
(const GLfloat *)control, n, weights);
if (rc == 0) {
printf("Success!\n");
/* glTexFilterFuncSGIS(target, GL_FILTER4_SGIS, n,
* (const float *)weights);
* has been called within gluTexFilterFuncSGI.
*/
}
else {
printf("Failure! %s\n",gluErrorString(rc));
}
Errors
GLU_INVALID_OPERATION is returned if either GL_SGIS_texture_filter4 or
GLU_SGI_filter4_parameters is not supported.
GLU_INVALID_ENUM is returned if target is neither GL_TEXTURE_1D nor
GL_TEXTURE_2D.
GLU_INVALID_ENUM is returned if filtertype is neither GLU_LAGRANGIAN_SGI
nor GLU_MITCHELL_NETRAVALI_SGI.
GLU_INVALID_VALUE is returned if n is not a power of two plus one.
GLU_INVALID_VALUE is returned if n exceeds 1025.
GLU_INVALID_VALUE is returned if filtertype is GLU_LAGRANGIAN_SGI
and parms is not NULL.