A '''Cubemap Texture''' is a [[Texture|texture]] composed of 6 2D images. The images are arranged in a cube-shape, hence the name. Each separate face of the cube can have its own mipmaps.

+

+

== Overview ==

+

+

Cubemaps are a texture type, using the type {{enum|GL_TEXTURE_CUBE_MAP}}. Cubemaps conceptually contain 6 2D textures, each one representing a particular face of a cube.

+

+

=== Creation ===

+

+

To allocate storage for the 6 faces of the cubemap, bind the texture to {{enum|GL_TEXTURE_CUBE_MAP}}. Then call glTexImage2D 6 times, using the same size, mipmap ''level'', and ''image format''. The ''target'' parameter specifies which of the 6 faces of the cubemap to specify. These faces are:

+

+

* {{enum|GL_TEXTURE_CUBE_MAP_POSITIVE_X}}

+

* {{enum|GL_TEXTURE_CUBE_MAP_NEGATIVE_X}}

+

* {{enum|GL_TEXTURE_CUBE_MAP_POSITIVE_Y}}

+

* {{enum|GL_TEXTURE_CUBE_MAP_NEGATIVE_Y}}

+

* {{enum|GL_TEXTURE_CUBE_MAP_POSITIVE_Z}}

+

* {{enum|GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}}

+

+

Cubemaps may have mipmaps, but each face must have the same number of mipmaps. Cubemaps can use any of the filtering modes and other texture parameters.

+

+

=== Texture Access ===

+

+

The [[GLSL Sampler|sampler]] type for cubemaps is {{code|''g''samplerCube}}. {{code|''g''samplerCubeShadow}} can also be used for shadow lookups. The fourth component of the texture coordinate for shadow lookups is the comparison value.

+

+

The texture coordinates for cubemaps are 3D vector directions. These are conceptually directions from within the cube defined by the cubemap, pointing in a particular direction. The vectors do not have to be normalized.

+

+

Filtering does not take place across cubemap face boundaries. So a visible seam can appear between cubemap face boundaries regardless of the texture filtering modes.

+

+

== Layered Rendering ==

+

{{main|Framebuffer Object#Layered Images}}

+

+

Cubemaps can be bound to [[Framebuffer Object|framebuffer objects]] for layered rendering. The 6 faces are given a specific order, as defined in the linked article.

Under the standard filtering rules for cubemaps, filtering does not work across faces of the cubemap. This results in a seam across the faces of a cubemap. This was a hardware limitation in the past, but modern hardware is capable of interpolating across a cube face boundary.

+

+

To globally enable this, use {{apifunc|glEnable|(GL_TEXTURE_CUBE_MAP_SEAMLESS)}}. In general, it is not a good idea to enable and disable this within a program. It should be set as part of initialization and never changed.

[[Array Texture|Array textures]] can also come in cubemap flavors, in addition to 1D and 2D. They use the texture type {{enum|GL_TEXTURE_CUBE_MAP_ARRAY}}.

+

+

Uploading to cube map arrays works differently from uploading to regular cubemaps. They are uploaded like array textures, using {{apifunc|glTexImage3D}} and similar functions like {{apifunc|glTexStorage3D}}.

+

+

Layers also have to be dealt with in an unusual way. Cubemap array textures have, for each mipmap, some number of cubemaps. That number of cubemaps is the number of layers. But since each cubemap is composed of 6 2D faces, array cubemaps also have a number of ''layer-faces'', which is 6 times the number of layers. Some interfaces count by layers, and others count by layer-faces.

+

+

When allocating storage for a cubemap array, the number of ''layer-faces'' is provided as the {{param|depth}} parameter, not the number of layers.

+

+

The order of faces within a layer is the same as that used for layered-rendering in cubemaps. Speaking of layered rendering, the {{code|gl_Layer}} value provided by the [[Geometry Shader]] specifies ''layer-faces'', not the technical number of layers.

+

+

Cubemap arrays can have mipmaps. They are uploaded in the same way as for other kinds of array textures. Remember that the number of layer-faces does not change.

+

+

=== Samplers ===

+

The [[GLSL Sampler|sampler]] type for cubemap arrays is {{code|''g''samplerCubeArray}}. {{code|''g''samplerCubeArrayShadow}} can be used for comparison lookups. The texture coordinates are 4D values; the first three values are the vector direction, and the fourth value is the layer to use. Note that this is the ''layer'' to use, not the layer-face.

+

+

For comparison modes, the texture functions take an additional parameter for the comparison value. The comparison parameter always comes immediately after the texture coordinate.

Contents

Overview

Cubemaps are a texture type, using the type GL_TEXTURE_CUBE_MAP. Cubemaps conceptually contain 6 2D textures, each one representing a particular face of a cube.

Creation

To allocate storage for the 6 faces of the cubemap, bind the texture to GL_TEXTURE_CUBE_MAP. Then call glTexImage2D 6 times, using the same size, mipmap level, and image format. The target parameter specifies which of the 6 faces of the cubemap to specify. These faces are:

GL_TEXTURE_CUBE_MAP_POSITIVE_X

GL_TEXTURE_CUBE_MAP_NEGATIVE_X

GL_TEXTURE_CUBE_MAP_POSITIVE_Y

GL_TEXTURE_CUBE_MAP_NEGATIVE_Y

GL_TEXTURE_CUBE_MAP_POSITIVE_Z

GL_TEXTURE_CUBE_MAP_NEGATIVE_Z

Cubemaps may have mipmaps, but each face must have the same number of mipmaps. Cubemaps can use any of the filtering modes and other texture parameters.

Texture Access

The sampler type for cubemaps is gsamplerCube​. gsamplerCubeShadow​ can also be used for shadow lookups. The fourth component of the texture coordinate for shadow lookups is the comparison value.

The texture coordinates for cubemaps are 3D vector directions. These are conceptually directions from within the cube defined by the cubemap, pointing in a particular direction. The vectors do not have to be normalized.

Filtering does not take place across cubemap face boundaries. So a visible seam can appear between cubemap face boundaries regardless of the texture filtering modes.

Seamless cubemap

Under the standard filtering rules for cubemaps, filtering does not work across faces of the cubemap. This results in a seam across the faces of a cubemap. This was a hardware limitation in the past, but modern hardware is capable of interpolating across a cube face boundary.

To globally enable this, use glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS)​. In general, it is not a good idea to enable and disable this within a program. It should be set as part of initialization and never changed.

Cubemap array textures

Array textures can also come in cubemap flavors, in addition to 1D and 2D. They use the texture type GL_TEXTURE_CUBE_MAP_ARRAY.

Uploading to cube map arrays works differently from uploading to regular cubemaps. They are uploaded like array textures, using glTexImage3D​ and similar functions like glTexStorage3D​.

Layers also have to be dealt with in an unusual way. Cubemap array textures have, for each mipmap, some number of cubemaps. That number of cubemaps is the number of layers. But since each cubemap is composed of 6 2D faces, array cubemaps also have a number of layer-faces, which is 6 times the number of layers. Some interfaces count by layers, and others count by layer-faces.

When allocating storage for a cubemap array, the number of layer-faces is provided as the depth​ parameter, not the number of layers.

The order of faces within a layer is the same as that used for layered-rendering in cubemaps. Speaking of layered rendering, the gl_Layer​ value provided by the Geometry Shader specifies layer-faces, not the technical number of layers.

Cubemap arrays can have mipmaps. They are uploaded in the same way as for other kinds of array textures. Remember that the number of layer-faces does not change.

Samplers

The sampler type for cubemap arrays is gsamplerCubeArray​. gsamplerCubeArrayShadow​ can be used for comparison lookups. The texture coordinates are 4D values; the first three values are the vector direction, and the fourth value is the layer to use. Note that this is the layer to use, not the layer-face.

For comparison modes, the texture functions take an additional parameter for the comparison value. The comparison parameter always comes immediately after the texture coordinate.