| Name |
| |
| ARB_texture_cube_map_array |
| |
| Name Strings |
| |
| GL_ARB_texture_cube_map_array |
| |
| Contact |
| |
| Nick Haemel, AMD (nick.haemel 'at' amd.com) |
| |
| Contributors |
| Jeff Bolz, NVIDIA |
| Yunjun Zhang, AMD |
| Bill Licea-Kane, AMD |
| Graham Sellers, AMD |
| Daniel Koch, TransGaming |
| Mark Young, AMD |
| |
| Notice |
| |
| Copyright (c) 2009-2013 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: 12/07/2009 |
| Author revision: 9 |
| |
| Number |
| |
| ARB Extension #71 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 3.0 specification and |
| version 1.30.08 of the OpenGL Shading Language specification. |
| |
| Overview |
| |
| The GL_EXT_texture_array extension, and subsequently OpenGL 3.0 have |
| introduced the concept of one- and two-dimensional array textures. |
| An array texture is an ordered set of images with the same size and |
| format. Each image in an array texture has a unique level. This |
| extension expands texture array support to include cube map |
| textures. |
| |
| A cube map array texture is a 2-dimensional array texture that may |
| contain many cube map layers. Each cube map layer is a unique cube |
| map image set. Images in a cube map array have the same size and |
| format limitations as one- and two-dimensional array textures. A |
| cube map array texture is specified using TexImage3D in a similar |
| manner to two-dimensional arrays. Cube map array textures can be |
| bound to a render targets of a frame buffer object as |
| two-dimensional arrays are using FramebufferTextureLayer. |
| |
| When accessed by a programmable shader, a cube map array texture |
| acts as a single unit. The "s", "t", "r" texture coordinates are |
| treated as a regular cube map texture fetch. The "q" texture is |
| treated as an unnormalized floating-point value identifying the |
| layer of the cube map array texture. Cube map array texture lookups |
| do not filter between layers. |
| |
| This extension does not provide for the use of cube map array |
| textures with fixed-function fragment processing. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <target> parameter of TexParameteri, TexParameteriv, |
| TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap: |
| |
| TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetDoublev, |
| GetIntegerv and GetFloatv: |
| |
| TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A |
| |
| Accepted by the <target> parameter of TexImage3D, TexSubImage3D, |
| CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: |
| |
| TEXTURE_CUBE_MAP_ARRAY_ARB |
| PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B |
| |
| Accepted by the <tex> parameter of GetTexImage: |
| |
| TEXTURE_CUBE_MAP_ARRAY_ARB |
| |
| Returned by the <type> parameter of GetActiveUniform: |
| |
| SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C |
| SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D |
| INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E |
| UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F |
| |
| Additions to Chapter 2 of OpenGL 3.0 Specification (OpenGL Operation) |
| |
| Modify section 2.20.3 "Shader Variables", page 91 |
| |
| (Add the following new return type to the 3rd paragraph on p.97) |
| |
| SAMPLER_CUBE_MAP_ARRAY_ARB, |
| SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB, |
| INT_SAMPLER_CUBE_MAP_ARRAY_ARB, |
| UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB, |
| |
| Addition to Chapter 3 of OpenGL 3.0 Specification (Rasterization) |
| |
| Modify section 3.9, "Texturing", page 175 |
| |
| (modify the 3rd paragraph, p.175) |
| |
| Six types of texture are supported; each is a collection of images |
| built from one-, two-, or three-dimensional array of image elements |
| referred to as texels. One-, two-, and three-dimensional textures |
| consist respectively of one-, two-, or three-dimensional texel |
| arrays. One- and two-dimensional array textures are arrays of one- |
| or two-dimensional images, consisting of one or more layers. A cube |
| map is a special two-dimensional array texture with six layers that |
| represent the faces of a cube. When accessing a cube map, the |
| texture coordinates are projected onto one of the six faces of the |
| cube. Finally a cube map array is a collection of cube map layers |
| stored as a two-dimensional array texture. When accessing a cube map |
| array, the texture coordinate "s", "t", "r" are applied similarly as |
| cube map while the last texture coordinate "q" is used as the index |
| of on the cube map slices. |
| |
| |
| Modify Section 3.9.1, Texture Image Specification, page 176 |
| |
| (modify the first paragraph of section, p. 176) |
| |
| The command |
| |
| void TexImage3D( enum target, int level, int internalformat, |
| sizei width, sizei height, sizei depth, int border, |
| enum format, enum type, void *data ); |
| |
| is used to specify a three-dimensional texture image. <target> must |
| be one of TEXTURE_3D for a three-dimensional texture or |
| TEXTURE_2D_ARRAY for an two-dimensional array texture or |
| TEXTURE_CUBE_MAP_ARRAY_ARB. Additionally, target may be |
| PROXY_TEXTURE_3D for a three-dimensional proxy texture, |
| PROXY_TEXTURE_2D_ARRAY for a two-dimensional proxy array texture, or |
| PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB for a proxy cube map array texture. |
| If target is TEXTURE_CUBE_MAP_ARRAY_ARB or |
| PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB, specifying a depth value that is |
| not a multiple of six results in an error of INVALID_VALUE. |
| INVALID_VALUE is also generated if the width and the height |
| parameters are not equal. ... |
| |
| When <target> is TEXTURE_CUBE_MAP_ARRAY_ARB or |
| PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB <width> and <height> must be equal, |
| otherwise the error INVALID_VALUE is generated. Also, <depth> must |
| be a multiple of six indicating 6N layer-faces in the cube map |
| array, otherwise the error INVALID_VALUE is generated. |
| |
| |
| (modify the third paragraph of section, p. 177) |
| |
| Textures with a base internal format of DEPTH_COMPONENT or |
| DEPTH_STENCIL are supported by texture image specification commands |
| only if target is TEXTURE_1D, TEXTURE_2D, TEXTURE_1D_ARRAY, |
| TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY_ARB, |
| PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_1D_ARRAY, |
| PROXY_TEXTURE_2D_ARRAY, PROXY_TEXTURE_CUBE_MAP or |
| PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB. ... |
| |
| |
| (modify the second paragraph of section, p.186) |
| |
| and w_b, h_b, and d_b are the specified border width, height, and |
| depth. wb and hb are the specified border value; d_b is the |
| specified border value if target is TEXTURE_3D, or zero if target is |
| TEXTURE_2D_ARRAY or TEXTURE_CUBE_MAP_ARRAY_ARB. Thus the last |
| two-dimensional image slice of the three-dimensional image is |
| indexed with the highest value of k. When <target> is |
| TEXTURE_CUBE_MAP_ARRAY_ARB. specifying a cube map array texture, k |
| refers to a layer-face. The layer is given by |
| |
| layer = floor(k/6), |
| |
| and the face is given by |
| |
| face = k mod 6 |
| |
| When |
| |
| face = 0: TEXTURE_CUBE_MAP_POSITVE_X, |
| face = 1: TEXTURE_CUBE_MAP_NEGATIVE_X, |
| face = 2: TEXTURE_CUBE_MAP_POSITVE_Y, |
| face = 3: TEXTURE_CUBE_MAP_NEGATIVE_Y, |
| face = 4: TEXTURE_CUBE_MAP_POSITVE_Z, |
| face = 5: TEXTURE_CUBE_MAP_NEGATIVE_Z. |
| |
| |
| (modify the fifth paragraph of section, p. 187) |
| |
| ... The maximum allowable width and height of a cube map or cube map |
| array texture must be the same, and must be at least 2^(k-lod) + 2 * |
| b_t for image arrays level 0 through k, where k is the log base 2 of |
| MAX_CUBE_MAP_TEXTURE_SIZE. The maximum number of layers for one- and |
| two-dimensional array textures (height or depth, respectively), and |
| the maximum number of layer-faces for cube map array textures |
| (depth) must be at least MAX_ARRAY_TEXTURE_LAYERS_EXT for all |
| levels. |
| |
| (modify the second last paragraph, p. 189) |
| |
| An element (i, j, k) of the texel array is called a texel (for a |
| two-dimensional texture or one-dimensional array texture, k is |
| irrelevant; for a one-dimensional texture, j and k are both |
| irrelevant). If target is TEXTURE_2D_ARRAY or TEXTURE_3D, the |
| texture value for a fragment is determined by that fragment's |
| associated (s, t, r) coordinates, but may not correspond to any |
| actual texel. See figure 3.10. If target is |
| TEXTURE_CUBE_MAP_ARRAY_ARB, the texture value is determined by (s, |
| t, r, q) coordinates where "s", "t", "r" is defined to be the same |
| as for TEXTURE_CUBE_MAP and "q" is defined as the index of a |
| specific cube map in the cube map array. |
| |
| |
| (modify the first paragraph, p. 193) |
| |
| ... and the target arguments of TexSubImage3D and CopyTexSubImage3D |
| must be TEXTURE_3D, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB. |
| The level parameter of each command specifies the level of the texel |
| array that is modified. If level is less than zero or greater than |
| the base 2 logarithm of the maximum texture width, height, or depth, |
| the error INVALID VALUE is generated. |
| |
| (modify the second to last paragraph, p. 193) |
| |
| Arguments <xoffset>, <yoffset>, and <zoffset> of TexSubImage3D and |
| CopyTex- SubImage3D specify the lower left texel coordinates of a |
| <width>-wide by <height>-high by <depth>-deep rectangular subregion |
| of the texel array. For cube map array textures, <zoffset> is the |
| first layer-face to update, and <depth> is the number layer-faces to |
| update. The depth argument ... |
| |
| |
| Modify Section 3.9.4, Texture Parameters, page 200 |
| |
| (modify the first paragraph of section, p. 200) |
| |
| ... target is the target, either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, |
| TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP or |
| TEXTURE_CUBE_MAP_ARRAY_ARB. ... |
| |
| |
| (modify third paragraph, p. 204) |
| |
| ... For a one-dimensional or one-dimensional array texture, define |
| v(x, y) == 0 and w(x, y) == 0; for a two-dimensional, |
| two-dimensional array, cube map, or cube map array texture define |
| w(x, y) == 0. ... |
| |
| |
| (modify the first paragraph of "Mipmapping", p.209) |
| |
| If the image array of level level_base, excluding its border, has |
| dimensions, w_t x h_t x d_t, then there are floor(log2(maxsize)) + 1 |
| levels in the mipmap, where |
| |
| maxsize = w_t, for one-dimensional and one-dimensional |
| array textures, |
| |
| max(w_t, h_t), for two-dimensional, two-dimensional array, |
| cube map and cube map array textures, |
| |
| max(w_t, h_t, d_t), for three dimensional textures. |
| |
| |
| (modify the third paragraph in the "Automatic Mipmap Generation", p. 211) |
| |
| The contents of the derived arrays are computed by repeated, |
| filtered reduction of the level_base array. For one- , |
| two-dimensional or cube map array textures, each layer is filtered |
| independently. ... |
| |
| |
| (modify the first paragraph in the "Manual Mipmap Generation", p. 211) |
| Mipmaps can be generated manually with the command |
| |
| void GenerateMipmap( enum target ); |
| |
| where target is one of TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, |
| TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, or |
| TEXTURE_CUBE_MAP_ARRAY_ARB. ... |
| |
| |
| Modify Section 3.9.10, Texture Completeness, page 212 |
| |
| (add a new paragraph in the end of the section, p. 213) |
| |
| A cube map array texture is cube array complete if it is complete |
| when treated as a two-dimensional array and cube complete for every |
| cube map slice within the array texture. |
| |
| |
| Modify Section 3.9.11, Texture State and Proxy State, page 214 |
| |
| (modify second and third paragraphs, p. 214) |
| |
| In addition to image arrays for one-, two-, and three-dimensional |
| textures, one- and two-dimensional array textures, and the six image |
| arrays for the cube map texture, partially instantiated image arrays |
| are maintained for one-, two-, and three-dimensional textures and |
| one- and two-dimensional array textures, and cube map array |
| textures. Additionally, a single proxy image array is maintained for |
| the cube map texture. Each proxy image array includes width, height, |
| depth, border width, and internal format state values, as well as |
| state for the red, green, blue, alpha, luminance, and intensity |
| component resolutions. Proxy image arrays do not include image data, |
| nor do they include texture properties. ... |
| |
| |
| (update the first paragraph, p. 215) |
| |
| Proxy arrays for one- and two-dimensional textures and one- and |
| two-dimensional array textures and cube map array textures are |
| operated on in the same way when TexImage1D is executed with target |
| specified as PROXY_TEXTURE_1D, TexImage2D is executed with target |
| specified as PROXY_TEXTURE_2D or PROXY_TEXTURE_1D_ARRAY, or |
| TexImage3D is executed with target specified as |
| PROXY_TETXURE_2D_ARRAY or PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB. |
| |
| |
| Modify Section 3.9.12 Texture Objects, page 215 |
| |
| (update the beginning to add cube map array textures, p. 215) |
| |
| In addition to the default textures TEXTURE_1D, TEXTURE_2D, |
| TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, |
| and TEXTURE_CUBE_MAP_ARRAY_ARB, named one-, two-, and |
| three-dimensional, cube map, and one- , two-dimensional array |
| texture and cube map array texture objects can be created and |
| operated upon. The name space for texture objects is the unsigned |
| integers, with zero reserved by the GL. |
| |
| A texture object is created by binding an unused name to TEXTURE_1D, |
| TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY, |
| TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB. The binding is |
| effected by calling |
| |
| void BindTexture( enum target, uint texture ); |
| |
| with <target> set to the desired texture target and <texture> set to |
| the unused name. The resulting texture object is a new state vector, |
| comprising all the state values listed in section 3.8.11, set to the |
| same initial values. If the new texture object is bound to |
| TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, |
| TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB, |
| it is and remains a one-, two-, three-dimensional, cube map, one- , |
| two-dimensional array texture OR cube map array texture respectively |
| until it is deleted. |
| |
| BindTexture may also be used to bind an existing texture object to |
| either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, |
| TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB. |
| The error INVALID_OPERATION is generated if an attempt is made to |
| bind a texture object of different dimensionality than the specified |
| target. If the bind is successful no change is made to the state of |
| the bound texture object, and any previous binding to target is |
| broken. |
| |
| While a texture object is bound, GL operations on the target to |
| which it is bound affect the bound object, and queries of the target |
| to which it is bound return state from the bound object. If texture |
| mapping of the dimensionality of the target to which a texture |
| object is bound is enabled, the state of the bound texture object |
| directs the texturing operation. |
| |
| In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, |
| TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, and |
| TEXTURE_CUBE_MAP_ARRAY_ARB have one-, two-, three-dimensional, cube |
| map, and one- and two-dimensional array and cube map array texture |
| state vectors respectively associated with them. In order that |
| access to these initial textures not be lost, they are treated as |
| texture objects all of whose names are 0. The initial one-, two-, |
| three-dimensional, cube map, one- and two-dimensional array and cube |
| map array textures are therefore operated upon, queried, and applied |
| as TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, |
| TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, and TEXTURE_CUBE_MAP_ARRAY_ARB |
| respectively while 0 is bound to the corresponding targets. |
| |
| |
| (modify the first paragraph, p. 217) |
| |
| ... a texture that is currently bound to one of the targets |
| TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, |
| TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB is |
| deleted, it is as though BindTexture had been executed with the same |
| target and texture zero. ... |
| |
| |
| (modify the second paragraph, p. 218) |
| |
| The texture object name space, including the initial one-, two-, and |
| three dimensional, one- and two-dimensional array, cube map and cube |
| map array texture objects, is shared among all texture units. ... |
| |
| Additions to Chapter 4 of the OpenGL 3.0 Specification (Per-fragment Operations and the Frame Buffer) |
| |
| Modify Section 4.4.2, Attaching Images to Framebuffer Objects, page 281 |
| |
| (modify the third paragraph in the section, p. 287) |
| |
| The command |
| |
| void FramebufferTextureLayer(enum target, enum attachment, |
| uint texture, int level, int layer); |
| |
| operates identically to FramebufferTexture3D, except that it |
| attaches a single layer of a three-dimensional texture or a one- or |
| two-dimensional array texture, or a cube map array texture. <layer> |
| is an integer indicating the layer number, and is treated |
| identically to the <zoffset> parameter in FramebufferTexture3D for |
| three-dimensional textures, one- and two-dimensional textures. For |
| cube map array textures, <layer> mod 6 indicates a face of a cube |
| map slice within the cube map array. the order of the face is |
| defined as in 3.9.1. The error INVALID_VALUE is generated if <layer> |
| is negative. The error INVALID_OPERATION is generated if <texture> |
| is non-zero and is not the name of a three dimensional texture, one- |
| or two-dimensional array texture, or cube map array texture. Unlike |
| FramebufferTexture3D, no <textarget> parameter is accepted. |
| |
| (modify last condition for framebuffer attachment completeness, p. 291) |
| |
| * If FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE and |
| FRAMEBUFFER_ATTACHMENT_OBJECT_NAME names a one-dimensional, |
| two-dimensional or cube map array texture, then |
| FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER must be smaller than the |
| number of layers in the texture. |
| |
| Modify Section 4.4.4.2, Framebuffer Completeness |
| |
| (modify the completeness requirements of layered framebuffer |
| completeness added by GL_ARB_geometry_shader4) |
| |
| * If any framebuffer attachment is layered, ... (i.e., three- |
| dimensional, cube map, one- or two dimensional array, or cube map |
| array textures). |
| { FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_{EXT|ARB} } |
| |
| * If any framebuffer attachment is layered, ... For one- and two- |
| dimensional array textures, and cube map array textures, the layer |
| count is the number of layers in the array texture. |
| { FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_{EXT|ARB} } |
| |
| Modify Section 4.4.7, Layered Framebuffers |
| |
| (add the following paragraph following table X.4, Layer numbers |
| for cube map texture faces) |
| |
| When cube map array texture levels are attached to a layered |
| framebuffer, the layer number corresponds to a layer-face. The |
| layer-face can be translated into an array layer and a cube map face |
| by |
| |
| array_layer = floor(layer/6), and |
| face = layer mod 6. |
| |
| The face number correspond to the cube map faces as listed in |
| table X.4. |
| |
| Additions to Chapter 5 of the OpenGL 3.0 specification (Special Functions) |
| |
| Modify Section 5.4, Display List, page 306 |
| |
| (modify the fifth paragraph in the section, p. 311) |
| |
| TexImage3D, TexImage2D, TexImage1D, Histogram, and ColorTable are |
| executed immediately when called with the corresponding proxy |
| arguments PROXY_TEXTURE_3D or PROXY_TEXTURE_2D_ARRAY or |
| PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB; ... |
| |
| Additions to Chapter 6 of the OpenGL 3.0 specification (State and State Requests) |
| |
| Modify Section 6.1.3, Enumerated Queries, page 316 |
| |
| (modify the last paragraph, p. 317) |
| |
| GetTexParameter parameter <target> may be one of TEXTURE_1D, |
| TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY, |
| TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB, indicating the |
| currently bound one-, two-, three-dimensional, cube map, or one- or |
| two-dimensional array texture or cube map array texture. |
| GetTexLevelParameter parameter target may be one of TEXTURE_1D, |
| TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP_POSITIVE_X, |
| TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y, |
| TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, |
| TEXTURE_CUBE_MAP_NEGATIVE_Z, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, |
| PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_3D, |
| PROXY_TEXTURE_CUBE_MAP, PROXY_TEXTURE_1D_ARRAY, |
| PROXY_TEXTURE_2D_ARRAY, or PROXY_TEXTURE_CUBE_MAP_ARRAY, indicating |
| the one-, two-, or three-dimensional texture, one of the six |
| distinct 2D images making up the cube map texture, the one- or |
| two-dimensional array texture, or the one-, two-, three-dimensional, |
| cube map, or one- or two-dimensional array or cube map array proxy |
| state vector. ... |
| |
| |
| Modify Section 6.1.4, Texture Queries, page 322 |
| |
| (modify the first paragraph, p. 322) |
| |
| The command |
| |
| void GetTexImage( enum tex, int lod, enum format, |
| enum type, void *img ); |
| |
| is used to obtain texture images. It is somewhat different from the |
| other get commands; tex is a symbolic value indicating which texture |
| (or texture face in the case of a cube map texture target name) is |
| to be obtained. TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, |
| TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY and TEXTURE_CUBE_MAP_ARRAY_ARB |
| indicate a one-, two-, or three-dimensional texture, or one- or |
| two-dimensional array texture, or cube map array texture, |
| respectively. ... |
| |
| (modify the third paragraph, p. 322) |
| |
| GetTexImage obtains... from the first image to the last for |
| three-dimensional textures. One- and two-dimensional array textures |
| and cube map array textures are treated as two-dimensional |
| three-dimensional and three-dimensional images, respectively, where |
| the layers are treated as rows or images. These groups are then... |
| |
| (modify the first paragraph, p. 323) |
| |
| For three-dimensional ,two-dimensional array and cube map array |
| textures, pixel storage operations are applied as if the image were |
| two-dimensional, except that the additional pixel storage state |
| values PACK_IMAGE_HEIGHT and PACK_SKIP_IMAGES are applied. ... |
| |
| Dependencies on EXT_gpu_shader4 and the OpenGL Shading Language (GLSL) |
| |
| Because there is no fixed-function pipeline access for cube map |
| array textures, this extension is only valid when EXT_gpu_shader4 |
| and GLSL is supported. if GLSL is not supported, the shading |
| language modifications and references to SAMPLER_CUBE_MAP_ARRAY_ARB |
| and SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB should be removed. |
| |
| Errors |
| |
| TexImage3D generates the error INVALID_VALUE if <target> is |
| TEXTURE_CUBE_MAP_ARRAY_ARB and <depth> is not a multiple of 6. |
| |
| TexImage3D generates the error INVALID_VALUE if <target> is |
| TEXTURE_CUBE_MAP_ARRAY_ARB and <width> and <height> are not equal. |
| |
| New State |
| |
| (add to table 6.19, p. 357) |
| Initial |
| Get Value Type Get Command Value Description Sec. Attribute |
| ---------------------------------- ------- ----------- ---------- ----------------------------- ------ --------- |
| TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 2*x3xZ+ GetIntegerv 0 texture object bound 3.9.12 texture |
| to TEXTURE_CUBE_MAP_ARRAY_ARB |
| |
| TEXTURE_CUBE_MAP_ARRAY_ARB nxI GetTexImage see 3.9.1 cube map array texture image 3.9.1 - |
| at lod i |
| |
| Modification to the OpenGL shading Language Specification, Version 1.30.08 |
| |
| #extension GL_ARB_texture_cube_map_array: <behavior> |
| |
| The above line is needed to control the GLSL features described in |
| this section. |
| |
| |
| A new preprocessor #define is added to the OpenGL Shading Language: |
| |
| #define GL_ARB_texture_cube_map_array 1 |
| |
| |
| Add to Section 3.6 "Keywords" |
| |
| (add new sampler type ) |
| |
| samplerCubeArray, samplerCubeArrayShadow, isamplerCubeArray, |
| usamplerCubeArray |
| |
| |
| Add to Section 4.1 "Basic Types" |
| |
| (add the following entries to the table: Floating Point Sampler Types) |
| |
| samplerCubeArray handle for accessing a cube map array texture |
| |
| samplerCubeArrayShadow handle for accessing a cube map array depth |
| texture with comparison |
| |
| (add the following entries to the table: Signed Integer Sampler Types) |
| |
| isamplerCubeArray handle for accessing an integer cube map |
| array texture |
| |
| (add the following entries to the table: Unsigned Integer Sampler Types) |
| |
| usamplerCubeArray handle for accessing an unsigned integer |
| cube map array texture |
| |
| Add at the end of Section 7.1 |
| "Vertex and Geometry Shader Special Variables" |
| |
| (after last paragraph already talking about gl_Layer) |
| |
| The output variable gl_Layer takes on a special value when used with |
| an array of cubemap textures. Instead of simply refering to the |
| layer, it is used to reference a cube map face inside a particular |
| layer as well. Setting gl_Layer to the value (layer*6+face) will |
| render to the appropriate <face> of the cube defined in <layer>. The |
| face values are defined in Table 4.x of Section 4.4.7 'Layered |
| Framebuffers' of the GL spec, but repeated here for clarity: |
| |
| face value resulting target |
| -------------- ------------------------------ |
| 0 TEXTURE_CUBE_MAP_POSITVE_X |
| 1 TEXTURE_CUBE_MAP_NEGATIVE_X |
| 2 TEXTURE_CUBE_MAP_POSITVE_Y |
| 3 TEXTURE_CUBE_MAP_NEGATIVE_Y |
| 4 TEXTURE_CUBE_MAP_POSITVE_Z |
| 5 TEXTURE_CUBE_MAP_NEGATIVE_Z |
| |
| For example, to render to the Positive Y cube map face located in |
| the 5th layer of the cube map array, gl_Layer should be set to |
| (5*6+2). |
| |
| Add to section 8.7 "Texture Lookup Functions" |
| |
| (Add new functions to the set of allowed texture lookup functions p. 85): |
| Syntax: |
| |
| ivec3 textureSize(samplerCubeArray sampler, int lod) |
| gvec4 texture(gsamplerCubeArray sampler, vec4 coord |
| [, float bias]) |
| gvec4 textureLod(gsamplerCubeArray sampler, vec4 coord, float lod) |
| ivec3 textureSize(samplerCubeArrayShadow sampler, int lod) |
| float texture(samplerCubeArrayShadow sampler, vec4 coord, float compare) |
| gvec4 textureGrad(gsamplerCubeArray sampler, vec4 coord, |
| vec3 ddx, vec3 ddy); |
| |
| Description: |
| |
| Cube map array functions are similar to the equivalent cube map or |
| 2D array functions. The value of coord.w is used to select the |
| layer of the array and the value coord.xyz is used to select the |
| location within the selected layer of the cubemap. See section 3.8 |
| for more details. The shadow comparison texture functions take the |
| comparison value from a separate input rather than from the |
| primary coord vector. |
| |
| Modify the Description of the textureSize function. |
| |
| For the array forms, the last component of the return value is |
| the number of layers in the texture array, or the number of cubes |
| in the texture cube map array. |
| |
| Issues |
| |
| (1) When fetching the Cubemap array texture in shader, should the |
| "q" coordinate be used to index a single layer of the whole |
| array as 2D array texture does, or to index a specific cubemap |
| within the array? |
| |
| RESOLVED: "q" is used to index a specific cubemap in the array. |
| This is an intuitive selection because otherwise the it only need |
| 2 coordinates instead of 3 to fetch a value in one layer of the |
| array. |
| |
| |
| (2) When specifying and indexing cube map array texture, should the |
| depth(layer) be the absolute number of layers in the array or |
| the number of cube maps? |
| |
| RESOLVED: To support the indexing of cube map in cube map array, a |
| list of new api calls needs to be added, which may not be a |
| preferred direction. |
| |
| |
| (3) Should partial updates to a cube map set in a cube map array |
| texture be allowed? |
| |
| RESOLVED: No, maintain the same restriction as updating a cube map |
| texture to retain orthogonality. |
| |
| |
| (4) Are cube map arrays cube maps where each "face" is an array or |
| arrays where each layer is a cube map? Should the API follow the |
| cube map or texture array paradigm? Should the data organization |
| for cube map arrays be exposed to or hidden from applications? |
| |
| RESOLVED: Cube map arrays are specified in a manner similar to |
| two-dimensional array textures (as described in the |
| EXT_texture_array extension), where each mipmap level is |
| represented as a set of two-dimensional images. Each of these |
| two-dimensional images corresponds to a single face of a single |
| layer of the full cube map array, referred to as a "layer-face". |
| The first six two-dimensional images of the mipmap level |
| correspond to the six faces of the first layer of the cube map |
| array, and subsequent groups of six layer-faces correspond to |
| subsequent cube map array layers. For each cube map array layer, |
| the six two-dimensional images correspond to the positive X, |
| negative X, positive Y, negative Y, positive Z and negative Z |
| faces, respectively. A valid cube map array texture will thus |
| always have a multiple of 6 texture layers. |
| |
| Cube maps and array textures use different paradigms for texture |
| image specification. Cube maps are specified one face at a time |
| (using TEXTURE_CUBE_MAP_POSITIVE_X, etc.). Sub-texture updates to |
| cube maps are also performed one face at a time. On the other |
| hand, array textures are specified entirely at once, and |
| sub-texture updates can span a subset of layers. |
| |
| Cube map arrays follow the array texture paradigm. Cube map arrays |
| are specified all layer-faces at once or as a subset of |
| layer-faces. This avoids adding complexity to the API and targets |
| higher performance by lowering the number of calls necessary to |
| build a cube map array texture. It also ensures that there will |
| not be any texture completeness problems because of missing faces |
| or faces with mismatched sizes. |
| |
| Since cube map array textures use the array texture paradigm, it |
| is necessary for applications to understand the data organization |
| of a cube map array. The data organization is exposed both at the |
| bitmap level and at the depth/zoffset/layer level. The <depth> |
| parameter used when specifying cube map array data is the number |
| of layer-faces. The <zoffset> parameter used for sub-texture |
| updates is also given as a layer-face. The <layer> parameter used |
| with the FBO API is also a layer-face. |
| |
| |
| (5) Should this organization be exposed when using geometry |
| programs/shaders to select layer-faces for rendering? |
| |
| RESOLVED: Yes. Since layer-faces (layer*6+face) are exposed at the |
| API level, it is reasonable to expose this at the shader level. |
| The single layer output is preserved, and the value written to it |
| is interpreted as a layer-face. |
| |
| Since the cube map array is treated as a special array of 2 |
| dimensional textures, the user may render to it inside of a |
| geometry shader using the layered rendering functionality. The |
| user must first attach the cube map texture array to a framebuffer |
| color attachment using: |
| |
| void FramebufferTextureARB(enum target, enum attachment, |
| uint texture, int level) |
| |
| where <texture> defines the texture object containing a cube map |
| array texture. |
| |
| Inside of the geometry shader, setting 'gl_Layer' to the value |
| (layer*6+face) will render to the appropriate <face> of the cube |
| defined in <layer>. The face values are defined in Table 4.x of |
| Section 4.4.7 'Layered Framebuffers' of the GL spec, but repeated |
| here for clarity: |
| |
| face value resulting target |
| -------------- ------------------------------ |
| 0 TEXTURE_CUBE_MAP_POSITVE_X |
| 1 TEXTURE_CUBE_MAP_NEGATIVE_X |
| 2 TEXTURE_CUBE_MAP_POSITVE_Y |
| 3 TEXTURE_CUBE_MAP_NEGATIVE_Y |
| 4 TEXTURE_CUBE_MAP_POSITVE_Z |
| 5 TEXTURE_CUBE_MAP_NEGATIVE_Z |
| |
| For example, to render to the Positive Y cube map face located in |
| the 5th layer of the cube map array, gl_Layer should be set to |
| (5*6+2). |
| |
| |
| (6) Should TexImage3D be enhanced to take TEXTURE_CUBE_MAP as a |
| <target> where the data is the whole cube map? |
| |
| RESOLVED: No. From an implementation perspective this may be quite |
| simple (a cube map is a cube map array with one layer). However, |
| there is not much value added by doing this. An abundance of |
| existing code that uses cube maps would not benefit from the |
| change. |
| |
| |
| (7) Should the FBO API provide a mechanism for attaching a single |
| cube map from an array as an attachment for layered rendering? |
| |
| RESOLVED: No. This is an interesting idea, but it doesn't provide |
| much functionality. This can easily be done as part of the geometry |
| program/shader. A more interesting idea for future versions of |
| OpenGL or as an extension is to allow texture data specified with |
| one texture target to be "typecast" or viewed as if specified with |
| a different target. Such an extension would allow an application to |
| view an array (or subset of an array) of two-dimensional texture |
| images as a two-dimensional array, a three-dimensional texture, or |
| a cube map array. |
| |
| |
| (8) How do you determine the maximum number of cube map array |
| texture layers allowed by an implementation? |
| |
| RESOLVED: This extension treats cube map array textures like |
| two-dimensional array textures, except that the number of |
| layer-faces must be a multiple of six, and the width and height |
| must be equal. There is no separate query for the number of layers |
| in a cube map array, but the limit on the number of layers in an |
| array texture (EXT_texture_array) also applies to the total number |
| of layer-faces in a cube map array texture. |
| |
| For example, if an implementation supporting this extension has a |
| limit of 512 layers for array, a cube map array texture may have |
| no more than floor(512/6) = 85 layers. |
| |
| (9) Do we really need to define integer versions of cube map array |
| sampler types? |
| |
| RESOLVED: Yes. It's not clear if they will be useful to any |
| applications, but there is no real reason no to provide them. |
| |
| (10) Should we provide texture LOD functions for shadow sampler |
| targets? |
| |
| RESOLVED: Yes. The level of detail computations for a texture used |
| as a shadow map are completely identical to that for other |
| textures. |
| |
| However, we provide separate data types for the two textures |
| (e.g., sampler2D vs. sampler2DShadow), and there is no mechanism |
| to cast from one to the other. If we didn't provide these |
| functions, the only way to perform an LOD computation for a |
| texture used as a shadow map would be to bind the same texture |
| object to two different texture image units, one associated with a |
| shadow sampler and the other associated with a normal sampler. |
| |
| (11) What built-in functions are available for 2D arrays that are |
| not provided for cube map arrays? |
| |
| RESOLVED: Functions equivalent to the following 2D array functions |
| are not available for cube map arrays: |
| |
| vec4 texelFetch2DArray(sampler2DArray sampler, ivec3 coord, int lod) |
| vec4 shadow2DArrayGrad(sampler2DArrayShadow sampler, vec4 coord, |
| vec2 ddx, vec2 ddy); |
| vec4 texelFetch2DArrayOffset(sampler2DArray sampler, ivec3 coord, |
| int lod, ivec2 offset) |
| vec4 shadow2DArrayGradOffset(sampler2DArrayShadow sampler, |
| vec4 coord, vec2 ddx, vec2 ddy, |
| ivec2 offset); |
| |
| (12) What does ivec3 textureSize(samplerCubeArray sampler, int lod) |
| in the z component? |
| |
| Resolved: array_layer (that is, number of cube maps in the array). |
| |
| The spec is currently ambiguous, and can be interpreted as |
| layer (the number of cube map faces) or array_layer = floor(layer/6), |
| the number of cube maps. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- -------- ----------------------------------------- |
| 9 12/07/09 wwlk Edit texture function table description |
| as resolved in issue 12 |
| 8 12/07/09 wwlk Resolved issue 12 |
| 7 11/13/09 wwlk Added array size returned issue 12 |
| 6 11/11/09 wwlk Correct more mistaken GLSL prototypes |
| gSamplerCube takes vec3 ddx and ddy |
| gSamplerCube do not have offsets |
| gSamplerCubeArray should match. |
| 5 09/09/09 groth Correct some mistaken GLSL prototypes |
| 4 08/02/09 Jon Leech Reformat to 80 columns and assign ARB |
| extension number. |
| 3 07/22/09 myoung Fix gl_layer interaction description |
| 2 06/30/09 gsellers Fix enumerant values |
| 1 05/06/09 nickh First draft |