files/en-us/web/api/gpudevice/createtexture/index.md
{{APIRef("WebGPU API")}}{{SecureContext_Header}}{{AvailableInWorkers}}
The createTexture() method of the
{{domxref("GPUDevice")}} interface creates a {{domxref("GPUTexture")}} in which to store 1D, 2D, or 3D arrays of data, such as images, to use in GPU rendering operations.
createTexture(descriptor)
descriptor
dimension {{optional_inline}}
: An enumerated value indicating the dimension level of the texture. Possible values are:
"1d": The texture is one-dimensional."2d": The texture is two-dimensional or an array of two-dimensional layers."3d": The texture is three-dimensional.dimension defaults to "2d" if the value is omitted.
format
: An enumerated value specifying the format of the texture. See the Texture formats section of the specification for all the possible values.
[!NOTE]
- The
depth32float-stencil8feature needs to be enabled to createdepth32float-stencil8-format {{domxref("GPUTexture")}}s.- The
texture-compression-bcfeature needs to be enabled to create two-dimensional (dimension: "2d") BC compressedGPUTextures:bc1-rgba-unorm,bc1-rgba-unorm-srgb,bc2-rgba-unorm,bc2-rgba-unorm-srgb,bc3-rgba-unorm,bc3-rgba-unorm-srgb,bc4-r-unorm,bc4-r-snorm,bc5-rg-unorm,bc5-rg-snorm,bc6h-rgb-ufloat,bc6h-rgb-float,bc7-rgba-unorm, andbc7-rgba-unorm-srgbformats.- The
texture-compression-bcandtexture-compression-bc-sliced-3dfeatures need to be enabled to create three-dimensional BC compressedGPUTextures (the sameformatvalues specified in the previous bullet, but withdimensionset to3d).- The
texture-compression-astcfeature needs to be enabled to create two-dimensional (dimension: "2d") ASTC compressedGPUTextures:astc-4x4-unorm,astc-4x4-unorm-srgb,astc-5x4-unorm,astc-5x4-unorm-srgb,astc-5x5-unorm,astc-5x5-unorm-srgb,astc-6x5-unorm,astc-6x5-unorm-srgb,astc-6x6-unorm,astc-6x6-unorm-srgb,astc-8x5-unorm,astc-8x5-unorm-srgb,astc-8x6-unorm,astc-8x6-unorm-srgb,astc-8x8-unorm,astc-8x8-unorm-srgb,astc-10x5-unorm,astc-10x5-unorm-srgb,astc-10x6-unorm,astc-10x6-unorm-srgb,astc-10x8-unorm,astc-10x8-unorm-srgb,astc-10x10-unorm,astc-10x10-unorm-srgb,astc-12x10-unorm,astc-12x10-unorm-srgb,astc-12x12-unorm, andastc-12x12-unorm-srgbformats.- The
texture-compression-astcandtexture-compression-astc-sliced-3dfeatures need to be enabled to create three-dimensional BC compressedGPUTextures (the sameformatvalues specified in the previous bullet, but withdimensionset to3d).- The
texture-compression-etc2feature needs to be enabled to create two-dimensional ETC2 compressedGPUTextures:etc2-rgb8unorm,etc2-rgb8unorm-srgb,etc2-rgb8a1unorm,etc2-rgb8a1unorm-srgb,etc2-rgba8unorm,etc2-rgba8unorm-srgb,eac-r11unorm,eac-r11snorm,eac-rg11unorm, andeac-rg11snormformats.- See the Tier 1 and Tier 2 texture formats section for more information about those texture format sets and the requirements to create them.
label {{optional_inline}}
mipLevelCount {{optional_inline}}
sampleCount {{optional_inline}}
size
: An object or array specifying the width, height, and depth/array layer count of the texture. The width value must always be specified, while the height and depth/array layer count values are optional and will default to 1 if omitted.
For example, you can pass an array like [16, 16, 2], or its equivalent object { width: 16, height: 16, depthOrArrayLayers: 2 }.
usage
: The {{glossary("Bitwise_flags", "bitwise flags")}} representing the allowed usages for the GPUTexture. The possible values are in the GPUTexture.usage value table.
Note that multiple possible usages can be specified by separating values with bitwise OR, for example: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT.
[!NOTE]
- The
bgra8unorm-storagefeature needs to be enabled to specifySTORAGE_BINDINGusage for abgra8unorm-format{{domxref("GPUTexture")}}.- The
rg11b10ufloat-renderablefeature needs to be enabled to specifyRENDER_ATTACHMENTusage for arg11b10ufloat-format{{domxref("GPUTexture")}}, as well as its blending and multisampling.
viewFormats {{optional_inline}}
format value.A {{domxref("GPUTexture")}} object instance.
The following criteria must be met when calling createTexture(), otherwise a {{domxref("GPUValidationError")}} is generated and an invalid {{domxref("GPUTexture")}} object is returned:
usage is specified.size (width, height, or depth/array layer count) are greater than 0.mipLevelCount is greater than 0.sampleCount is equal to 1 or 4.dimension is set to "1d":
size width value is less than or equal to the {{domxref("GPUDevice")}}'s maxTextureDimension1D {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.size height and depth/array layer count values are equal to 1.sampleCount is equal to 1.format is not equal to a compressed format or depth-or-stencil format.dimension is set to "2d":
size width and height values are less than or equal to the {{domxref("GPUDevice")}}'s maxTextureDimension2D {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.size depth/array layer count value is less than or equal to the {{domxref("GPUDevice")}}'s maxTextureArrayLayers {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.dimension is set to "3d":
size width, and height, and depth/array layer count values are less than or equal to the {{domxref("GPUDevice")}}'s maxTextureDimension3D {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.sampleCount value is equal to 1.format is not equal to a compressed format or depth-or-stencil format.size width value is a multiple of the texel block width.size height value is a multiple of the texel block height.sampleCount is greater than 1:
mipLevelCount is equal to 1.size depth/array layer count value is equal to 1.usage includes the GPUTextureUsage.RENDER_ATTACHMENT flag.usage does not include the GPUTextureUsage.STORAGE_BINDING flag.mipLevelCount value is less than or equal to the maximum miplevel count.format and viewFormats are compatible with one another.usage includes the GPUTextureUsage.RENDER_ATTACHMENT flag:
format is a renderable format (meaning a color renderable format, or a depth-or-stencil format).dimension is set to "2d".usage includes the GPUTextureUsage.STORAGE_BINDING flag:
format includes the STORAGE_BINDING capability (see the Plain color formats table for reference).This section describes the WebGPU Tier1 and Tier2 texture formats.
The Tier 1 set of texture formats is designed to allow developers to port existing content to the web without needing to rewrite it to use WebGPU's lower-level capabilities. To use this set, enable the texture-formats-tier1 feature (see {{domxref("GPUSupportedFeatures")}}).
Enabling this feature allows:
formats with usages of RENDER_ATTACHMENT (including blendable and multisampling capabilities) and STORAGE_BINDING (with read-only and write-only access):
r16unormr16snormrg16unormrg16snormrgba16unormrgba16snormformats with the RENDER_ATTACHMENT usage (including blendable and multisampling capabilities):
r8snormrg8snormrgba8snormformats with the STORAGE_BINDING usage (with read-only and write-only access):
r8unormr8snormr8uintr8sintrg8unormrg8snormrg8uintrg8sintr16uintr16sintr16floatrg16uintrg16sintrg16floatrgb10a2uintrgb10a2unormrg11b10ufloatGPUTexture formats in the destination texture of {{domxref("GPUQueue.copyExternalImageToTexture()")}} calls:
r16unormrg16unormrgba16unorm[!NOTE] Enabling the
texture-formats-tier1feature automatically enables therg11b10ufloat-renderablefeature, which allows therg11b10ufloattexture to be used with theRENDER_ATTACHMENTusage, including blending and multisampling.
The Tier 2 set of texture formats supports storage texture formats that don't have support in "core" WebGPU, and are required for advanced usage. To use this set, enable the texture-formats-tier2 feature (see {{domxref("GPUSupportedFeatures")}}).
Enabling this feature allows using the following formats with the STORAGE_BINDING usage (with read-write access):
r8unormr8uintr8sintrgba8unormrgba8uintrgba8sintr16uintr16sintr16floatrgba16uintrgba16sintrgba16floatrgba32uintrgba32sintrgba32float[!NOTE] Enabling the
texture-formats-tier2feature automatically enables therg11b10ufloat-renderableandtexture-formats-tier1features.
In the WebGPU samples Textured Cube sample, a texture to use on the faces of a cube is created by:
createTexture().// …
let cubeTexture;
{
const img = document.createElement("img");
img.src = new URL(
"../../../assets/img/Di-3d.png",
import.meta.url,
).toString();
await img.decode();
const imageBitmap = await createImageBitmap(img);
cubeTexture = device.createTexture({
size: [imageBitmap.width, imageBitmap.height, 1],
format: "rgba8unorm",
usage:
GPUTextureUsage.TEXTURE_BINDING |
GPUTextureUsage.COPY_DST |
GPUTextureUsage.RENDER_ATTACHMENT,
});
device.queue.copyExternalImageToTexture(
{ source: imageBitmap },
{ texture: cubeTexture },
[imageBitmap.width, imageBitmap.height],
);
}
// …
{{Specifications}}
{{Compat}}