我一直在努力创建一个带有 Vulkan 渲染后端的游戏,因此我需要能够在屏幕上绘制多个对象。我以前使用过OpenGL,所以我在图形编程方面有一点经验。
我已经在 https://vulkan-tutorial.com/上完成了教程,我或多或少地理解了基本思想,但是有很多活动部件,我发现很难理解这一切。到目前为止,我能够使用 UBO 绘制一个具有任意数量顶点但不超过 1 个的单个对象,因为我不知道将什么从主渲染器对象解耦为可绘制对象。
我真的不知道哪些部分需要存在于vulkan-context
对象中,以及哪些部分在每个可绘制对象上是独立的/活的。我尝试做一些研究,我能找到的大部分内容都与实例化有关,这还不是我真正想要做的。
如何组织它有很多选择,所以没有单一的答案。但一般来说,可绘制的场景对象需要
- 描述绘制对象时要使用的状态和着色器的
VkPipeline
。 - 将着色器中的资源引用绑定到 Vulkan API 对象中的状态和数据
VkDescriptorSets
。 - 要用于可绘制对象的实际数据或包含数据的对象(图像、缓冲区(。
对于后两个,每个可绘制对象不一定具有不同的 API 对象。相反,可绘制对象可能只包含数据,并且您获取一个 API 对象(如描述符集(并在每次绘制时填充它,然后回收它。或者,您可能有一个由多个可绘制对象共享的VkBuffer
,每个可绘制对象的几何图形占用缓冲区的子范围。
另一方面,您的"上下文"将具有VkDevice
、VkQueue
(s(和各种池对象,如命令缓冲池、描述符池。通常,您还需要某种方法来跟踪命令缓冲区完成时应回收或销毁的内容(通常是帧粒度(。