Name ARB_texture_filter_minmax Name Strings GL_ARB_texture_filter_minmax Contact Jon Leech (oddhack 'at' sonic.net) 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 Notice Copyright (c) 2015 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html Specification Update Policy Khronos-approved extension specifications are updated in response to issues and bugs prioritized by the Khronos OpenGL Working Group. For extensions which have been promoted to a core Specification, fixes will first appear in the latest version of that core Specification, and will eventually be backported to the extension document. This policy is described in more detail at https://www.khronos.org/registry/OpenGL/docs/update_policy.php Status Complete. Approved by the ARB on June 26, 2015. Ratified by the Khronos Board of Promoters on August 7, 2015. Version Version 6, April 20, 2015 Number ARB Extension #188 Dependencies This extension is written against the OpenGL 4.5 Specification (Core Profile), dated February 2, 2015. OpenGL 3.3 is required. This extension interacts with EXT_texture_filter_anisotropic. Overview In unextended OpenGL, 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_ARB) 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}, TextureParameterI{u}iv, GetTextureParameter{i f}v, and GetTextureParameterI{u}iv: TEXTURE_REDUCTION_MODE_ARB 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}, and TextureParameterI{u}iv when is TEXTURE_REDUCTION_MODE_ARB: WEIGHTED_AVERAGE_ARB 0x9367 MIN (reused from core) MAX (reused from core) Modifications to the OpenGL 4.3 Specification (Compatibility Profile) Modify Section 8.10, Texture Parameters (add to Table 8.17, pp 227-228.) Name Type Legal Values -------------------------- ---- -------------------- TEXTURE_REDUCTION_MODE_ARB enum WEIGHTED_AVERAGE_ARB, MIN, MAX [[ jon - Note that the generalized error language for Tex*Parameter* and SamplerParameter* catches the pname/param mismatch for this parameter, previously mentioned explicitly in the "Errors" section of the EXT spec. ]] Modify Section 8.14.2, Coordinate Wrapping and Texel Selection (add below the equations specifying the values i_0, j_0, ... beta, gamma on p. 246): ... 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 (modify the last paragraph in the section, p. 251) 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 [[ Jon - this change is with regard to the 20150421 GL 4.5 spec update and the changes in the completeness list resulting from bug 12791 ]] (modify the last bullet in the section, p. 264, so that this point only applies when the reduction mode samples from two mip levels): * Any of - The internal format of the texture arrays is integer (see tables 8.19- 8.20), and the texture reduction mode is WEIGHTED_AVERAGE_ARB; - THe internal format is STENCIL_INDEX; - The internal format is DEPTH_STENCIL, the value of DEPTH_STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX, and the texture reduction mode is WEIGHTED_AVERAGE_ARB and either the magnification filter is not NEAREST, or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. (add a new bullet point expressing the constraints on supported texture formats) * The texture reduction mode is MIN or MAX, and that reduction mode is not supported for the texture dimensionality, multisample state, and internal format. Support for these reduction modes is only guaranteed in the following cases: - The texture is not multisampled (see section 8.8) - The internal format of the texture image is RED [[ Compatibility profile only: add LUMINANCE and INTENSITY ]] - The data type of the texture image is fixed- or floating-point. Implementations may also support these reduction modes for other formats. Such support can be determined by calling GetInternalformat* (see section 22.3) with TEXTURE_REDUCTION_MODE_ARB. Insert before Section 8.24, sRGB Texture Color Conversion (p. 271) Section 8.23post, 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_ARB 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_ARB 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_ARB is used. If a texture access using a reduction mode of MIN or MAX is used with a texture access with depth comparisons enabled (see section 8.23.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. Modify Section 22.3.1, Supported Operation Queries (add to the table of support pnames starting on p. 542) * TEXTURE_REDUCTION_MODE_ARB: Support for filtering with reduction modes MIN and MAX is returned in . Additions to the AGL/GLX/WGL Specifications None. New State Add to Table 23.23, Textures (state per sampler object) Initial Get Value Type Get Command Value Description Sec. -------------------------- ---- ----------------- -------------------- ------------------------ ----- TEXTURE_REDUCTION_MODE_ARB E GetTexParameteriv WEIGHTED_AVERAGE_ARB Texture reduction mode 8.10 (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. Interactions with the compatibility profile If the compatibility profile is supported, then LUMINANCE and INTENSITY are added to the list of formats guaranteed to support MIN and MAX reduction modes. Issues (1) What should this extension be called? RESOLVED: ARB_texture_filter_minmax, like EXT_texture_filter_minmax on which it is based. (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: This extension does not require support for DEPTH_COMPONENT textures with the new filter modes, but if they are supported, the per-sample comparison should be performed prior to the min/max reduction. This implies the MIN mode for TEXTURE_REDUCTION_MODE_ARB 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_ARB 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.5 doesn't 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_ARB 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_ARB 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_ARB work with stencil textures? RESOLVED: Yes. (6) What are the constraints on supported texture targets and formats? RESOLVED: After conducting a voting exercise, we concluded that the set of supported formats would be limited to single-channel (R/L/I), fixed- or floating-point, and that the GetInternalformat query should be used to expose support for additional formats. RESOLVED: Formats which don't support MIN/MAX reduction are treated as incomplete textures when those reduction modes are set. RESOLVED: TexParameter* does not generate an error when setting MIN/MAX reduction for unsupported texture types. This can't catch all misuse even when not using separate sampler objects, so only having the mismatch affect completeness seems cleaner. DISCUSSION: Different vendors all had different constraints. There were problems with multi-channel textures, multisampled textures, integer textures, and depth component and stencil index textures. Revision History Version 1, 2015/02/20 (Jon Leech) - Branch from EXT_texture_filter_minmax and add issue 6 from ARB discussion. Version 2, 2015/02/25 (Jon Leech) - Rebase against GL 4.5 and change suffixes to ARB. Change minimum required GL version from 1.0 to 3.3 (which is where SamplerParameter* commands were introduced). Add constraints on texture types guaranteed to support MIN/MAX reduction in sections 8.17, and query for additional supported types in section 22.3.1. Remove no longer needed Errors section. Update issue 6 with proposed resolution of the format compatibility issue. Version 3, 2015/02/26 (Jon Leech) - Remove DEPTH_COMPONENT from formats guaranteed to be supported, and add LUMINANCE and INTENSITY in the compatibility profile. Clean up state table entry. Version 4, 2015/03/20 (Jon Leech) - Remove nonexistent GREEN and BLUE internal formats. Remove restriction to two-dimensional images (Intel determined they do not require it). Update issues 3 and 6 to track restrictions of various vendor hardware. Version 5, 2015/04/01 (Jon Leech) - Reduce required format support to single-channel (R/L/I), fixed- and floating-point textures only. Remove guaranteed ALPHA format support in the compatibility profile. Reflow text of Issues. Version 6, 2015/04/20 (Jon Leech) - Modify edits to the completeness conditions in section 8.17 based on changes to the GL spec in this area (Bug 12791).