特定尺寸的图像具有奇怪的内存大小
Image of specific dimensions has strange memory size
我有一个奇怪的行为,格式为R8G8B8A8_UNORM的大小为500x500的图像需要额外的8000字节的内存量,而其他尺寸正好需要宽度*高度*4字节。我正在做以下事情:
- 画color-attachment
- 复制颜色附件到主机可见图像并映射它(在所有布局过渡之后)。
- w=1000,h=1000: 4,000,000字节
- w=600,h=600: 1440000 byte
- 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
};
号所以我想我只需要计算padding = (required_size - computed_size)/width/4.
Vulkan允许您通过vkGetImageSubresourceLayout
查询图像的布局(线性平铺)。当你试图映射纹理并访问它的位时,这就是你应该使用的。
VkSubresourceLayout
将告诉您图像的行间距(即:您必须偏移的字节数,以获得直接低于/高于它的像素)。这个值是,不需要为宽度*像素大小。您必须查询您想要访问的每个图像。
相关文章:
- 重新定位图像时如何前进到下一个内存块
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- C++gdi::内存中的位图到PNG图像
- 无法在 Opencv 中显示图像导致内存位置
- 我可以使用 stb_image_write.h 将 JPG 图像写入内存吗?
- 为什么在开始绘制获取的交换链图像时不需要内存障碍?
- 内存泄漏,许多位图图像C CLI
- 如何从内存中读取原始图像 (YUV 4:2:2) 格式的图像数据
- QT图像查看器示例,可能存在内存泄漏
- 在python openCV中一次将许多图像读入内存
- 尝试为图像缓冲区分配内存时 ptr 值错误
- 如何使用OpenCL处理GPU内存中总大小过大的图像
- 如何使用LEADTOOLS 19将图像效果应用于内存缓冲区中的JPEG
- Vulkan:在多个命令缓冲区中排列图像内存屏障
- 是否可以在图形卡上渲染场景,然后将图像传输回系统内存
- 存储矢量的精确内存图像
- 访问像素值,而不在内存中加载大图像的图像