Name SGIS_texture_filter4 Name Strings GL_SGIS_texture_filter4 Version $Date: 1997/03/24 18:56:21 $ $Revision: 1.9 $ Number 7 Dependencies None Overview This extension allows 1D and 2D textures to be filtered using an application-defined, four sample per dimension filter. (In addition to the NEAREST and LINEAR filters defined in the original GL Specification.) Such filtering results in higher image quality. It is defined only for non-mipmapped filters. The filter that is specified must be symmetric and separable (in the 2D case). Issues * What should the default filter function be? - Implementation dependent. * Should this extension define 2-wide texture borders? Do we really want to aggrandize this border stuff :-( - No. * Should this extension define 2D filtering only (and not 1D)? - No. * A GLU function that accepts Mitchell parameters and a texture target should be defined. * This specification retains a separate filter function description with every texture. In conjunction with EXT_texture_object, this may result in a lot of filter functions. Implementations should optimize for the default filter function to save storage cost. Reasoning * The name is changed from "cubic" to "filter4" because the table allows the specification of filters that are not at all cubic in nature. A true cubic filter extension would define the filter function as a cubic polynomial. New Procedures and Functions void TexFilterFuncSGIS(enum target, enum filter, sizei n, const float* weights); void GetTexFilterFuncSGIS(enum target, enum filter, float* weights); New Tokens Accepted by the parameter of TexParameteri and TexParameterf, and by the parameter of TexParameteriv and TexParameterfv, when their parameter is TEXTURE_MIN_FILTER or TEXTURE_MAG_FILTER. Also accepted by the parameters of TexFilterFuncSGIS and GetTexFilterFuncSGIS: FILTER4_SGIS Accepted by the parameter of GetTexParameteriv and GetTexParameterfv, when the parameter is TEXTURE_1D or TEXTURE_2D: TEXTURE_FILTER4_SIZE_SGIS Additions to Chapter 2 of the GL Specification (OpenGL Operation) None Additions to Chapter 3 of the GL Specification (Rasterization) The additional token value FILTER4_SGIS is accepted as an enumerated value for the texture minification and magnification filters, causing Table 3.7 to be replaced with the table below: 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 TEXTURE_BORDER_COLOR 4 floats any 4 values in [0,1] Table 3.7: Texture parameters and their values. Filter4 filtering is specified by calling TexParameteri, TexParameterf, TexParameteriv, or TexParameterfv with set to one of TEXTURE_MIN_FILTER or TEXTURE_MAG_FILTER, and or set to FILTER4_SGIS. Because filter4 filtering is defined only for non-mipmapped textures, there is no difference between its definition for minification and magnification. First consider the 1-dimensional case. Let T be a computed texture value (one of R_t, G_t, B_t, or A_t). Let T[i] be the component value of the texel at location i in a 1-dimensional texture image. Then, if the appropriate texture filter mode is FILTER4_SGIS, a 4-texel group is selected: / floor(u - 1/2) mod 2**n, TEXTURE_WRAP_S is REPEAT i1 = ( \ floor(u - 1/2), TEXTURE_WRAP_S is CLAMP / (i1 + 1) mod 2**n, TEXTURE_WRAP_S is REPEAT i2 = ( \ i1 + 1, TEXTURE_WRAP_S is CLAMP / (i1 + 2) mod 2**n, TEXTURE_WRAP_S is REPEAT i3 = ( \ i1 + 2, TEXTURE_WRAP_S is CLAMP / (i1 - 1) mod 2**n, TEXTURE_WRAP_S is REPEAT i0 = ( \ i1 - 1, TEXTURE_WRAP_S is CLAMP Let f(x) be the filter weight function of positive distance x. Let A = frac(u - 1/2) where frac(x) denotes the fractional part of x, and u is the texture image coordinate in the s direction, as illustrated in Figure 3.10 of the GL Specification. Then the texture value T is found as T = f(1+A) * T[i0] + f(A) * T[i1] + f(1-A) * T[i2] + f(2-A) * T[i3] If any of the selected T[i] in the above equation refer to a border texel with unspecified value, then the border color given by the current setting of TEXTURE_BORDER_COLOR is used instead of the unspecified value. For 2-dimensional textures the calculations for i0, i1, i2, i3, and A are identical to the 1-dimensional case. A 16-texel group is selected, requiring four j values computed as / floor(v - 1/2) mod 2**m, TEXTURE_WRAP_T is REPEAT j1 = ( \ floor(v - 1/2), TEXTURE_WRAP_T is CLAMP / (j1 + 1) mod 2**m, TEXTURE_WRAP_T is REPEAT j2 = ( \ j1 + 1, TEXTURE_WRAP_T is CLAMP / (j1 + 2) mod 2**m, TEXTURE_WRAP_T is REPEAT j3 = ( \ j1 + 2, TEXTURE_WRAP_T is CLAMP / (j1 - 1) mod 2**m, TEXTURE_WRAP_T is REPEAT j0 = ( \ j1 - 1, TEXTURE_WRAP_T is CLAMP Let B = frac(v - 1/2) where v is the texture image coordinate in the t direction, as illustrated in Figure 3.10 of the GL Specification. Then the texture value T is found as T = f(1+A) * f(1+B) * T[i0,j0] + f(A) * f(1+B) * T[i1,j0] + f(1-A) * f(1+B) * T[i2,j0] + f(2-A) * f(1+B) * T[i3,j0] + f(1+A) * f(B) * T[i0,j1] + f(A) * f(B) * T[i1,j1] + f(1-A) * f(B) * T[i2,j1] + f(2-A) * f(B) * T[i3,j1] + f(1+A) * f(1-B) * T[i0,j2] + f(A) * f(1-B) * T[i1,j2] + f(1-A) * f(1-B) * T[i2,j2] + f(2-A) * f(1-B) * T[i3,j2] + f(1+A) * f(2-B) * T[i0,j3] + f(A) * f(2-B) * T[i1,j3] + f(1-A) * f(2-B) * T[i2,j3] + f(2-A) * f(2-B) * T[i3,j3] If any of the selected T[i,j] in the above equation refer to a border texel with unspecified value, then the border color given by the current setting of TEXTURE_BORDER_COLOR is used instead of the unspecified value. Filter4 texture filtering is currently undefined for 3-dimensional textures. Filter function --------------- The default filter function is implementation dependent. The filter function is specified in table format by calling TexFilterFuncSGIS with set to TEXTURE_1D or TEXTURE_2D, set to FILTER4_SGIS, and pointing an array of floating point values. The value must equal 2**m + 1 for some nonnegative integer value of m. The array contains samples of the filter function f(x), 0<=x<=2. Each element [i] is the value of f((2*i)/(-1)), 0<=i<=-1. The filter function is stored and used by GL as a set of samples f((2*i)/(Size-1)), 0<=i<=Size-1, where Size is an implementation dependent constant. If equals Size, the array is stored directly in GL state. Otherwise, an implementation dependent resampling method is used to compute the stored samples. Size must equal 2**m + 1 for some integer value of m greater than or equal to 4. The value Size for texture is returned by when GetTexParameteriv or GetTexParameterfv is called with set to TEXTURE_FILTER4_SIZE_SGIS. Minification vs. Magnification ------------------------------ If the magnification filter is given by FILTER4_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 GL Specification (Per-Fragment Operations and the Framebuffer) None Additions to Chapter 5 of the GL Specification (Special Functions) GetTexFilterFuncSGIS is not included in display lists. Additions to Chapter 6 of the GL Specification (State and State Requests) The filter weights for the filter4 filter associated with a texture are queried by calling GetTexFilterFuncSGIS with set to the texture target and set to FILTER4_SGIS. The Size weight values are returned in the array , which must have at least Size elements. The value Size is an implementation dependent constant that is queried by the application by calling GetTexParameteriv or GetTexParameterfv as described above. Additions to the GLX Specification None GLX Protocol Two new GL commands are added. The following rendering command is sent to the server as part of a glXRender request: TexFilterFuncSGIS 2 16*4n rendering command length 2 2064 rendering command opcode 4 ENUM target 4 ENUM filter 4 INT32 n n LISTofFLOATS weights The remaining command is a non-rendering command and as such, is sent separately (i.e., not as part of a glXRender or glXRenderLarge request), using the glXVendorPrivateWithReply request: GetTexFilterFuncSGIS 1 CARD8 opcode (X assigned) 1 17 GLX opcode (glXVendorPrivateWithReply) 2 5 request length 4 4101 vendor specific opcode 4 GLX_CONTEXT_TAG context tag 4 ENUM target 4 ENUM filter => 1 1 reply 1 unused 2 CARD16 sequence number 4 m reply length, m = (n==1 ? 0 : n) 4 unused 4 CARD32 n if (n=1) this follows: 4 FLOAT32 params 12 unused otherwise this follows: 16 unused n*4 LISTofFLOAT32 params Note that n may be zero, indicating that a GL error occurred. Errors INVALID_ENUM is generated if TexFilterFuncSGIS or GetTexFilterFuncSGIS parameter is not TEXTURE_1D or TEXTURE_2D. INVALID_ENUM is generated if TexFilterFuncSGIS or GetTexFilterFuncSGIS parameter is not FILTER4_SGIS. INVALID_VALUE is generated if TexFilterFuncSGIS parameter does not equal 2**m + 1 for some nonnegative integer value of m. INVALID_ENUM is generated if GetTexParameteriv or GetTexParameterfv parameter is TEXTURE_FILTER4_SIZE_SGIS and parameter is not TEXTURE_1D or TEXTURE_2D. INVALID_OPERATION is generated if TexFilterFuncSGIS or GetTexFilterFuncSGIS is executed between execution of Begin and the corresponding execution of End. New State Get Value Get Command Type Value Attrib --------- ----------- ---- ------- ------ TEXTURE_FILTER4_FUNC_SGIS GetTexFilterFuncSGIS 2 x Size x R see text texture New Implementation Dependent State Minimum Get Value Get Command Type Value --------- ----------- ---- ------- TEXTURE_FILTER4_SIZE_SGIS GetTexParameterfv R 17