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.