2

I'm creating a texture, querying the memory requirements, and it's not what I was expecting. Here's the ImageCreateInfo structure:

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

Now, I was expecting one byte for each of R,G,B, at width and height of 1024 to give memory requirements of 3 * 1024 * 1024 = 3,145,728. But instead, it returns 1,048,576, which is perfectly 1024 * 1024. It seems to not care about the one byte for each channel of RGB. What am I missing here?

4

1 回答 1

3

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

如果您启用验证层,这应该会从图像验证层中引发错误。

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

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

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

于 2016-06-15T10:45:10.427 回答