| 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 <pname> 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 <param> or <params> 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 <pname> |
| 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 <x> 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 <x> 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 <N> 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 |
| <pname> of TEXTURE_REDUCTION_MODE_EXT and a <param> value or value pointed |
| to by <params> 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. |