08/13/2020
文章目录
描述符资源
描述符是一个数据结构用来表示着色器的资源,例如缓冲区,图像视图,采样器或者组合图像采样器。这些描述符都被组合进描述符集合中去,和它们由描述符集合布局决定,最后描述符集合被用于管道布局。
基本创建流程
- 创建描述符集合布局
- 创建管道布局
- 创建描述符
- 创建描述符池
- 分配描述符集合
- 写入并更新描述符集合
描述符类型
- STOREAGE_IMAGE
- SAMPLER
- SAMPLED_IMAGE
- COMBINED_IMAGE_SAMPLER: 组合了SAMPLER和SAMPLED_IMAGE
- UNIFORM_TEXEL_BUFFER
- STORAGE_TEXEL_BUFFER
- STOREAGE_BUFFER
- UNIFORM_BUFFER
- UNIFORM_BUFFER_DYNAMIC
- STORAGE_BUFFER_DYNAMIC
- INLINE_UNIFORM_BLOCK_EXT
- INPUT_ATTACHMENT
- ACCELERATION_STRUCTURE_KHR
描述符集合布局:决定着色器关键字binding
描述符集合是一个容器存放描述符,类型和数量由描述符集合布局确定。
创建布局信息DescriptorLayoutCreateInfo
// Provided by VK_VERSION_1_0
typedef struct VkDescriptorSetLayoutCreateInfo {
VkStructureType sType; //VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
const void* pNext; //0
VkDescriptorSetLayoutCreateFlags flags; //
uint32_t bindingCount; //VkDescriptorSetLayoutBinding 的数量
const VkDescriptorSetLayoutBinding* pBindings; //可以是数组,数据
} VkDescriptorSetLayoutCreateInfo;
类型和数量 VkDescriptorSetLayoutBinding
// Provided by VK_VERSION_1_0
typedef struct VkDescriptorSetLayoutBinding {
uint32_t binding; //决定着色器关键字binding
VkDescriptorType descriptorType; //描述符类型
uint32_t descriptorCount; //数量
VkShaderStageFlags stageFlags; //在哪一个管道
const VkSampler* pImmutableSamplers;
} VkDescriptorSetLayoutBinding;
例子:描述符集合布局
顶点着色器
#version 450
//声明阶段
layout (binding = 0) uniform UBOMatrices {
mat4 projection;
} uboMatrices;
layout (set = 0, binding = 1) uniform sampler2D samplerColorMap;
C++ 代码 描述VkDescriptorSetLayoutBinding:
std::array<VkDescriptorSetLayoutBinding,2> setLayoutBindings{
};
setLayoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; //Uniform Buffer类型
setLayoutBindings[0].binding = 0; //对应binding关键字 0
setLayoutBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; //顶点着色器阶段
setLayoutBindings[0].descriptorCount = 1