由于某些原因,我想将纹理划分为纹理数组。我的纹理大小是 72x64,我想将其划分为 6x8 大小的 96 个纹理数组。它们消耗相同数量的像素,但纹理数组占用更多的内存。我不知道为什么。他们的记忆力要求是这样的
大纹理-> 尺寸:8196 排列:1024 内存类型位:3
纹理数组-> 尺码:49152 排列:1024 内存类型位:3
VkImageCreateInfo fontImageInfo{};
fontImageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
fontImageInfo.imageType = VK_IMAGE_TYPE_2D;
fontImageInfo.format = VK_FORMAT_R8_UNORM;
fontImageInfo.extent = { 6, 8, 1U };
fontImageInfo.mipLevels = 1;
fontImageInfo.arrayLayers = 12 * 8;
fontImageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
fontImageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
fontImageInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
fontImageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
fontImageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
虽然阵列图像中的阵列层分配在同一内存块中,但每个层都需要充当单独的图像,具有自己的 mipmap 链等。此外,您还可以创建阵列图像的单图像视图。因此,系统需要能够独立于其余部分访问阵列图像中的阵列层,通常甚至不知道正在访问的图像恰好是阵列的一部分。
因此,阵列图像的连续分配方式与“等效”非阵列图像中的像素的分配方式不同。也就是说,下一层不会从更大图像中下一个像素开始的地方开始。每一层都将以自己的对齐方式开始。根据您获得的数字,您的硬件很有可能以 512 字节对齐方式分配层 (49152 / 96 = 512)。
如果数组中的每个图像本身都使用所有这 512 个字节,那就没问题了。但对于较小的子图像尺寸 (6x8),这是不可能的。因此,大量空间被浪费在对齐要求上。
考虑到您想要排列的子图像非常小,最好只使用一张大的单图像而不是使用数组层。