Vulkan 离屏渲染:TILING OPTIMAL 或 LINEAR

Vulkan off-screen rendering: TILING OPTIMAL or LINEAR

我想使用 Vulkan 构建一个离屏渲染器,并在每一帧中将渲染内容复制到主机内存。

一种方案是使用具有 TILING_OPTIMAL 的帧图像,并涉及另一个复制渲染通道以将内容复制到主机可见暂存缓冲区。

另一种方案是使用带有TILING_LINEAR的帧图像,并直接从图像中复制。

我觉得第一种方案效率更高,虽然多了一个复制步骤,但我不确定。还有一些更体面的解决方案吗?

谢谢!

您可能会发现只有第一种解决方案是可能的。规范保证仅 VK_IMAGE_USAGE_TRANSFER_SRC_BIT and/or VK_IMAGE_USAGE_TRANSFER_DST_BIT 用法支持具有线性平铺的图像。也可能支持其他用法,但不保证这种支持。因此,您要实施的代码可能适用于一个平台,但可能不适用于其他平台,并且根据您的目标,您可能需要实施这两种解决方案。

因此,首先检查您是否能够直接渲染成线性平铺图像。之后,如果可能的话,执行您自己的测试并检查哪种解决方案更适合您的情况。或者 - 如果您想瞄准更多平台 - 只实施应该适用于任何地方的第一个通用解决方案。

第一个解决方案可能更好。
VK_IMAGE_TILING_LINEAR 可能不好。
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 内存也可能不好。
第一个解决方案是双缓冲的,它允许更好地重叠设备本地和主机本地工作。

Vulkan Device Memory 文章似乎推荐 HOST_VISIBLEHOST_COHERENTHOST_CACHED 作为屏幕捕获等内容的暂存缓冲区。除了作为溢出内存,他们甚至不敢提及 GPU 写入非 DEVICE_LOCAL 内存类型。

What’s your Vulkan Memory Type 提到可以根据图像使用情况限制内存类型 (vkGetImageMemoryRequirements)。 VK_IMAGE_TILING_LINEAR 保证有 HOST_VISIBLE 内存,但是(如@Ekzuzy 所说)此限制可能表现为 VK_IMAGE_TILING_LINEAR VkFormat 不支持颜色附件使用(甚至阻止 [= =21=]).

UMA 设备可能值得衡量方法 nr。 2. 这些内存类型通常是 DEVICE_LOCAL|HOST_VISIBLE|HOST_CACHED。虽然仍然如此,但复制可能很快,渲染到平铺不佳的图像可能太慢...