GPUCommandEncoder: beginRenderPass() 方法

可用性有限

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

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

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

GPUCommandEncoder 接口的 beginRenderPass() 方法开始编码渲染通道,并返回一个可用于控制渲染的 GPURenderPassEncoder

语法

js
beginRenderPass(descriptor)

参数

描述符(descriptor)

包含以下属性的对象:

colorAttachments

一个对象数组(参见颜色附件对象结构),定义了执行此渲染通道时将输出到的颜色附件。

depthStencilAttachment 可选

一个对象(参见深度/模板附件对象结构),定义了执行此渲染通道时将输出到和进行测试的深度/模板附件。

label 可选

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

maxDrawCount 可选

一个数字,表示将在渲染通道中执行的最大绘制调用次数。某些实现会使用此值来确定在渲染通道之前注入的工作量。除非您知道将执行更多绘制调用,否则应保留默认值 — 50000000。

occlusionQuerySet 可选

将存储此通道的遮挡查询结果的 GPUQuerySet

timestampWrites 可选

一个对象数组,定义此通道的时间戳查询值写入的位置和时间。这些对象具有以下属性

querySet

一个类型为 "timestamp"GPUQuerySet,时间戳查询结果将写入其中。

beginningOfPassWriteIndex

一个数字,指定 querySet 中写入渲染通道开始时的时间戳的查询索引。这是可选的 — 如果未定义,则不会写入通道开始时的时间戳。

endOfPassWriteIndex

一个数字,指定 querySet 中写入渲染通道结束时的时间戳的查询索引。这是可选的 — 如果未定义,则不会写入通道结束时的时间戳。

注意:需要启用 timestamp-query 功能才能使用时间戳查询。时间戳查询值以纳秒为单位写入,但值的确定方式是实现定义的。

颜色附件对象结构

颜色附件对象可以具有以下属性

clearValue 可选

在执行渲染通道之前,用于清除 view 纹理的颜色值。如果 loadOp 未设置为 "clear",则此值将被忽略。clearValue 接受一个数组或对象,表示四个颜色分量 rgba 的小数。

例如,您可以传入一个数组,如 [0.0, 0.5, 1.0, 1.0],或其等效对象 { r: 0.0, g: 0.5, b: 1.0, a: 1.0 }

如果省略 clearValue,则默认为 { r: 0, g: 0, b: 0, a: 0 }

depthSlice 可选

一个数字,表示此颜色附件将输出到的 3D 深度切片的索引,适用于 3D GPUTextureView view。指定此项后,WebGPU 可以在渲染通道内直接渲染到 3D 纹理的切片。

loadOp

一个枚举值,指示在执行渲染通道之前对 view 执行的加载操作。可能的值为

  • "clear":将此附件的 clearValue 加载到渲染通道中。
  • "load":将此附件的现有值加载到渲染通道中。

注意:建议在初始值无关紧要的情况下始终使用 "clear",因为它会在某些设备(如移动设备)上提供更好的性能。

storeOp

一个枚举值,指示在执行渲染通道之后对 view 执行的存储操作。可能的值为

  • "discard":丢弃此附件的渲染通道的最终值。
  • "store":存储此附件的渲染通道的最终值。
resolveTarget 可选

一个对象,表示如果 view 是多重采样的,将接收此颜色附件解析输出的纹理子资源。这可以是以下之一

  • GPUTextureView
  • GPUTexture:可以代替 GPUTextureView 使用,前提是需要默认视图。在此上下文中,GPUTexture 等同于使用不带参数的 GPUTexture.createView() 调用创建的 GPUTextureView 对象。
view

一个对象,表示此颜色附件将输出到的纹理子资源。这可以是以下之一

  • GPUTextureView
  • GPUTexture:可以代替 GPUTextureView 使用,前提是需要默认视图。在此上下文中,GPUTexture 等同于使用不带参数的 GPUTexture.createView() 调用创建的 GPUTextureView 对象。

注意:每个颜色或深度/模板附件必须是唯一的纹理子资源,并且用作附件的纹理子资源不能在渲染通道内使用。

深度/模板附件对象结构

depthStencilAttachment 对象可以具有以下属性

depthClearValue 可选

一个数字,表示在执行渲染通道之前清除 view 深度分量的值。如果 depthLoadOp 未设置为 "clear",则此值将被忽略。

该值必须在 0.0 到 1.0 之间(包括 0.0 和 1.0)。

depthLoadOp 可选

一个枚举值,指示在执行渲染通道之前对 view 深度分量执行的加载操作。可能的值为

  • "clear":将此附件的 clearValue 加载到渲染通道中。
  • "load":将此附件的现有值加载到渲染通道中。

注意:建议在初始值无关紧要的情况下始终使用 "clear",因为它会在某些设备(如移动设备)上提供更好的性能。

depthReadOnly 可选

一个布尔值。将此值设置为 true 会使 view 的深度分量变为只读。如果省略 depthReadOnly,则默认为 false

depthStoreOp 可选

一个枚举值,指示在执行渲染通道之后对 view 深度分量执行的存储操作。可能的值为

  • "discard":丢弃此附件的渲染通道的最终值。
  • "store":存储此附件的渲染通道的最终值。
stencilClearValue 可选

一个数字,表示在执行渲染通道之前清除 view 模板分量的值。如果 stencilLoadOp 未设置为 "clear",则此值将被忽略。

如果省略 stencilClearValue,则默认为 0。

stencilLoadOp 可选

一个枚举值,指示在执行渲染通道之前对 view 模板分量执行的加载操作。可能的值为

  • "clear":将此附件的 clearValue 加载到渲染通道中。
  • "load":将此附件的现有值加载到渲染通道中。

注意:建议在初始值无关紧要的情况下始终使用 "clear",因为它会在某些设备(如移动设备)上提供更好的性能。

stencilReadOnly 可选

一个布尔值。将此值设置为 true 会使 view 的模板分量变为只读。如果省略 stencilReadOnly,则默认为 false

stencilStoreOp 可选

一个枚举值,指示在执行渲染通道之后对 view 模板分量执行的存储操作。可能的值为

  • "discard":丢弃此附件的渲染通道的最终值。
  • "store":存储此附件的渲染通道的最终值。
view

一个对象,表示此深度/模板附件将输出到和读取的纹理子资源。这可以是以下之一

  • GPUTextureView
  • GPUTexture:可以代替 GPUTextureView 使用,前提是需要默认视图。在此上下文中,GPUTexture 等同于使用不带参数的 GPUTexture.createView() 调用创建的 GPUTextureView 对象。

返回值

一个 GPURenderPassEncoder 对象实例。

验证

调用 beginRenderPass() 时必须满足以下条件,否则将生成 GPUValidationError 并返回一个无效的 GPURenderPassEncoder

通用

  • colorAttachments.length 小于或等于 GPUDevicemaxColorAttachments 限制
  • 如果 colorAttachments 仅包含 null 值,则提供了 depthStencilAttachment
  • colorAttachmentsdepthStencilAttachment 中的所有 view 都具有相同的 GPUTexture.sampleCount 值和渲染范围(GPUTexture.heightGPUTexture.widthGPUTexture.depthOrArrayLayers)。
  • 如果设置了 occlusionQuerySet,则引用的 GPUQuerySettype"occlusion"

对于颜色附件对象

  • view 是可渲染的,并且 view 的格式(即,在原始 GPUTexture.createView() 调用的描述符中指定)是颜色可渲染格式。
  • 如果提供了 resolveTarget
    • view 的原始 GPUTexturesampleCount 大于 1。
    • resolveTarget 的原始 GPUTexturesampleCount 为 1。
    • resolveTarget 是可渲染的。
    • viewresolveTarget 提供的子资源大小匹配。
    • viewresolveTarget 的格式匹配。
  • 每个样本的颜色附件字节数小于或等于 GPUDevicemaxColorAttachmentBytesPerSample 限制

对于深度/模板附件对象

  • view 是可渲染的,其格式是深度或模板格式。
  • 如果 depthLoadOp 设置为 "clear",则提供了有效的 depthClearValue
  • 如果 view 的格式是组合的深度或模板格式,则 depthReadOnlystencilReadOnly 匹配。
  • 如果 view 的格式具有深度方面,并且 depthReadOnlyfalse,则提供了 depthLoadOpdepthStoreOp
  • 如果 view 的格式具有深度方面,并且 depthReadOnlytrue,则不提供 depthLoadOpdepthStoreOp
  • 如果 view 的格式具有模板方面,并且 stencilReadOnlyfalse,则提供了 stencilLoadOpstencilStoreOp
  • 如果 view 的格式具有模板方面,并且 stencilReadOnlytrue,则不提供 stencilLoadOpstencilStoreOp

对于时间戳查询

  • GPUDevice 中启用了 timestamp-query 功能

示例

在我们的基本渲染演示中,通过 GPUCommandEncoder 记录了许多命令。这些命令源于通过 beginRenderPass() 创建的 GPURenderPassEncoder

js
// …

// Create GPUCommandEncoder
const commandEncoder = device.createCommandEncoder();

// Create GPURenderPassDescriptor to tell WebGPU which texture to draw into, then initiate render pass

const renderPassDescriptor = {
  colorAttachments: [
    {
      clearValue: clearColor,
      loadOp: "clear",
      storeOp: "store",
      view: context.getCurrentTexture().createView(),
    },
  ],
};

const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);

// Draw a triangle

passEncoder.setPipeline(renderPipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.draw(3);

// End the render pass

passEncoder.end();

device.queue.submit([commandEncoder.finish()]);

// …

规范

规范
WebGPU
# dom-gpucommandencoder-beginrenderpass

浏览器兼容性

另见