首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在WebGPU中,可以在多个帧中重用相同的呈现传递吗?

在WebGPU中,可以在多个帧中重用相同的呈现传递吗?
EN

Stack Overflow用户
提问于 2021-12-26 21:02:24
回答 1查看 404关注 0票数 1

在WebGPU中,可以通过定义呈现传递描述符来创建呈现传递:

代码语言:javascript
代码运行次数:0
运行
复制
const renderPassDesc: GPURenderPassDescriptor = {
  colorAttachments: [
    {
      view: context.getCurrentTexture().createView(),
      loadValue: [0.2, 0.3, 0.5, 1],
      storeOp: "store"
    }
  ]
};

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

代码语言:javascript
代码运行次数:0
运行
复制
const commandEncoder = device.createCommandEncoder();
const renderPass = commandEncoder.beginRenderPass(renderPassDesc);

因此,从本质上说,似乎需要当前的纹理才能开始记录(也就是说,如果不调用context.getCurrentTexture().createView(),就无法创建描述符,而没有描述符就无法开始录制)。但是API似乎表明纹理可以改变每个框架的(请注意,即使在几个月前,当API是不同的并且您将从交换链中检索纹理时,情况也是如此)。因此,基本上看来,不能重用呈现传递跨不同框架的(当然,除非您没有呈现到交换链,而是以屏幕外纹理为目标)。

所以问题是。In WebGPU,您能在多个帧中重用相同的呈现传递吗?

与Vulkan的比较

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-28 10:03:46

通过查看有关getCurrentTexture的规范,此时似乎没有对“交换”纹理的数量进行控制。

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

如果先前显示的上下文纹理与所需的条件匹配,则可以重用其GPU内存。

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

规范中的另一个注意事项:

开发人员可以预期,除非调用getCurrentTexture(),否则在同一帧内(即在更新的调用和呈现之间)对getCurrentTexture()的每次调用都会返回相同的getCurrentTexture对象。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70489849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档