08/20/2020
文章目录
纹理数组
- 在读取外部图片的时候,不仅可以获得宽高,贴图等级,还能获得层数或者面。
- 纹理数组表示多个纹理数据并以下标区分
layerCount = ktxTexture->numLayers;
图像的层
VkImageCreateInfo imageCreateInfo = vks::initializers::imageCreateInfo();
imageCreateInfo.arrayLayers = layerCount;
纹理数组
一张纹理保存了多个层
- 每个层对应一个纹理
- layerCount 和offset
// Setup buffer copy regions for array layers
std::vector<VkBufferImageCopy> bufferCopyRegions;
// To keep this simple, we will only load layers and no mip level
for (uint32_t layer = 0; layer < layerCount; layer++)
{
// Calculate offset into staging buffer for the current array layer
ktx_size_t offset;
KTX_error_code ret = ktxTexture_GetImageOffset(ktxTexture, 0, layer, 0, &offset);
assert(ret == KTX_SUCCESS);
// Setup a buffer image copy structure for the current array layer
VkBufferImageCopy bufferCopyRegion = {
};
bufferCopyRegion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
bufferCopyRegion.imageSubresource.mipLevel = 0;
bufferCopyRegion.imageSubresource.baseArrayLayer = layer;
bufferCopyRegion.imageSubresource.layerCount = 1;
bufferCopyRegion.imageExtent.width = ktxTexture->baseWidth;
bufferCopyRegion.imageExtent.height = ktxTexture->baseHeight;
bufferCopyRegion.imageExtent.depth = 1;
bufferCopyRegion.bufferOffset = offset;
bufferCopyRegions.push_back(bufferCopyRegion);
}
VkBufferImageCopy解释
决定缓冲区哪些部分被拷贝到图像中的哪部分
- bufferOffset,bufferRowLength,bufferImageHeigh:决定缓冲区被拷贝的区域
- imageSubresource,imageExtent,imageOffset:决定图像哪些部分拷贝进数据
拷贝到图像
subresourceRange.layerCount = layerCount;
// Copy the cube map faces from the staging buffer to the optimal tiled image
vkCmdCopyBufferToImage(
copyCmd,
stagingBuffer,
textureArray.image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
bufferCopyRegions.size(),
bufferCopyRegions.data()
);
图解
- 根据图像不同的布局改变图像访问掩码
转换图像布局
// Create an image memory barrier for changing the layout of
// an image and put it into an active command buffer