GPUTexture: createView() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

GPUTexture 接口的 createView() 方法创建一个 GPUTextureView 对象,该对象表示 GPUTexture 的特定视图。

语法

js
createView()
createView(descriptor)

参数

descriptor 可选

包含以下属性的对象:

arrayLayerCount 可选

一个数字,定义视图可访问的数组层数,从 baseArrayLayer 值开始。

如果省略 arrayLayerCount,则会按如下方式给定值:

  • 如果 dimension"1d""2d""3d",则 arrayLayerCount 为 1。
  • 如果 dimension"cube",则 arrayLayerCount 为 6。
  • 如果 dimension"2d-array""cube-array",则 arrayLayerCountGPUTexture.depthOrArrayLayers - baseArrayLayer
aspect 可选

一个枚举值,指定纹理的哪个(哪些)方面对纹理视图是可访问的。可能的值为:

"all"

纹理格式的所有可用方面都将对视图可访问,这可能意味着颜色、深度和模板,具体取决于您处理的是哪种格式。

"depth-only"

只有 深度或模板格式 的深度方面对视图可访问。

"stencil-only"

只有深度或模板格式的模板方面对视图可访问。

如果省略,aspect 的值为 "all"

baseArrayLayer 可选

一个数字,定义视图可访问的第一个数组层的索引。如果省略,baseArrayLayer 的值为 0。

baseMipLevel 可选

一个数字,表示视图可访问的第一个(最详细的)mipmap 级别。如果省略,baseMipLevel 的值为 0。

dimension 可选

一个枚举值,指定将纹理视为哪种格式。可能的值为:

  • "1d":将纹理视为一维图像。
  • "2d":将纹理视为单个二维图像。
  • "2d-array":将纹理视为二维图像数组。
  • "cube":将纹理视为立方体贴图。视图有 6 个数组层,对应于立方体的 [+X, -X, +Y, -Y, +Z, -Z] 面。采样在立方体贴图的面之间无缝进行。
  • "cube-array":将纹理视为 N 个立方体贴图的打包数组,每个立方体贴图有 6 个数组层,对应于立方体的 [+X, -X, +Y, -Y, +Z, -Z] 面。采样在立方体贴图的面之间无缝进行。
  • "3d":将纹理视为三维图像。

如果省略 dimension,则会按如下方式给定值:

format 可选

一个枚举值,指定纹理视图的格式。有关所有可能值的详细信息,请参阅规范中的 纹理格式 部分。

如果省略 format,则会按如下方式给定值:

label 可选

一个字符串,提供可用于识别对象的标签,例如在 GPUError 消息或控制台警告中。

mipLevelCount 可选

一个数字,定义视图可访问的 mipmap 级别数,从 baseMipLevel 值开始。

如果省略 mipLevelCount,则其值将设置为 GPUTexture.mipLevelCount - baseMipLevel

usage 可选

一组 按位标志,表示源纹理的使用标志(可在 GPUTexture.usage 属性中找到)的一个子集,这些标志与所选视图格式兼容。在视图格式与某些用法不兼容的情况下,可以使用此选项来限制允许的视图用法。可用的使用标志列在 GPUTexture.usage 值表 中。

默认值为 0,表示源纹理的完整使用标志集。如果视图的 format 不支持纹理的所有用法,则默认值将失败,并且必须显式指定视图的用法。

返回值

一个 GPUTextureView 对象实例。

验证

调用 createView() 时必须满足以下条件,否则会生成 GPUValidationError 并返回一个无效的 GPUTextureView 对象:

示例

典型的 createView() 用法

在 WebGPU Samples 的 立方体贴图演示 中,您将看到 createView() 的多种用法示例,既用于为 GPUDevice.createBindGroup() 调用创建视图 resource,也用于在 GPUCommandEncoder.beginRenderPass() 描述符的 depthStencilAttachment 对象中提供 view

js
const uniformBindGroup = device.createBindGroup({
  layout: pipeline.getBindGroupLayout(0),
  entries: [
    {
      binding: 0,
      resource: {
        buffer: uniformBuffer,
        offset: 0,
        size: uniformBufferSize,
      },
    },
    {
      binding: 1,
      resource: sampler,
    },
    {
      binding: 2,
      resource: cubemapTexture.createView({
        dimension: "cube",
      }),
    },
  ],
});

const renderPassDescriptor: GPURenderPassDescriptor = {
  colorAttachments: [
    {
      view: undefined, // Assigned later
      loadOp: "clear",
      storeOp: "store",
    },
  ],
  depthStencilAttachment: {
    view: depthTexture.createView(),

    depthClearValue: 1.0,
    depthLoadOp: "clear",
    depthStoreOp: "store",
  },
};

// …

const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);

// …

带有用法限制的 createView()

在此代码片段中,我们创建了一个纹理,然后创建了一个通过 usage 属性限制了其用法的视图。

js
const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: "rgba8unorm-srgb",
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage
});

规范

规范
WebGPU
# dom-gputexture-createview

浏览器兼容性

另见