初识Vulkun(18):统一缓冲区(Uniform Buffer)

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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值