MemoryRequirements 中的大小不是我所期望的

Size in MemoryRequirements not what I'm expecting

我正在创建纹理,查询内存要求,这不是我所期望的。这是 ImageCreateInfo 结构:

ImageCreateInfo()
    .X2D(1024, 1024)
    .Format(Format::R8G8B8_UNORM)
    .InitialLayout(ImageLayout::PREINITIALIZED)
    .Tiling(ImageTiling::LINEAR)
    .Usage(ImageUsageFlagBits::TRANSFER_SRC);

现在,我期望 R、G、B 各有一个字节,宽度和高度为 1024,从而满足 3 * 1024 * 1024 = 3,145,728 的内存要求。但是相反,它 returns 1,048,576,这是完美的 1024 * 1024。它似乎不关心 RGB 每个通道的一个字节。我在这里错过了什么?

你是对的,这应该 return 3,145,728 字节,但是 R8G8B8_UNORM 格式在你的实现中是否真的可用?否则,您将无法获得正确的分配大小,因为您实际上无论如何都无法使用该图像。

如果启用验证层,顺便说一句,这应该会从图像验证层中抛出错误。

至少在我现在的 GPU 上,它不支持任何平铺模式或作为缓冲区格式。但是例如R8G8B8A8 或 R8G8 可用并且 return 正确的分配大小。

如果 R8G8B8 在您的 GPU 上实际可用,您能否 post 您完整的 VkImageCreateInfo 结构,包括 mips 和层数?

因此,一个好主意是检查您请求(并希望为其分配)的图像格式是否真的支持您的用例(线性、最佳、缓冲)。