Vulkan再探(8):纹理数组

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()
	);

图解

Texture Array

  • 根据图像不同的布局改变图像访问掩码

转换图像布局

// Create an image memory barrier for changing the layout of
// an image and put it into an active command buffer
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值