我正在创建一个纹理,查询内存要求,而这并不是我所期待的。这是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
的内存要求。但相反,它返回1,048,576
,这完全是1024 * 1024.似乎并不关心每个RGB通道的一个字节。我在这里缺少什么?
答案 0 :(得分:3)
你是对的,这应该返回3,145,728字节,但实际上是否可以使用R8G8B8_UNORM格式?如果没有,您将无法获得正确的分配大小,因为您实际上无论如何都无法使用该图像。
如果启用验证图层,则应从图像验证图层中抛出错误。
至少在GPU上,我现在不支持任何平铺模式或缓冲格式。但是例如R8G8B8A8或R8G8可用并返回正确的分配大小。
如果您的GPU上实际可用R8G8B8,您可以发布完整的VkImageCreateInfo结构,包括mips和层数吗?
因此,一个好主意是检查您请求(并且想要分配的)图像格式是否实际支持您的用例(线性,最佳,缓冲)。