Name IMG_texture_filter_cubic Name Strings GL_IMG_texture_filter_cubic Notice Copyright Imagination Technologies Limited, 2014. Contributors Simon Fenney, Imagination Technologies Ben Bowman, Imagination Technologies Contact Tobias Hector, Imagination Technologies (tobias.hector 'at' imgtec.com) Status Complete Version 0.5, 08 July 2015 Number Unassigned Dependencies This extension is written against version 3.0.3 of the OpenGL ES 3.0 API Specification. OpenGL ES 1.0 is required. Overview OpenGL ES provides two sampling methods available; nearest neighbor or linear filtering, with optional MIP Map sampling modes added to move between differently sized textures when downsampling. This extension adds an additional, high quality cubic filtering mode, using a Catmull-Rom bicubic filter. Performing this kind of filtering can be done in a shader by using 16 samples, but this can be inefficient. The cubic filter mode exposes an optimized high quality texture sampling using fixed functionality. This extension affects the way textures are sampled, by modifying the way texels within the same MIP-Map level are sampled and resolved. It does not affect MIP-Map filtering, which is still limited to linear or nearest. New Procedures and Functions None. New Tokens Accepted by the parameters of TexParameterf, TexParameterfv, TexParameteri, TexParameteriv, SamplerParameterf, SamplerParameterfv, SamperParameteri and SamplerParameteriv, and returned in by GetTexParameterfv, GetTexParameteriv, GetSamplerParameterfv and GetSamplerParameteriv when is TEXTURE_MIN_FILTER or TEXTURE_MAG_FILTER in either case: CUBIC_IMG 0x9139 Accepted as above only when is TEXTURE_MIN_FILTER: CUBIC_MIPMAP_NEAREST_IMG 0x913A CUBIC_MIPMAP_LINEAR_IMG 0x913B Changes to Chapter 3 of the OpenGL ES 3 API Specification -- Section 3.8.7 "Texture Parameters" Add the following to the TEXTURE_MIN_FILTER entry in Table 3.20: Name Type Legal Values -------------------------- ------ -------------------------- TEXTURE_MIN_FILTER enum CUBIC_MIPMAP_NEAREST_IMG CUBIC_MIPMAP_LINEAR_IMG CUBIC_IMG Add the following to the TEXTURE_MAG_FILTER entry in Table 3.20: Name Type Legal Values -------------------------- ------ -------------------------- TEXTURE_MAG_FILTER enum CUBIC_IMG -- Section 3.8.10 "Texture Minification" Modify the third sentence in the first paragraph to read: In the GL this mapping is approximated by one of three simple filtering schemes. Add a section immediately before "Rendering Feedback Loops" that describes cubic filtering. When the value of TEXTURE_MIN_FILTER is CUBIC_IMG, a 4 x 4 square of texels in the image array of level levelbase is selected. Let i0 = wrap([u'-1.5]) j0 = wrap([v'-1.5]) i1 = wrap([u'-0.5]) j1 = wrap([v'-0.5]) i2 = wrap([u'+0.5]) j2 = wrap([v'+0.5]) i3 = wrap([u'+1.5]) j3 = wrap([v'+1.5]) a = frac(u' - 0.5) b = frac(v' - 0.5) Catmull-Rom splines are used to evaluate the final texture color, as these exhibit the following desirable properties: - If the sample location lies exactly on a texel centre, it will return that texel value. - This means that a 1:1 sampling (with the appropriate offset) will return the original data. - This matches the behaviour of bilinear sampling. - Although the bilinear function is continuous at the junctions between neighboring sets of filtered regions, the first derivative is discontinuous. - The Catmull-Rom has the advantage of having a continuous first derivative. Catmull-Rom splines are evaluated using four points along an axis, and only operate in one dimension. To apply these to the 4x4 square of samples needed for a bicubic filter, each row is evaluated in turn, according to the equation for each row rn = clamp(ri1jn + ((-0.5 * ri0jn) + (0.5 * ri2jn)) * a + (ri0jn - (2.5 * ri1jn) + (2 * ri2jn) - (0.5 * ri3jn)) * a^2 + ((-0.5 * ri0jn) + (1.5 * ri1jn) - (1.5 * ri2jn) - 0.5 * ri3jn) * a^3) where n is the index of each row, r is the result for a given row, and clamp(x) returns the gives a value of x that has been restricted to between the minimum and maximum allowable value by the color format. The final color is then calculated using the same equation, replacing rij with the evaluated value for each row (rj) along the y-axis, according to v'. Only two-dimensional textures are supported by cubic filtering; three- dimensional textures will result in an incomplete texture, as defined in section 3.8.13. For two-dimensional array textures, all texels are obtained from layer l, where l = clamp([r + 0.5], 0, dt-1): Modify the last bullet point in the "Rendering Feedback Loops" subsection to read: - The value of TEXTURE_MIN_FILTER is NEAREST, LINEAR or CUBIC_IMG, and the value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for attachment point A is equal to the value of levelbase -or- The value of TEXTURE_MIN_FILTER is NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, LINEAR_MIPMAP_LINEAR, CUBIC_MIPMAP_NEAREST_IMG or CUBIC_MIPMAP_LINEAR_IMG, and the value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for attachment point A is within the inclusive range from levelbase to q (see below). Add references to the new tokens in the first paragraph of the "Mipmapping" subsection: TEXTURE_MIN_FILTER values NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, LINEAR_MIPMAP_LINEAR, CUBIC_MIPMAP_NEAREST_IMG and CUBIC_MIPMAP_LINEAR_IMG each require the use of a mipmap. A mipmap is an ordered set of arrays representing the same image; each array has a resolution lower than the previous one. Add references to the new tokens in the "Mipmapping" subsection: For mipmap filters NEAREST_MIPMAP_NEAREST, LINEAR_MIPMAP_NEAREST, and CUBIC_MIPMAP_NEAREST_IMG, the dth mipmap array is selected, where (Figure 3.21) The rules for NEAREST, LINEAR or CUBIC_IMG filtering are then applied to the selected array. Specifically, the coordinate (u, v, w) is computed as in equation 3.17, with wt, ht, and dt equal to the width, height, and depth of the image array whose level is d. For mipmap filters NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_LINEAR and CUBIC_MIPMAP_LINEAR_IMG, the level d1 and d2 mipmap arrays are selected, where (Figure 3.22) (Figure 3.23) The rules for NEAREST, LINEAR or CUBIC_IMG filtering are then applied to each of the selected arrays, yielding two corresponding texture values r1 and r2. Specifically, for level d1, the coordinate (u, v, w) is computed as in equation 3.17, with wt, ht, and dt equal to the width, height, and depth of the image array whose level is d1. For level d2 the coordinate (u', v', w') is computed as in equation 3.17, with wt, ht, and dt equal to the width, height, and depth of the image array whose level is d2. The final texture value is then found as r = [1 frac(h)]r1 + frac(h)r2 -- Section 3.8.11 "Texture Magnification" Modify the first paragraph to read: When ,\ indicates magnification, the value assigned to TEXTURE_MAG_FILTER determines how the texture value is obtained. There are three possible values for TEXTURE_MAG_FILTER: NEAREST, LINEAR and CUBIC_IMG. NEAREST behaves exactly as NEAREST for TEXTURE_MIN_FILTER, LINEAR behaves exactly as LINEAR for TEXTURE_MIN_FILTER and CUBIC_IMG behaves exactly as CUBIC_IMG for TEXTURE_MIN_FILTER as described in section 3.8.10, including the texture coordinate wrap modes specified in table 3.19. The level-of-detail levelbase texel array is always used for magnification. -- Section 3.8.13 "Texture Completeness" Modify the last paragraph of the introduction section to read: Using the preceding definitions, a texture is complete unless any of the following conditions hold true: - Any dimension of the levelbase array is not positive. - The texture is a cube map texture, and is not cube complete. - The minification filter requires a mipmap (is not NEAREST, LINEAR or CUBIC_IMG), and the texture is not mipmap complete. - The internalformat specified for the texture arrays is a sized internal color format that is not texture-filterable (see table 3.12), and either the magnification filter is not NEAREST or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. - The internalformat specified for the texture arrays is a sized internal depth or depth and stencil format (see table 3.13), the value of TEXTURE_COMPARE_MODE is NONE, and either the magnification filter is not NEAREST or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. - The texture target is TEXTURE_3D or TEXTURE_CUBE_MAP, and either the magnification filter is CUBIC_IMG or the minification filter is CUBIC_IMG, CUBIC_MIPMAP_NEAREST_IMG or CUBIC_MIPMAP_LINEAR_IMG. - The bit depth of any of the texture's channels is greater than 8 bits, and either the magnification filter is CUBIC_IMG or the minification filter is CUBIC_IMG, CUBIC_MIPMAP_NEAREST_IMG or CUBIC_MIPMAP_LINEAR_- IMG. - The texture format is in sRGB colorspace. Changes to Chapter 4 of the OpenGL ES 3 API Specification -- Section 4.4.3 "Feedback Loops Between Textures and the Framebuffer" Modify the last two bullet points in "Rendering Feedback Loops" after "while either of the following is true:" to read: - the value of TEXTURE_MIN_FILTER for texture object T is NEAREST, LINEAR or CUBIC_IMG, and the value of FRAMEBUFFER_ATTACHMENT_TEXTURE_- LEVEL for attachment point A is equal to the value of TEXTURE_BASE_- LEVEL for the texture object T - the value of TEXTURE_MIN_FILTER for texture object T is one of NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, LINEAR_MIPMAP_LINEAR, CUBIC_MIPMAP_NEAREST_IMG, or CUBIC_MIPMAP_- LINEAR_IMG, and the value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for attachment point A is within the range specified by the current values of TEXTURE_BASE_LEVEL to q, inclusive, for the texture object T. (q is defined in the Mipmapping discussion of section 3.8.10). Changes to OES_EGL_image_external: -- Section 3.7.4 "Texture Parameters" Change the whole paragraph specified to: "When is TEXTURE_EXTERNAL_OES only NEAREST, LINEAR and CUBIC_IMG are accepted as TEXTURE_MIN_FILTER and only CLAMP_TO_EDGE is accepted as TEXTURE_WRAP_S and TEXTURE_WRAP_T. Attempting to set other values for TEXTURE_MIN_FILTER, TEXTURE_WRAP_S, or TEXTURE_WRAP_T will result in an INVALID_ENUM error." -- Section 3.7.14 "External Textures" Change the third sentence specified to: "It is an INVALID_ENUM error to set the min filter value to anything other than LINEAR, NEAREST or CUBIC_IMG." Errors None. New State None. New Implementation Dependent State None. Issues None Revision History 0.5 08/07/2015 tjh: Corrected restrictions on formats and texture types by adding language to texture completeness. 0.4, 25/09/2014 tjh: Updated to latest OpenGL ES 3.0 specification. 0.3, 17/06/2013 tjh: First complete draft. 0.2, 22/04/2013 tjh: Second revision. 0.1, 01/07/2011 bcb: Initial revision.