GPUDevice: createTexture() method
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Secure context: This feature is available only insecure contexts (HTTPS), in some or allsupporting browsers.
Note: This feature is available inWeb Workers.
ThecreateTexture() method of theGPUDevice interface creates aGPUTexture in which to store 1D, 2D, or 3D arrays of data, such as images, to use in GPU rendering operations.
In this article
Syntax
createTexture(descriptor)Parameters
descriptorAn object containing the following properties:
dimensionOptionalAn 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.
dimensiondefaults to"2d"if the value is omitted.formatAn enumerated value specifying the format of the texture. See theTexture formats section of the specification for all the possible values.
Note:
- The
depth32float-stencil8feature needs to be enabled to createdepth32float-stencil8-formatGPUTextures. - 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 theTier 1 and Tier 2 texture formats section for more information about those texture format sets and the requirements to create them.
- The
labelOptionalA string providing a label that can be used to identify the object, for example in
GPUErrormessages or console warnings.mipLevelCountOptionalA number specifying the number of mip levels the texture will contain. If omitted, this defaults to 1.
sampleCountOptionalA number specifying the texture's sample count. To be valid, the value must be 1 or 4. If omitted, this defaults to 1. A value higher than 1 indicates a multi-sampled texture.
sizeAn 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 }.usageThebitwise flags representing the allowed usages for the
GPUTexture. The possible values are in theGPUTexture.usagevalue table.Note that multiple possible usages can be specified by separating values withbitwise OR, for example:
GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT.Note:
- The
bgra8unorm-storagefeature needs to be enabled to specifySTORAGE_BINDINGusage for abgra8unorm-formatGPUTexture. - The
rg11b10ufloat-renderablefeature needs to be enabled to specifyRENDER_ATTACHMENTusage for arg11b10ufloat-formatGPUTexture, as well as its blending and multisampling.
- The
viewFormatsOptionalAn array of enumerated values specifying othertexture formats permitted when calling
GPUTexture.createView()on this texture, in addition to the texture format specified in itsformatvalue.
Return value
AGPUTexture object instance.
Validation
The following criteria must be met when callingcreateTexture(), otherwise aGPUValidationError is generated and an invalidGPUTexture object is returned:
- A valid
usageis specified. - The values specified in
size(width, height, or depth/array layer count) are greater than 0. mipLevelCountis greater than 0.sampleCountis equal to 1 or 4.- If
dimensionis set to"1d":- The
sizewidth value is less than or equal to theGPUDevice'smaxTextureDimension1Dlimit. - The
sizeheight and depth/array layer count values are equal to 1. - The
sampleCountis equal to 1. - The
formatis not equal to acompressed format ordepth-or-stencil format.
- The
- If
dimensionis set to"2d": - If
dimensionis set to"3d":- The
sizewidth, and height, and depth/array layer count values are less than or equal to theGPUDevice'smaxTextureDimension3Dlimit. - The
sampleCountvalue is equal to 1. - The
formatis not equal to acompressed format ordepth-or-stencil format.
- The
- The
sizewidth value is a multiple of thetexel block width. - The
sizeheight value is a multiple of thetexel block height. - If
sampleCountis greater than 1:mipLevelCountis equal to 1.- The
sizedepth/array layer count value is equal to 1. usageincludes theGPUTextureUsage.RENDER_ATTACHMENTflag.usagedoes not include theGPUTextureUsage.STORAGE_BINDINGflag.- The specified format supports multi-sampling.
- The
mipLevelCountvalue is less than or equal to themaximum miplevel count. - The formats specified in
formatandviewFormatsarecompatible with one another. - If
usageincludes theGPUTextureUsage.RENDER_ATTACHMENTflag:formatis a renderable format (meaning a color renderable format, or adepth-or-stencil format).dimensionis set to"2d".
- If
usageincludes theGPUTextureUsage.STORAGE_BINDINGflag:- The specified
formatincludes theSTORAGE_BINDINGcapability (see thePlain color formats table for reference).
- The specified
Tier 1 and Tier 2 texture formats
This section describes the WebGPU Tier1 and Tier2 texture formats.
Tier 1
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 thetexture-formats-tier1 feature (seeGPUSupportedFeatures).
Enabling this feature allows:
- Using the following
formatswithusagesofRENDER_ATTACHMENT(including blendable and multisampling capabilities) andSTORAGE_BINDING(withread-onlyandwrite-onlyaccess):r16unormr16snormrg16unormrg16snormrgba16unormrgba16snorm
- Using the following
formatswith theRENDER_ATTACHMENTusage(including blendable and multisampling capabilities):r8snormrg8snormrgba8snorm
- Using the following
formatswith theSTORAGE_BINDINGusage(withread-onlyandwrite-onlyaccess):r8unormr8snormr8uintr8sintrg8unormrg8snormrg8uintrg8sintr16uintr16sintr16floatrg16uintrg16sintrg16floatrgb10a2uintrgb10a2unormrg11b10ufloat
- Using the following
GPUTextureformats in the destinationtextureofGPUQueue.copyExternalImageToTexture()calls:r16unormrg16unormrgba16unorm
Note:Enabling thetexture-formats-tier1 feature automatically enables therg11b10ufloat-renderable feature, which allows therg11b10ufloat texture to be used with theRENDER_ATTACHMENT usage, including blending and multisampling.
Tier2
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 thetexture-formats-tier2 feature (seeGPUSupportedFeatures).
Enabling this feature allows using the followingformats with theSTORAGE_BINDINGusage (withread-writeaccess):
r8unormr8uintr8sintrgba8unormrgba8uintrgba8sintr16uintr16sintr16floatrgba16uintrgba16sintrgba16floatrgba32uintrgba32sintrgba32float
Note:Enabling thetexture-formats-tier2 feature automatically enables therg11b10ufloat-renderable andtexture-formats-tier1 features.
Examples
In the WebGPU samplesTextured Cube sample, a texture to use on the faces of a cube is created by:
- Loading the image into an
HTMLImageElementand creating an image bitmap usingcreateImageBitmap(). - Creating a new texture using
createTexture(). - Copying the image bitmap into the texture using
GPUQueue.copyExternalImageToTexture().
// …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
| Specification |
|---|
| WebGPU> # dom-gpudevice-createtexture> |
Browser compatibility
See also
- TheWebGPU API