GPUCommandEncoder: beginRenderPass() 方法
注意:此功能在 Web Workers 中可用。
GPUCommandEncoder 接口的 beginRenderPass() 方法开始编码渲染通道,并返回一个可用于控制渲染的 GPURenderPassEncoder。
语法
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接受一个数组或对象,表示四个颜色分量r、g、b和a的小数。例如,您可以传入一个数组,如
[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
GPUTextureViewview。指定此项后,WebGPU 可以在渲染通道内直接渲染到 3D 纹理的切片。 loadOp-
一个枚举值,指示在执行渲染通道之前对
view执行的加载操作。可能的值为"clear":将此附件的clearValue加载到渲染通道中。"load":将此附件的现有值加载到渲染通道中。
注意:建议在初始值无关紧要的情况下始终使用
"clear",因为它会在某些设备(如移动设备)上提供更好的性能。 storeOp-
一个枚举值,指示在执行渲染通道之后对
view执行的存储操作。可能的值为"discard":丢弃此附件的渲染通道的最终值。"store":存储此附件的渲染通道的最终值。
resolveTarget可选-
一个对象,表示如果
view是多重采样的,将接收此颜色附件解析输出的纹理子资源。这可以是以下之一GPUTextureViewGPUTexture:可以代替GPUTextureView使用,前提是需要默认视图。在此上下文中,GPUTexture等同于使用不带参数的GPUTexture.createView()调用创建的GPUTextureView对象。
view-
一个对象,表示此颜色附件将输出到的纹理子资源。这可以是以下之一
GPUTextureViewGPUTexture:可以代替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-
一个对象,表示此深度/模板附件将输出到和读取的纹理子资源。这可以是以下之一
GPUTextureViewGPUTexture:可以代替GPUTextureView使用,前提是需要默认视图。在此上下文中,GPUTexture等同于使用不带参数的GPUTexture.createView()调用创建的GPUTextureView对象。
返回值
一个 GPURenderPassEncoder 对象实例。
验证
调用 beginRenderPass() 时必须满足以下条件,否则将生成 GPUValidationError 并返回一个无效的 GPURenderPassEncoder。
通用
colorAttachments.length小于或等于GPUDevice的maxColorAttachments限制。- 如果
colorAttachments仅包含null值,则提供了depthStencilAttachment。 colorAttachments和depthStencilAttachment中的所有view都具有相同的GPUTexture.sampleCount值和渲染范围(GPUTexture.height、GPUTexture.width和GPUTexture.depthOrArrayLayers)。- 如果设置了
occlusionQuerySet,则引用的GPUQuerySet的type为"occlusion"。
对于颜色附件对象
view是可渲染的,并且view的格式(即,在原始GPUTexture.createView()调用的描述符中指定)是颜色可渲染格式。- 如果提供了
resolveTargetview的原始GPUTexture的sampleCount大于 1。resolveTarget的原始GPUTexture的sampleCount为 1。resolveTarget是可渲染的。view和resolveTarget提供的子资源大小匹配。view和resolveTarget的格式匹配。
- 每个样本的颜色附件字节数小于或等于
GPUDevice的maxColorAttachmentBytesPerSample限制。
对于深度/模板附件对象
view是可渲染的,其格式是深度或模板格式。- 如果
depthLoadOp设置为"clear",则提供了有效的depthClearValue。 - 如果
view的格式是组合的深度或模板格式,则depthReadOnly与stencilReadOnly匹配。 - 如果
view的格式具有深度方面,并且depthReadOnly为false,则提供了depthLoadOp和depthStoreOp。 - 如果
view的格式具有深度方面,并且depthReadOnly为true,则不提供depthLoadOp和depthStoreOp。 - 如果
view的格式具有模板方面,并且stencilReadOnly为false,则提供了stencilLoadOp和stencilStoreOp。 - 如果
view的格式具有模板方面,并且stencilReadOnly为true,则不提供stencilLoadOp和stencilStoreOp。
对于时间戳查询
GPUDevice中启用了timestamp-query功能。
示例
在我们的基本渲染演示中,通过 GPUCommandEncoder 记录了许多命令。这些命令源于通过 beginRenderPass() 创建的 GPURenderPassEncoder
// …
// 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 |
浏览器兼容性
加载中…