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_VISIBLE
与 HOST_COHERENT
和 HOST_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
。虽然仍然如此,但复制可能很快,渲染到平铺不佳的图像可能太慢...
我想使用 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_VISIBLE
与 HOST_COHERENT
和 HOST_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
。虽然仍然如此,但复制可能很快,渲染到平铺不佳的图像可能太慢...