【问题标题】:What is the best way of dealing with textures for a same shader in Vulkan?在 Vulkan 中处理同一着色器的纹理的最佳方法是什么?
【发布时间】:2018-12-01 19:44:32
【问题描述】:

让我说一下场景,我们有几个网格具有相同的着色器(材质类型,例如 PBR 材质),但网格材质之间的区别在于用于渲染它们的统一缓冲区和纹理。

对于统一缓冲区,我们有一个动态统一缓冲区技术,可以为命令缓冲区中的每次绘制指定统一缓冲区偏移量,但是对于图像直到这里我没有找到在命令缓冲区中为描述符指定图像视图的方法放。在我到目前为止看到的所有示例代码中,对于每个网格和该网格的每种材料,它们都有一个新的管道、描述符集等。

我认为这不是最好的方法,必须有一种方法只为一种材质类型设置一个管道和描述符集等,并且只更改统一缓冲区偏移和纹理图像视图和采样器,对吗?

如果我错了,这些样本是不是最好的方法?

我应该如何为每分钟网格将添加和删除的动态场景指定VkDescriptorPoolCreateInfo.maxSets(或其他类似限制)?

更新:

我认为可以为所有对象使用相同的管道和描述符集布局,但 VkDescriptorPoolCreateInfo.maxSets 存在问题(或其他类似限制),最佳实践仍然存在。

不重复

我正在寻找一种指定纹理的方法,例如我们可以使用动态统一缓冲区(以减少描述符集的数量)做些什么,除了这个问题之外,还有一些补充问题,主要是为了找到建议方式的最佳实践有答案。

【问题讨论】:

标签: vulkan


【解决方案1】:

你有很多选择。

最简单的机制是根据更改的频率将描述符集布局划分为多个集。每个场景改变的东西会在 set 0 中,每个对象(角色、静态网格等)改变的东西会在 set 1 中,而每个对象会改变的东西会在 set 2 中。管他呢。关键在于,随着频率的变化而变化的事物会出现在编号更高的集合中。

这个纹理是每个对象的,所以它会在最高编号的集合中。因此,您将为每个对象提供包含该纹理的自己的描述符集,然后在渲染时应用该描述符集。

至于VkDescriptorPoolCreateInfo.maxSets,您可以将其设置为您认为适合您系统的任何内容。如果你用完了,你总是可以创建另一个池;没有人强迫你只使用一个。

但是,这只是一种选择。您也可以employ array textures or arrays of textures(取决于您的硬件能力)。在任何一种方法中,您都有一个不同图像的数组(作为单个图像视图或绑定到相同阵列描述符的多个视图)。您的每个对象统一数据将具有该对象的纹理索引,以便它可以从纹理数组/纹理数组中获取索引。

【讨论】:

  • 所以我可以创建几个池,这不是一个坏习惯(?),我可以考虑为每 N 个集合创建池。
  • 我的计划是预定义所有设置的布局和管道,因为我的材料类型的数量是有限的。对于 set 我要创建一个贴图( texture(s) -> set )我认为这会尽可能减少 set 的数量,对吗?
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
相关资源
最近更新 更多