Vulkan 离屏渲染 : TILING OPTIMAL or LINEAR

标签 vulkan

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

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

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

我认为第一种方案效率更高,虽然涉及到更多的复制步骤,但我不确定。还有一些更体面的解决方案吗?

谢谢!

最佳答案

第一个解决方案可能更好。
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不支持使用颜色附件(甚至阻止执行 vkCreateImage)。

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

关于Vulkan 离屏渲染 : TILING OPTIMAL or LINEAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51477954/

相关文章:

image - 我在使用 vulkan 绘制图像时遇到错误

vulkan - Vulkan 中常量缓冲区使用的描述符类型是什么?

Vulkan:Renderpass LoadOp 和 StoreOp 同步

vulkan - vkAcquireNextImageKHR : Application has already acquired the maximum number of images

linux - 标准 Linux vulkan 库中缺少 vulkan 符号?

c++ - 将 apiVersion 参数设置为 0 时的 VK_ERROR_INCOMPATIBLE_DRIVER

c++ - 是什么导致在多边形的每个三角形上渲染纹理?

c++ - 创建 Vulkan 实例导致访问冲突

glsl - 使用 Vulkan 在片段着色器中缓慢获取纹理

GLFW 多窗口多线程 OpenGL 和 Vulkan 混合