我有一种情况,我可能需要在渲染过程中使用模板缓冲区,但是,直到执行渲染过程中途我都不会"知道".不幸的是,一旦渲染过程正在进行中,Vulkan就无法修改帧缓冲的附件(如D3D12).然而,我在规范中发现,有概念"懒洋洋地分配内存"使用VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
分配内存时,并VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
在表面.
不幸的是,似乎没有(返回)中的任何VkMemoryType
条目实际上都设置了此功能位.此外,似乎没有API样本使用这些位.这只是驱动程序级别的一个未实现的功能,并且驱动程序通常不支持此功能吗?VkPhysicalDeviceMemoryProperties
vkGetPhysicalDeviceMemoryProperties
我使用的是Vulkan SDK 1.0.5,Nvidia驱动程序356.45.
懒惰分配的内存对你没有帮助.或者至少,可能不是,取决于你的场景.原因有两方面.首先,除非您没有深度渲染,否则您必须使用打包深度/模板图像(因为您不允许使用单独的深度和模板缓冲区).而且由于你(大概)不希望深度部分被懒惰分配,你没有办法,只能使用实际的内存而不是懒惰分配的内存.
其次,你正在做的不是懒惰分配的内存.它不是用于渲染的部分是可选的.这是因为他们的本性短暂的图像.
例如,考虑延迟渲染.你需要g-buffers.但是你要在g-buffer传递期间填充它们,并且你将在光照传递期间消耗它们.在那之后,您将不再使用他们的内容.
对于许多渲染器来说,这并不重要.但是使用基于图块的渲染器,它可以.为什么?因为如果一个tile大到足以同时存储所有g-buffer数据,那么实现实际上并不需要将g-buffer数据写入内存.它可以将所有内容留在磁贴内存中,在磁贴内执行光照传递(将它们作为输入附件读取),然后忘记它们存在.
但是Vulkan要求图像在使用之前有内存绑定它们.存在惰性内存,以便您可以满足该要求,同时让实现知道您实际上不会使用此内存.或者更重要的是,只有在你做了需要它的事情时才会分配实际内存.
深度缓冲区和深度/模板缓冲区也可能被懒惰地分配,只要您不需要像常规图像那样访问它们.但即便如此,这也不是一种可以选择模板印刷或深度测试的方法.这是关于使他们的后备存储短暂存在,内存可以存在于TBR的区块内,而不是其他地方.你还在做手术; 它只是没有占用实际的记忆.