繁体   English   中英

如何在 vulkan 中处理动态数量的绘制调用

[英]How to handle a dynamic number of draw calls in vulkan

我目前正在尝试进入 Vulkan,并且我主要遵循了这个众所周知的Vulkan 教程,一直在尝试将其集成到我围绕 OpenGL 构建的框架中。我正处于可以成功呈现object 在屏幕上,并通过将转换矩阵传递到链接到我的着色器代码的统一缓冲区来让 object 移动。

在本教程中,作者专注于在屏幕上绘制一个 object,这是一个很好的起点,但我希望最终代码如下所示:

drawRect(position1, size1, color1);
drawRect(position2, size2, color2);
...

我第一次尝试实现这样的东西以我提交命令缓冲区而告终,它在开始时只创建并记录一次,我想渲染的每个 object 一次,并确保在每个命令之间更新统一数据缓冲区提交。 然而,这不起作用,在使用 renderdoc 进行一些调试后,我意识到这是因为启动渲染过程会清除屏幕。

如果我正确理解我的情况,实现我想要的唯一方法是每帧重新创建命令缓冲区:

  • 记录n ,我们要在屏幕上画东西的次数;
  • 在一帧结束时,分配n统一缓冲区,并填充相应的数据;
  • 创建n描述符集,以便能够将这些统一缓冲区与我的着色器链接起来;
  • 通过重复n次使用vkCmdDrawIndexed绑定描述符集并使用vkCmdBindDescriptorSets绘制请求的数据的过程来记录命令缓冲区。

似乎每一帧都需要做很多工作。 这是我应该如何处理动态数量的绘制调用吗? 还是有一些我不知道/弄错的概念?

  1. 通常命令缓冲区实际上每帧都会重新记录,Vulkan 允许使用命令池进行多线程记录。
  2. 存在间接绘制:您将有关绘制命令的数据(索引计数、实例计数等)存储到单独的缓冲区中,然后驱动程序在您提交命令时从缓冲区中读取数据; vkCmdDraw*Indirect要求您在录制时指定绘制命令的数量; vkCmdDraw*IndirectCount还允许您在缓冲区中存储绘制命令的数量。

我也看不出为什么你必须重新创建统一缓冲区,描述符设置每一帧; 事实上,据我所知,Vulkan 鼓励您尽可能地预烘焙东西,而描述符集就是一个工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM