让我说说这种情况,我们有几个具有相同着色器(材质类型,例如PBR材质)的网格,但是网格材质之间的区别是统一的缓冲区和用于渲染它们的纹理。
对于统一缓冲区,我们有一种动态的统一缓冲区技术,可以为命令缓冲区中的每个绘制指定统一缓冲区偏移量,但是对于图像,直到这里我都没有找到在描述符的命令缓冲区中指定图像视图的方法组。在到目前为止我看到的所有示例代码中,对于每个网格和该网格的每种材料,它们都有一个新的管线,描述符集等。
我认为这不是最好的方法,必须有一种方法仅针对材料类型设置一个管道和描述符集,等等,并且仅更改统一缓冲区偏移量和纹理图像视图和采样器,对吗?
如果我错了,这些样本是最好的方法吗?
如何为每分钟都会添加和删除的动态场景指定VkDescriptorPoolCreateInfo.maxSets
(或类似的其他限制)?
我认为可能对所有对象使用相同的管道和描述符集布局,但是VkDescriptorPoolCreateInfo.maxSets
(或类似的其他限制)存在问题,并且最佳实践仍然存在。
我一直在寻找一种指定纹理的方式,例如我们可以使用动态统一缓冲区(以减少描述符集的数量)进行处理的方式,与此问题一起存在补充性问题,主要是为了找到建议的最佳实践方法有答案。
答案 0 :(得分:2)
您有很多选择。
最简单的机制是根据更改频率将描述符集布局划分为多个集。随场景变化的事物将在集合0中,按对象变化的事物(字符,静态网格物体等)将在集合1中,而随对象变化的事物将在集合2中。管他呢。关键是,频率变化较大的事物会进入编号更高的集合。
此纹理是针对每个对象的,因此它将位于编号最高的集中。因此,您将为每个对象提供自己的包含该纹理的描述符集,然后在进行渲染时应用该描述符集。
对于VkDescriptorPoolCreateInfo.maxSets
,您将其设置为适合您的系统的任何值。而且,如果用完了,您总是可以创建另一个池。没有人强迫您只使用一个。
但是,这只是一种选择。您也可以employ array textures or arrays of textures(取决于您的硬件功能)。在这两种方法中,您都有一个不同图像的数组(作为单个图像视图或绑定到同一数组描述符的多个视图)。每个对象的统一数据将具有该对象的纹理索引,以便可以从纹理数组/纹理数组中获取索引。