| Name |
| |
| ARB_texture_gather |
| |
| Name Strings |
| |
| GL_ARB_texture_gather |
| |
| Contact |
| |
| Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) |
| Bill Licea-Kane, AMD ( Bill.Licea-Kane 'at' amd.com ) |
| Eric Werness, NVIDIA Corporation (ewerness 'at' nvidia.com) |
| |
| Contributors |
| |
| Pierre Boudier, AMD |
| Eric Boumaour, AMD |
| Pat Brown, NVIDIA |
| Alex Chalfin, AMD |
| Nick Haemel, AMD |
| Evan Hart, AMD |
| Bill Licea-Kane, AMD |
| Benj Lipchak, AMD |
| Lijun Qu, AMD |
| Greg Roth, NVIDIA |
| Eric Werness, NVIDIA |
| |
| Notice |
| |
| Copyright (c) 2009-2014 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Status |
| |
| Complete. Approved by the ARB on July 3, 2009. |
| |
| Version |
| |
| Last Modified Date: 02/26/2014 |
| Revision: 8 |
| |
| Number |
| |
| ARB Extension #72 |
| |
| Dependencies |
| |
| OpenGL 1.1 is required. |
| |
| OpenGL Shading Language version 1.30 is required. |
| |
| This extension is written against the OpenGL 3.0 Specification |
| (Compatibility Profile) and Version 1.30 of the OpenGL Shading Language |
| Specification. |
| |
| This extension interacts with the EXT_texture_swizzle and |
| ARB_texture_swizzle extensions. |
| |
| |
| Overview |
| |
| This extension provides a new set of texture functions |
| (textureGather) to the shading language that determine 2x2 footprint |
| that are used for linear filtering in a texture lookup, and return a |
| vector consisting of the first component from each of the four |
| texels in the footprint. |
| |
| |
| New Procedures and Functions |
| |
| None. |
| |
| New Tokens |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, |
| GetFloatv, and GetDoublev: |
| |
| MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E |
| MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F |
| MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F |
| |
| Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation) |
| None. |
| |
| Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) |
| |
| Changes to section 3.8.8 |
| |
| In subsection Scale Factor and Level of Detail replace the sentence |
| beginning "If any of the offset values are outside the range of..." |
| (P. 204) with |
| |
| If the value of any non-ignored component of the offset vector |
| operand is outside implementation-dependent limits, the results of |
| the texture lookup are undefined. For all instructions except |
| textureGather, the limits are MIN_PROGRAM_TEXEL_OFFSET_ARB and |
| MAX_PROGRAM_TEXEL_OFFSET_ARB. For the textureGather instruction, |
| the limits are MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB and |
| MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB. |
| |
| Add to subsection Coordinate Wrapping and Texel Selection |
| (P. 208, Prior to "And for a one-dimensional texture"): |
| |
| The textureGather and textureGatherOffset built-in shader functions |
| return a vector derived from sampling a 2x2 block of texels in the image |
| array of level <level_base>. The rules for the LINEAR minification |
| filter are applied to identify the four selected texels. Each texel is |
| then converted to a texture source color (Rs,Gs,Bs,As) according to table |
| 3.21 and then swizzled as described in the ARB_texture_swizzle extension. |
| A four-component vector is then assembled by taking the Rs component from |
| the swizzled texture source colors of the four texels, in the order |
| T_i0_j1, T_i1_j1, T_i1_j0, and T_i0_j0. Incomplete textures (section |
| 3.8.10) are considered to return a texture source color of (0,0,0,1) for |
| all four source texels. |
| |
| ___________________________________________________________________ |
| | | |
| | 1.0 +---+---+---+---+---+---+---+---+ | |
| | 7| | | | | | | | | | |
| | +---+---+---+---+---+---+---+---+ | |
| | 6| | | | | | X | Y | | | |
| | +---+---+---+---+---+---+---+---+ | |
| | 5| | | | | | W | Z | | | |
| | +---+---+---+---+---+---+---+---+ | |
| | 4| | | | | | | | | | |
| | +---+---+---+---+---+---+---+---+ | |
| | 3| | | | | | | | | | |
| | +---+---+---+---+---+---+---+---+ | |
| | 2| | | | | | | | | | |
| | +---+---+---+---+---+---+---+---+ | |
| | 1| | | | | | | | | | |
| | +---+---+---+---+---+---+---+---+ | |
| | 0| | | | | | | | | | |
| | 0.0 +---+---+---+---+---+---+---+---+ | |
| | 0 1 2 3 4 5 6 7 | |
| | 0.0 1.0 | |
| | | |
| | Figure 3.10a. An example of an 8x8 texture image and the | |
| | components returned for textureGather. The vector (X,Y,Z,W) | |
| | is returned, where each component is taken from the post- | |
| | swizzle R component of the corresponding texel. | |
| |_________________________________________________________________| |
| |
| |
| Add to Section 3.12.2, Shader Execution, Texture Access |
| |
| (p. 233) Prior to paragraph beginning "If a fragment shader uses a |
| sampler..." |
| |
| Texture lookups using textureGather must only be performed on |
| textures with supported formats. |
| MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB determines what formats |
| are supported. If the value is one, only RED, ALPHA, LUMINANCE, |
| INTENSITY, DEPTH, and DEPTH_STENCIL are supported. If the value is |
| four, all internal formats are supported. When textureGather is |
| used to sample a texture with an unsupported format, the results |
| are undefined. |
| |
| Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment |
| Operations and the Frame Buffer) |
| |
| None. |
| |
| Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions) |
| |
| None. |
| |
| Additions to Chapter 6 of the OpenGL 2.0 Specification (State and |
| State Requests) |
| |
| None. |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None |
| |
| GLX Protocol |
| |
| TBD |
| |
| Errors |
| |
| None. |
| |
| New State |
| |
| None. |
| |
| New Implementation Dependent State |
| Minimum |
| Get Value Type Get Command Value Description Sec. Attrib |
| -------------------------------- ---- --------------- ------- --------------------- ------ ------ |
| MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB Z GetIntegerv -- Min. texel offset 3.8.8 - |
| for textureGather |
| MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB Z+ GetIntegerv -- Max. texel offset 3.8.8 - |
| for textureGather |
| MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB Z+ GetIntegerv -- Max. format components 3.8.8 - |
| for textureGather |
| |
| |
| Modifications to The OpenGL Shading Language Specification, Version 1.10.59 |
| |
| Including the following line in a shader can be used to control the |
| language features described in this extension: |
| |
| #extension GL_ARB_texture_gather |
| |
| A new preprocessor #define is added to the OpenGL Shading Language: |
| |
| #define GL_ARB_texture_gather 1 |
| |
| Change section 4.3.6 "Varying" |
| |
| Add to section 8.7 "Texture Lookup Functions" |
| |
| Syntax: |
| |
| gvec4 textureGather(gsampler2D sampler, vec2 coord) |
| gvec4 textureGather(gsampler2DArray sampler, vec3 coord) |
| gvec4 textureGather(gsamplerCube sampler, vec3 coord) |
| gvec4 textureGather(gsamplerCubeArray sampler, vec4 coord) |
| |
| Description: |
| |
| The textureGather functions use the texture coordinates given by |
| <coord> to determine a set of four texels to sample from the texture |
| identified by <sampler>. These functions return a four-component |
| vector consisting of one component from each texel. As described in |
| the OpenGL Specification, the vector selects the post-swizzle R |
| component from each of the four texels, returning: |
| |
| vec4(T_i0_j1(coord, base).r, |
| T_i1_j1(coord, base).r, |
| T_i1_j0(coord, base).r, |
| T_i0_j0(coord, base).r) |
| |
| Syntax: |
| |
| gvec4 textureGatherOffset(gsampler2D sampler, vec2 coord, ivec2 offset) |
| gvec4 textureGatherOffset(gsampler2DArray sampler, vec3 coord, |
| ivec2 offset) |
| |
| Description: |
| |
| Perform a texture gather operation as in textureGather offset by |
| <offset> as described in textureOffset except that the |
| implementation-dependent minimum and maximum offset values are |
| given by MIN_PROGRAM_TEXTURE_GATHER_OFFSET and |
| MAX_PROGRAM_TEXTURE_GATHER_OFFSET respectively. |
| |
| Dependencies on ARB_texture_swizzle and EXT_texture_swizzle |
| |
| If neither ARB_texture_swizzle nor EXT_texture_swizzle is supported, |
| remove the swizzling step from the description of the textureGather |
| functions in the OpenGL specification. |
| |
| Issues |
| |
| (1) What about the use of this extension with fixed function? |
| |
| RESOLVED: The built-in functions are added to the shading |
| language only. There is no ability to fetch four texels in |
| fixed function. |
| |
| (2) What naming convention do we use for the new texture built-in |
| functions? |
| |
| RESOLVED: Even though this extension is written against OpenGL |
| Shading Language 1.20, we use the new texture function naming |
| convention from OpenGL Shading Language 1.30. |
| |
| (3) Should we add built-in texture functions for: |
| * Fetch4 with Absolute LOD? |
| * Fetch4 with Relative LOD? |
| * Fetch4 with coordinate offsets? |
| * Fetch4 with compare? |
| |
| RESOLVED: No. |
| |
| (4) If the texture wrap modes are not clamp_to_edge or repeat, is |
| the texture treated as incomplete, or are the values returned by |
| the textureGather built-in undefined? |
| |
| RESOLVED: All wrap modes will be supported and textureGather will |
| return correct results. |
| |
| (5) Can both texture *AND* textureGather built-in functions |
| sample from the same sampler in a shader? |
| |
| RESOLVED: Yes. |
| |
| (6) How do the textureGather functions work with sRGB textures? |
| |
| RESOLVED. Gamma-correction is applied to the texture source color |
| before "gathering". For each of the four texels sampled, the R, G, |
| and B components will be gamma-corrected. With a default texture |
| swizzle, textureGather will always pick the red component from each |
| of the four texels, so will return a vector with four |
| gamma-corrected values. If the R texture swizzle is set to ALPHA, |
| four alpha values will be selected and those values will have no |
| gamma-correction appplied. |
| |
| (7) Should textureGather lookups from multiple component formats be |
| allowed? |
| |
| RESOLVED: This extension was derived from NV_gpu_shader4_1 (which |
| supported selecting the R component of multi-component textures) |
| and AMD_texture_texture4 (which didn't). To accommodate all |
| implementations, an implementation-dependent query is provided to |
| indicating the allowed number of components in a gathered texture |
| is used. |
| |
| (8) How does texture gather interact with incomplete textures? |
| |
| RESOLVED: For regular texture lookups, incomplete textures are |
| considered to return a texel value with RGBA components of (0,0,0,1). |
| For texture gather operations, each texel in the sampled footprint is |
| considered to have RGBA components of (0,0,0,1). Since this extension |
| selects the R texture component of each texel in a four-texel |
| footprint, a textureGather() function accessing an incomplete texture |
| will return (0,0,0,0). |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- -------- -------------------------------------------- |
| 8 02/26/14 Jon Leech Change MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB |
| type from Z+ to Z (Bug 11730). |
| |
| 7 01/27/11 pbrown Add further clarification on the interaction |
| of texture gather and incomplete textures |
| bug 7289). |
| |
| 6 09/23/10 pbrown Clarify the interaction of texture gather |
| with swizzle (bug 5910), fixing conflicts |
| between API and GLSL spec language. |
| Consolidate into one copy in the API |
| spec. Fix incorrect resolution on issue |
| (5). Minor wording updates to issues. |
| |
| 5 08/02/09 Jon Leech Reformat to 80 columns and assign ARB |
| extension number. |
| |
| 4 07/20/09 Jon Leech Assign missing enumerant value |
| |
| 3 05/25/09 groth Remove *offset accesses to cubemap textures |
| |
| 2 05/29/09 groth Add query for max gatherable components |
| remove undefined behavior for wrap modes |
| |
| 1 05/14/09 groth Initial revision |