skia / external / github.com / KhronosGroup / OpenGL-Registry / bc93187978b46e0baae0b8556071d6b292b0bb97 / . / extensions / SGI / GLU_SGI_filter4_parameters.txt

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