Vulkan Samples 阅读 -- Basics(四): Texture Arrays & Cube Map Textures & 3D Textures

本文深入探讨了TextureArrays、CubeMapTextures及3DTextures的准备、渲染流程与关键步骤。通过详细的代码片段和说明,读者可以了解到如何在Vulkan中加载、创建、布局纹理资源,并在shader中使用这些纹理。

Texture Arrays

prepare

  • loadAssets: 加载纹理
    • ktx_uint8_t *textureData 从读图API中将纹理读入
    • vkCreateBuffer: 创建stagingBuffer
    • vkGetBufferMemoryRequirements: 申请buffer使用的内存
    • vkAllocateMemory: 分配内存
    • vkBindBufferMemory: 绑定内存
    • vkMapMemory – memcpy – vkUnmapMemory: 将纹理信息复制到 host local staging buffer (specific layout)
    • std::vector bufferCopyRegions: 这里上节是绑定 mipmap 的, 这里 Texture Arrays 也是根据 layerCount 写入vector中.
    • vkCreateImage: Create optimal tiled target image on the device
      • 其中主要的是 imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
    • vkGetImageMemoryRequirements: 申请内存
    • vkAllocateMemory: 分配内存
    • vkBindImageMemory: 绑定资源
    • createCommandBuffer:创建复制命令
    • VkImageSubresourceRange: layerCount 定义为数组的个数
    • setImageLayout: 即 imageMemoryBarrier
    • vkCmdCopyBufferToImage:Copy mip levels from staging buffer
    • setImageLayout:从TRANSFER Barrier 到 FRAGMENT_SHADER
    • flushCommandBuffer
    • vkCreateSampler
    • vkCreateImageView
    • vkFreeMemory:Clean up staging resources
    • vkDestroyBuffer:Clean up staging resources
    • ktxTexture_Destroy:释放从磁盘读取图片的内存
  • generateCube:创建一个立方体
  • prepareUniformBuffers
    • createBuffer
      • 创建 UniformBuffer: 根据纹理数组个数申请 buffer size
      • vkMapMemory – memcpy – vkUnmapMemory: 更新 buffer 中数据
    • updateUniformBuffersCamera
  • setupDescriptorSetLayout
  • preparePipelines
  • setupDescriptorPool
  • setupDescriptorSet: 这里需要对纹理数据描述符进行绑定
    	// Image descriptor for the texture array
    	VkDescriptorImageInfo textureDescriptor =
    		vks::initializers::descriptorImageInfo(
    			textureArray.sampler,
    			textureArray.view,
    			textureArray.imageLayout);
    
  • buildCommandBuffers
  • shader 中获取Texture Array
    layout (binding = 1) uniform sampler2DArray samplerArray;
    -------------------------
    outFragColor = texture(samplerArray, inUV);
    

render

  • draw
  • updateUniformBuffersCamera

小结

   Texture Array 与 mipmap 绑定相似。不同的是Texture Array 还需在setupDescriptorSet 中进行设置。这样 shader 才能使用 sampler2DArray 获取纹理。

Cube Map Textures

prepare

  • loadAssets:
    • 加载模型
    • 加载cubmap
      • ktx_uint8_t *textureData 从读图API中将纹理读入
      • 创建 staging buffer:步骤都一样这里不重复了
      • std::vector bufferCopyRegions: 这里上节是绑定 mipmap 的, 这里 Texture Arrays 也是根据 layerCount 写入vector中.
      • vkCreateImage: Create optimal tiled target image on the device
        • 其中主要的是 imageCreateInfo.arrayLayers = 6;
        • imageCreateInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
      • vkGetImageMemoryRequirements - vkAllocateMemory - vkBindImageMemory
      • createCommandBuffer:创建复制命令
      • bufferCopyRegion:中需要cub的6个纹理以及它的mipmap
      • VkImageSubresourceRange: layerCount 定义为6
      • setImageLayout: 即 imageMemoryBarrier
      • vkCmdCopyBufferToImage:Copy mip levels from staging buffer
      • setImageLayout:从TRANSFER Barrier 到 FRAGMENT_SHADER
      • flushCommandBuffer
      • vkCreateSampler
      • vkCreateImageView
        • view.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
        • view.subresourceRange.layerCount = 6;
        • view.subresourceRange.levelCount = cubeMap.mipLevels;
      • vkFreeMemory:Clean up staging resources
      • vkDestroyBuffer:Clean up staging resources
      • ktxTexture_Destroy:释放从磁盘读取图片的内存
  • prepareUniformBuffers
    • createBuffer
    • updateUniformBuffers
  • setupDescriptorSetLayout
  • preparePipelines
    • 需要多加一个 渲染 CUBMAP Pipeline
  • setupDescriptorPool
  • setupDescriptorSet: 这里需要对纹理数据描述符进行绑定
    	// Image descriptor for the cube map texture
    	VkDescriptorImageInfo textureDescriptor =
    		vks::initializers::descriptorImageInfo(
    			cubeMap.sampler,
    			cubeMap.view,
    			cubeMap.imageLayout);
    
  • buildCommandBuffers
  • shader 中获取Texture Array
    layout (binding = 1) uniform samplerCube samplerCubeMap;;
    -------------------------
    outFragColor = texture(samplerCubeMap, inUVW);
    

render

  • draw

小结

   Cube Map Textures 其实就是 6个纹理组成的Texture Array, shader 使用 samplerCube 获取纹理。

3D Textures

prepare

  • generateQuad
  • setupVertexDescriptions
  • prepareUniformBuffers
    • createBuffer
    • updateUniformBuffers
  • prepareNoiseTexture
    • VkImageCreateInfo: .imageType = VK_IMAGE_TYPE_3D
    • vkCreateImage
    • vkGetImageMemoryRequirements-vkAllocateMemory-vkBindImageMemory
    • vkCreateSampler
    • VkImageViewCreateInfo: view.viewType = VK_IMAGE_VIEW_TYPE_3D
    • vkCreateImageView
    • updateNoiseTexture: 就是向纹理写入随机数据
      • stagingBuffer
        • vkCreateBuffer-vkGetBufferMemoryRequirements-vkAllocateMemory-vkBindBufferMemory
        • vkMapMemory-memcpy-vkUnmapMemory
        • createCommandBuffer
        • setImageLayout-vkCmdCopyBufferToImage-setImageLayout
        • flushCommandBuffer
    • vkFreeMemory
    • vkDestroyBuffer
  • setupDescriptorSetLayout
  • preparePipelines
  • setupDescriptorPool
  • setupDescriptorSet
  • buildCommandBuffers
  • shader 中获取Texture Array
    layout (binding = 1) uniform sampler3D samplerColor;
    -------------------------
    vec4 color = texture(samplerColor, inUV);
    

render

  • draw
  • updateUniformBuffers

小结

  3D Textures 很像Texture Array, shader 使用 sampler3D 获取纹理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值