我有一种奇怪的行为,即格式为R8G8B8A8_UNORM的大小为500x500的图像需要额外的内存量为8000字节,而其他维度则需要宽度*高度* 4字节。我正在做以下事情:
这很好,但是,在映射之前检查主机可见图像的内存要求时,我得到以下结果:
在最后一种情况下生成的图像格式不正确。是否有任何明显的我遗漏可能会导致除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
};
答案 0 :(得分:1)
所以我想我只是计算padding =(required_size - computed_size)/ width / 4.
没有
Vulkan允许您通过vkGetImageSubresourceLayout
查询图像的布局(使用线性平铺)。当您尝试映射纹理并访问其位时,这就是应该使用的内容。
VkSubresourceLayout
将告诉您图像的行间距(即:必须偏移到达直接位于其上方/上方的像素的字节数)。该值不是必需的是宽度*像素大小。您必须为您要访问的每个图片查询它。