08/09/2020
文章目录
前言
着色器要想访问到统一缓冲区中的资源,我们需要创建一个描述符资源。描述符是着色器自由访问缓冲区和图像的一种方式。
- 在管线创建时指定描述符的布局结构,声明类型
- 从描述符对象池分配描述符集合,指定数据
- 在渲染阶段绑定描述符集合,记录并使用
第一步:在管线创建时指定描述符的布局结构,声明类型
描述符布局(descriptor layout)指定了管线访问的资源的类型,就像渲染通道指定附件的类型一样。声明一种叫做统一缓冲区的资源描述符。
传输的数据格式
struct UniformBufferObject {
alignas(16) glm::mat4 model;
alignas(16) glm::mat4 view;
alignas(16) glm::mat4 proj;
};
着色器对应数据格式
layout(binding = 0) uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
} ubo;
基本由layout,binding,uniform作为关键字
创建描述符布局
VkDescriptorSetLayout descriptorSetLayout;
void createDescriptorSetLayout() {
VkDescriptorSetLayoutBinding uboLayoutBinding{
};
uboLayoutBinding.binding = 0;
uboLayoutBinding.descriptorCount = 1;
uboLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
uboLayoutBinding.pImmutableSamplers = nullptr;
uboLayoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
VkDescriptorSetLayoutCreateInfo layoutInfo{
};
layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
layoutInfo.bindingCount = 1;
layoutInfo.pBindings = &uboLayoutBinding;
if (vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr, &descriptorSetLayout) != VK_SUCCESS) {
throw std::runtime_error("failed to create descriptor set layout!");
}
}
- 指定了着色器中binding属性
- UNIFORM_BUFFER指定了描述符类型为统一缓冲区
- stageFLags表示这个描述符在顶点缓冲区使用
管线确认描述符资源
VkPipelineLayoutCreateInfo pipelineLayoutInfo