首页 > 解决方案 > 在 Vulkan 中绘制多个对象

问题描述

我一直致力于创建一个带有 Vulkan 渲染后端的游戏,因此我需要能够在屏幕上绘制多个对象。我以前使用过 OpenGL,所以我在图形编程方面有一点经验。

我已经阅读了https://vulkan-tutorial.com/上的教程,我或多或少地了解了基本思想,但是有很多活动部分,我发现很难全部理解。到目前为止,我能够使用 UBO 绘制一个具有任意数量的顶点但不超过 1 个的单个对象,因为我不知道如何将主渲染器对象解耦为可绘制对象。

我真的不知道哪些部分需要存在于一个vulkan-context对象中,哪些部分是独立的/存在于每个可绘制对象上。我试过做一些研究,我能找到的大部分都与实例化有关,这并不是我现在想要做的。

标签: c++graphicsvulkan

解决方案


如何组织这个有很多选择,所以没有单一的答案。但一般来说,一个可绘制的场景对象将需要

  • 描述绘制对象时使用VkPipeline的状态和着色器。
  • 一个或多个VkDescriptorSets将着色器中的资源引用绑定到 Vulkan API 对象中的状态和数据。
  • 用于可绘制对象的实际数据或包含数据的对象(图像、缓冲区)。

对于后两者,您不一定对每个可绘制对象都有不同的 API 对象。相反,您的可绘制对象可能只有数据,并且您获得一个 API 对象(如描述符集)并在每次绘制时填充它,然后回收它。或者您可能有一个VkBuffer由多个可绘制对象共享,每个可绘制对象的几何图形占据缓冲区的一个子范围。

另一方面,您的“上下文”将具有VkDeviceVkQueue(s) 和各种池对象,例如命令缓冲池、描述符池。当命令缓冲区完成时(通常以帧粒度),您通常还会有一些方法来跟踪应该回收或销毁的东西。


推荐阅读