1

在 WebGPU 中,您可以通过定义其描述符来创建渲染通道:

const renderPassDesc: GPURenderPassDescriptor = {
  colorAttachments: [
    {
      view: context.getCurrentTexture().createView(),
      loadValue: [0.2, 0.3, 0.5, 1],
      storeOp: "store"
    }
  ]
};

然后通过命令编码器运行它并开始录制。

const commandEncoder = device.createCommandEncoder();
const renderPass = commandEncoder.beginRenderPass(renderPassDesc);

因此,从本质上讲,您似乎需要当前纹理才能开始录制(即,不调用context.getCurrentTexture().createView()您就无法创建描述符,没有它您就无法开始录制)。但是 API 似乎暗示纹理可以改变每一帧(请注意,甚至几个月前也是这种情况,当时 API 不同,您将从交换链中检索纹理)。因此,基本上,您似乎无法跨不同帧重用渲染通道(当然,除非您不渲染到交换链,而是以屏幕外纹理为目标)。

所以,问题是。在 WebGPU 中,您可以在多个帧中重复使用相同的渲染通道吗?

与 Vulkan 的比较

我的问题源于我对 Vulkan 的(很少)接触。VKImage在 Vulkan 中,您可以重用记录的资源,因为有一种方法可以预先知道交换链中有多少对象;它们将具有从 0 开始的索引,例如0,12. 我不记得确切的语法,但我记得基本上你可以记录 3 个单独的命令缓冲区,每个命令缓冲区一个VKImage并跨帧重复使用它们。您所要做的就是在渲染循环中查询当前的索引VKImage并检索相应的记录命令缓冲区。

4

1 回答 1

1

通过查看有关getCurrentTexture的规范,目前似乎无法控制“交换”纹理的数量。

纹理是在“分配一个新的上下文纹理”步骤中创建的(如果它是null或者它被破坏了),因为那里的注释指出:

如果上下文中先前呈现的纹理与所需标准匹配,则可以重新使用其 GPU 内存。

每次在“更新文档的渲染”步骤中,如果当前纹理不是null并且它没有被销毁,那么它将被呈现、销毁并设置为null.

规格中的另一个说明:

开发人员可以预期,每次调用 getCurrentTexture() 在同一帧内(即在调用更新渲染之间)都会返回相同的 GPUTexture 对象,除非调用了 configure()。

所有这些似乎都表明您必须为每一帧获取当前纹理并创建所有相关的其他对象。

于 2021-12-28T10:03:46.053 回答