Name EXT_texture_filter_minmax Name Strings GL_EXT_texture_filter_minmax Contact Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) Contributors Jeff Bolz, NVIDIA Corporation Mark Kilgard, NVIDIA Corporation Eric Werness, NVIDIA Corporation James Helferty, NVIDIA Corporation Daniel Koch, NVIDIA Corporation Status Shipping Version Last Modified Date: March 27, 2015 Revision: 2 Number OpenGL Extension #464 OpenGL ES Extension #227 Dependencies This extension is written against the OpenGL 4.3 Specification (Compatibility Profile), dated February 14, 2013. OpenGL 1.0 is required. This extension interacts with EXT_texture_filter_anisotropic. This extension interacts with EXT_direct_state_access. This extension interacts with OpenGL ES 3.1 (June 4, 2014). When implemented for OpenGL ES 3.1, this extension interacts with EXT_texture_border_clamp. When implemented for OpenGL ES 3.1, this extension interacts with OES_texture_stencil8. Overview In unextended OpenGL 4.3, minification and magnification filters such as LINEAR allow texture lookups to returned a filtered texel value produced by computing an weighted average of a collection of texels in the neighborhood of the texture coordinate provided. This extension provides a new texture and sampler parameter (TEXTURE_REDUCTION_MODE_EXT) which allows applications to produce a filtered texel value by computing a component-wise minimum (MIN) or maximum (MAX) of the texels that would normally be averaged. The reduction mode is orthogonal to the minification and magnification filter parameters. The filter parameters are used to identify the set of texels used to produce a final filtered value; the reduction mode identifies how these texels are combined. New Procedures and Functions None. New Tokens Accepted by the parameter to SamplerParameter{i f}{v}, SamplerParameterI{u}iv, GetSamplerParameter{i f}v, GetSamplerParameterI{u}iv, TexParameter{i f}{v}, TexParameterI{u}iv, GetTexParameter{i f}v, GetTexParameterI{u}iv, TextureParameter{i f}{v}EXT, TextureParameterI{u}ivEXT, GetTextureParameter{i f}vEXT, GetTextureParameterI{u}ivEXT, MultiTexParameter{i f}{v}EXT, MultiTexParameterI{u}ivEXT, GetMultiTexParameter{i f}vEXT, and GetMultiTexParameterI{u}ivEXT: TEXTURE_REDUCTION_MODE_EXT 0x9366 Accepted by the or parameter to SamplerParameter{i f}{v}, SamplerParameterI{u}iv, TexParameter{i f}{v}, TexParameterI{u}iv, TextureParameter{i f}{v}EXT, TextureParameterI{u}ivEXT, MultiTexParameter{i f}{v}EXT, or MultiTexParameterI{u}ivEXT when is TEXTURE_REDUCTION_MODE_EXT: WEIGHTED_AVERAGE_EXT 0x9367 MIN (reused from core) MAX (reused from core) Modifications to the OpenGL 4.3 Specification (Compatibility Profile) Modify Section 8.10, Texture Parameters (p. 241) (add to Table 8.24, pp. 241-243) Name Type Legal Values -------------------------- ---- -------------------- TEXTURE_REDUCTION_MODE_EXT enum WEIGHTED_AVERAGE_EXT, MIN, MAX Modify Section 8.14.2, Coordinate Wrapping and Texel Selection (p. 254) (add below the equations specifying the values i_0, j_0, ... beta, gamma) ... where frac(x) denotes the fractional part of and may be quantized to a fixed-point value with implementation-dependent precision. Modify Section 8.14.3, Mipmapping (p. 259) (modify the last paragraph in the section, p. 261) The final texture value is then found as: tau = (1 - frac(lambda)) * tau_1 + frac(lambda) * tau_2, where frac(x) denotes the fractional part of and may be quantized to a fixed-point value with implementation-dependent precision. Modify Section 8.17, Texture Completeness (p. 263) (modify the last two bullets in the section, p. 264) * The internal format of the texture arrays is integer (see tables 8.19- 8.20), the texture reduction mode is WEIGHTED_AVERAGE_EXT, and either the magnification filter is not NEAREST, or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. * The internal format of the texture is DEPTH_STENCIL, the DEPTH_- STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX, the texture reduction mode is WEIGHTED_AVERAGE_EXT, and either the magnification filter or the minification filter is not NEAREST. Insert before Section 8.23, sRGB Texture Color Conversion (p. 279) Section 8.X, Texture Reduction Modes When using minification and magnification filters such as LINEAR, or when using anisotropic texture filtering, the values of multiple texels will normally be combined using a weighted average to produce a filtered texture value. However, a filtered texture value may also be produced by computing per-component minimum and maximum values over the set of texels that would normally be averaged. The texture and sampler parameter TEXTURE_REDUCTION_MODE_EXT controls the process by which multiple texels are combined to produce a filtered texture value. When set to its default state of WEIGHTED_AVERAGE_EXT, a weighted average will be computed, as described in previous sections. When TEXTURE_REDUCTION_MODE_EXT is MIN or MAX, the equations to produce a filtered texel value for LINEAR minification or magnification filters (equation 8.10 and subsequent unnumbered ones) are replaced with tau = reduce((1-alpha)*(1-beta)*(1-gamma), tau_i0_j0_k0, ( alpha)*(1-beta)*(1-gamma), tau_i1_j0_k0, (1-alpha)*( beta)*(1-gamma), tau_i0_j1_k0, ( alpha)*( beta)*(1-gamma), tau_i1_j1_k0, (1-alpha)*(1-beta)*( gamma), tau_i0_j0_k1, ( alpha)*(1-beta)*( gamma), tau_i1_j0_k1, (1-alpha)*( beta)*( gamma), tau_i0_j1_k1, ( alpha)*( beta)*( gamma), tau_i1_j1_k1), tau = reduce((1-alpha)*(1-beta), tau_i0_j0, ( alpha)*(1-beta), tau_i1_j0, (1-alpha)*( beta), tau_i0_j1, ( alpha)*( beta), tau_i1_j1), or tau = reduce((1-alpha), tau_i0, ( alpha), tau_i1) for three-, two-, and one-dimensional texture accesses, respectively. The function reduce() is defined to operate on pairs of weights and texel values. If the reduction mode is MIN or MAX, reduce() computes a component-wise minimum or maximum, respectively, of the R, G, B, and A components of the set of provided texels with non-zero weights. For minification filters involving two texture levels (NEAREST_MIPMAP_LINEAR and LINEAR_MIPMAP_LINEAR), filtered values for the two selected levels, tau_1 and tau_2, are produced as described in section 8.14.3, but using the reductions described immediately above. The two filtered values will be combined to generate a final result using the equation tau = reduce((1-frac(lambda)), tau_1, ( frac(lambda)), tau_2), where tau_1 and tau_2 are filtered values for levels d_1 and d_2, and frac(lambda) is the fractional portion of the texture level of detail and may be quantized to a fixed-point value with implementation-dependent precision. If anisotropic texture filtering is enabled, a reduction mode of WEIGHTED_AVERAGE_EXT will produce a filtered texel value by computing a weighted average of texel values, using an implementation-dependent set of selected texels and weights. When using reduction modes of MIN or MAX, a filtered texel value will be produced using the equation tau = reduce(tau_1, ..., tau_N) where tau_1 through tau_N are the texels that would be used with non-zero weights when a reduction mode of WEIGHTED_AVERAGE_EXT is used. If a texture access using a reduction mode of MIN or MAX is used with a texture access with depth comparisons enabled (section 8.22.1), the individual tau values used in the reduce() functions should reflect the results of the depth comparison (0.0 or 1.0), not the original values in the depth texture. Additions to the AGL/GLX/WGL Specifications None. Errors INVALID_ENUM is generated when SamplerParameter*, TexParameter*, TextureParameter*EXT, and MultiTextureParameter*EXT is called with a of TEXTURE_REDUCTION_MODE_EXT and a value or value pointed to by points that is not one of WEIGHTED_AVERAGE_EXT, MIN, or MAX. New State Add to Table 23.23, Textures (state per sampler object) Initial Get Value Type Get Command Value Description Sec. -------------------------- ---- ------------ --------- ------------------------ ----- TEXTURE_REDUCTION_MODE_EXT E GetTexParam- WEIGHTED_ Texture reduction mode 8.10 eteriv AVERAGE_EXT (average, minimum, maximum) New Implementation Dependent State None. Dependencies on EXT_texture_filter_anisotropic If EXT_texture_filter_anisotropic is not supported, references to anisotropic filtering in the discussion of texture reduction modes should be removed. Dependencies on EXT_direct_state_access If EXT_direct_state_access is not supported, references to these functions should be removed: TextureParameter{i f}{v}EXT, TextureParameterI{u}ivEXT, GetTextureParameter{i f}vEXT, GetTextureParameterI{u}ivEXT, MultiTexParameter{i f}{v}EXEXTT, MultiTexParameterI{u}ivEXT, GetMultiTexParameter{i f}vEXT, and GetMultiTexParameterI{u}ivEXT Interactions with EXT_texture_border_clamp References to each of the following functions should be decorated with the EXT suffix: SamplerParameterI{u}iv, GetSamplerParameterI{u}iv, TexParameterI{u}iv, and GetTexParameterI{u}iv If EXT_texture_border_clamp is not supported, all references to the above functions should be removed. Interactions with OpenGL ES 3.1 Ignore any earlier changes to the "Texture Completeness" section. In section 8.16 "Texture Completeness", Modify the last three bullets: * The effective internal format specified for the texture arrays is a sized internal color format that is not texture-filterable (see table 8.13), the texture reduction mode is WEIGHTED_AVERAGE_EXT, and either the magnification filter is not NEAREST or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. * The effective internal format specified for the texture arrays is a sized internal depth or depth and stencil format (see table 8.14), the value of TEXTURE_COMPARE_MODE is NONE, the texture reduction mode is WEIGHTED_AVERAGE_EXT, and either the magnification filter is not NEAREST or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. * The internal format of the texture is DEPTH_STENCIL, the value of DEPTH_STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX, the texture reduction mode is WEIGHTED_AVERAGE_EXT, and either the magnification filter or the minification filter is not NEAREST. Interactions with OES_texture_stencil8 Modify 3.8.13 "Texture Completeness" to change the bullet added by OES_texture_stencil8 to the list of reasons a texture would be complete: * The internal format of the texture is STENCIL_INDEX, the TEXTURE_REDUCTION_MODE_EXT parameter is WEIGHTED_AVERAGE_EXT, and either the magnification filter is not NEAREST or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. Issues (1) What should this extension be called? RESOLVED: EXT_texture_filter_minmax, as it allows for "min" and "max" operations during texture filtering. This follows the precedent of EXT_blend_minmax, which provides similar functionality for blending values in the framebuffer. (2) How does this extension interact with restrictions on min/mag filters textures with integer components? RESOLVED: In unextended OpenGL 4.3, a texture with integer components (e.g., RGBA8I) is considered incomplete if used with minification or magnification filters that normally average multiple samples (anything other than NEAREST and NEAREST_MIPMAP_NEAREST). This restriction exists to avoid the need to define semantics for computing a weighted average of integer values with non-integer weights, which will produce an arithmetic result that is not an integer. Given that the MIN and MAX reduction modes don't do any arithmetic and won't produce non-integer values, we allow these reduction modes to be used with arbitrary filters. (3) How does this extension interact with TEXTURE_COMPARE_MODE set to COMPARE_R_TO_TEXTURE for depth textures? RESOLVED: The per-sample comparison should be performed prior to the min/max reduction. This implies the MIN mode for TEXTURE_REDUCTION_MODE_EXT in this case returns a false value if *any* of the texels compare false; to return true, every comparison must be true. Likewise this implies the MAX mode for TEXTURE_REDUCTION_MODE_EXT in this case returns a true value if *any* of the texels compare true; to return false, every comparison must be false. Note that unextended OpenGL 4.3 doesn't actually require that linear filtering actually average depth comparison results of 0.0 and 1.0, but behaving this way appears to be common practice and may be required for other 3D graphics APIs. (4) Do interpolation weights figure into the min/max reductions? RESOLVED: Yes. Texels that would have a weight of zero for the normal WEIGHTED_AVERAGE_EXT reduction modes should not be considered when performing MIN or MAX reductions. Note that implementations may end up quantize the interpolation weights to fixed-point values with implementation-dependent precision. This may cause samples to be ignored in WEIGHTED_AVERAGE_EXT or MIN/MAX reductions. For example, if you are using a minification filter of LINEAR_MIPMAP_LINEAR and the computed LOD is 2.00001, the implementation may round the LOD as being exactly 2.0 and ignore the texels in level 3 for the purposes of trilinear filtering. (5) Should TEXTURE_REDUCTION_MODE_EXT work with stencil textures? RESOLVED: Yes. Revision History Revision 2, 2015/03/27 - Add ES interactions Revision 1 - Internal revisions.