4

我有一种情况,我可能需要在渲染过程中使用模板缓冲区,但是,直到执行渲染过程的中途,我才会“知道”。不幸的是,一旦渲染通道已经在进行中(如在 D3D12 中),Vulkan 就无法修改帧缓冲区的附件。但是,我在规范中发现,在分配内存和表面时使用“延迟分配内存”的概念。VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BITVK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT

不幸的是,似乎(从 中返回)中的所有VkMemoryType条目实际上都没有设置此功能位。此外,似乎没有一个 API-Samples 使用这些位。这只是驱动程序级别未实现的功能,驱动程序不支持此功能是否很常见?VkPhysicalDeviceMemoryPropertiesvkGetPhysicalDeviceMemoryProperties

我正在使用 Vulkan SDK 1.0.5,Nvidia 驱动程序 356.45。

4

1 回答 1

8

延迟分配的内存对您没有帮助。或者至少,可能不是,这取决于你的场景。原因有两个。首先,除非您不使用深度渲染,否则您必须使用打包的深度/模板图像(因为您不允许有单独的深度和模板缓冲区)。而且由于您(大概)不希望延迟分配深度部分,因此您别无选择,只能使用实际内存而不是延迟分配的内存。

其次,您所做的不是延迟分配内存的用途。它不适用于原本是可选的渲染部分。它适用于本质上是短暂的图像。

例如,考虑延迟渲染。您需要 g 缓冲区。但是您将在 g-buffer 过程中将它们填满,并且您将在照明过程中消耗它们。在那之后,您将不再使用它们的内容。

对于许多渲染器来说,这并不重要。但是使用基于图块的渲染器,它可以。为什么?因为如果一个 tile 足够大,可以一次存储所有 g-buffer 数据,那么实现实际上不需要将 g-buffer 数据写入内存。它可以将所有内容都保留在 tile 内存中,在 tile 中进行光照传递(将它们作为输入附件读取),然后忘记它们的存在。

但是 Vulkan 要求图像在使用之前必须绑定内存。存在惰性内存,以便您可以满足该要求,同时让实现知道您不会真正使用此内存。或者更重要的是,只有在您执行需要的操作时才会分配实际内存。

深度缓冲区和深度/模板缓冲区也可以延迟分配,只要您不需要像常规图像一样访问它们。但即便如此,它也不是一种使模板或深度测试成为可选的方法。这是关于使他们的后备存储变得短暂,内存可以存在于 TBR 的磁贴中,而其他任何地方都没有。您仍在进行操作;它只是不占用实际内存。

于 2016-04-14T03:14:33.187 回答