特定尺寸的图像具有奇怪的内存大小

时间:2016-09-11 17:10:34

标签: c++ vulkan

我有一种奇怪的行为,即格式为R8G8B8A8_UNORM的大小为500x500的图像需要额外的内存量为8000字节,而其他维度则需要宽度*高度* 4字节。我正在做以下事情:

  1. 绘制颜色附件
  2. 将颜色附件复制到主机可见图像并映射(在所有布局过渡之后)。
  3. 这很好,但是,在映射之前检查主机可见图像的内存要求时,我得到以下结果:

    • w = 1000,h = 1000:4,000,000字节
    • w = 600,h = 600:1,440,000字节
    • w = 500,h = 500:1,008,000字节(这应该是1,000,000)

    在最后一种情况下生成的图像格式不正确。是否有任何明显的我遗漏可能会导致除w * h * 4以外的内存大小的不同公式?主机可见图像具有线性平铺,并在vkMapMemory命令之前已转换为布局VK_IMAGE_LAYOUT_GENERAL

    这是颜色附件的创建信息:

    VkImageCreateInfo color_image_info = {
      VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType,
      nullptr, // pNext (see documentation, must be null)
      0, // image flags
      VK_IMAGE_TYPE_2D, // image type
      this->color_format_, // image format
      {this->render_width_, this->render_height_, 1}, // image extent
      1, // level of detail = 1
      1, // layers = 1
      VK_SAMPLE_COUNT_1_BIT, // sampling
      VK_IMAGE_TILING_OPTIMAL, // optimal tiling
      VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // used for color
      VK_SHARING_MODE_EXCLUSIVE, // sharing between queue families
      1, // number queue families
      &this->queue_family_index_, // queue family index
      VK_IMAGE_LAYOUT_PREINITIALIZED // initial layout
    };
    

    这是主机可见图像:

    VkImageCreateInfo host_visible_image_info = {
      VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType,
      nullptr, // pNext (see documentation, must be null)
      0, // image flags
      VK_IMAGE_TYPE_2D, // image type
      this->color_format_, // image format
      {this->render_width_, this->render_height_, 1}, // image extent
      1, // level of detail = 1
      1, // layers = 1
      VK_SAMPLE_COUNT_1_BIT, // sampling
      VK_IMAGE_TILING_LINEAR, // linear tiling
      VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // used for color
      VK_SHARING_MODE_EXCLUSIVE, // sharing between queue families
      1, // number queue families
      &this->queue_family_index_, // queue family index
      VK_IMAGE_LAYOUT_PREINITIALIZED // initial layout // TODO: !!!Find out whether this has to be transisition first
    };
    

1 个答案:

答案 0 :(得分:1)

  

所以我想我只是计算padding =(required_size - computed_size)/ width / 4.

没有

Vulkan允许您通过vkGetImageSubresourceLayout查询图像的布局(使用线性平铺)。当您尝试映射纹理并访问其位时,这就是应该使用的内容。

VkSubresourceLayout将告诉您图像的行间距(即:必须偏移到达直接位于其上方/上方的像素的字节数)。该值不是必需的是宽度*像素大小。您必须为您要访问的每个图片查询它。