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
- createBuffer
- 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
- stagingBuffer
- 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 获取纹理。
本文深入探讨了TextureArrays、CubeMapTextures及3DTextures的准备、渲染流程与关键步骤。通过详细的代码片段和说明,读者可以了解到如何在Vulkan中加载、创建、布局纹理资源,并在shader中使用这些纹理。
: Texture Arrays & Cube Map Textures & 3D Textures&spm=1001.2101.3001.5002&articleId=118323125&d=1&t=3&u=a22b011c74bb4436a26e7383fba84a1a)
4万+

被折叠的 条评论
为什么被折叠?



