c++ - 在 Vulkan 中绘制多个对象
问题描述
我一直致力于创建一个带有 Vulkan 渲染后端的游戏,因此我需要能够在屏幕上绘制多个对象。我以前使用过 OpenGL,所以我在图形编程方面有一点经验。
我已经阅读了https://vulkan-tutorial.com/上的教程,我或多或少地了解了基本思想,但是有很多活动部分,我发现很难全部理解。到目前为止,我能够使用 UBO 绘制一个具有任意数量的顶点但不超过 1 个的单个对象,因为我不知道如何将主渲染器对象解耦为可绘制对象。
我真的不知道哪些部分需要存在于一个vulkan-context
对象中,哪些部分是独立的/存在于每个可绘制对象上。我试过做一些研究,我能找到的大部分都与实例化有关,这并不是我现在想要做的。
解决方案
如何组织这个有很多选择,所以没有单一的答案。但一般来说,一个可绘制的场景对象将需要
- 描述绘制对象时使用
VkPipeline
的状态和着色器。 - 一个或多个
VkDescriptorSets
将着色器中的资源引用绑定到 Vulkan API 对象中的状态和数据。 - 用于可绘制对象的实际数据或包含数据的对象(图像、缓冲区)。
对于后两者,您不一定对每个可绘制对象都有不同的 API 对象。相反,您的可绘制对象可能只有数据,并且您获得一个 API 对象(如描述符集)并在每次绘制时填充它,然后回收它。或者您可能有一个VkBuffer
由多个可绘制对象共享,每个可绘制对象的几何图形占据缓冲区的一个子范围。
另一方面,您的“上下文”将具有VkDevice
、VkQueue
(s) 和各种池对象,例如命令缓冲池、描述符池。当命令缓冲区完成时(通常以帧粒度),您通常还会有一些方法来跟踪应该回收或销毁的东西。
推荐阅读
- neo4j - Cypher:子句/函数的命名系统是什么?
- ios - ios 中用于键盘文本替换的首选项:root 是什么?
- c - 比较C中两个数据文件的int值
- c# - 表单数据绑定失败
- mysql - 在 SQL 中使用范围(1 到 6)从表中获取浮点值?
- java - 如何使用在层微服务中生成的令牌返回 HttpResponse
- fortran - 当循环的顺序很重要时,如何优化 Fortran 中的嵌套 for 循环?
- python - 返回数据框中每对行之间的获胜行
- batch-file - 你可以让一个批处理文件创建一个谷歌表格吗?
- sql-server - 即使我备份日志文件,我是否必须备份 .trn 文件