首页 > 其他分享 >Vulkan Descriptor绑定过程

Vulkan Descriptor绑定过程

时间:2023-08-09 23:45:41浏览次数:34  
标签:VK layout Descriptor setlayoutBind 绑定 DESCRIPTOR Vulkan TYPE writeDescriptors

如果shader中的资源是这么排布的:

//vs
layout(set = 0, binding = 0, std140) uniform UBO
{
    mat4 projection;
    mat4 view;
    mat4 model;
} ubo;
layout(location = 0) in vec3 inPos;
layout(location = 0) out vec3 outUVW;


//fs
layout(set = 0, binding = 1) uniform samplerCube samplerCubeMap;
layout(location = 0) in vec3 inUVW;
layout(location = 0) out vec4 outFragColor;

 

对应的代码如下:

//DescriptorSetLayout描述了shader所包含的uniform、sampler等Descriptor的绑定信息 
VkDescriptorSetLayout setLayout;
{
	std::vector<VkDescriptorSetLayoutBinding> setlayoutBind(2);
	setlayoutBind[0].binding = 0;
	setlayoutBind[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
	setlayoutBind[0]ayoutBinding.descriptorCount = 1;
	setlayoutBind[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;

	setlayoutBind[1].binding = 1;
	setlayoutBind[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
	setlayoutBind[1].descriptorCount = 1;
	setlayoutBind[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;

	VkDescriptorSetLayoutCreateInfo descriptorLayout = {};
	descriptorLayout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
	descriptorLayout.bindingCount = 2;
	descriptorLayout.pBindings = setlayoutBind.data();
	VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &setLayout));
}

// 基于Descriptor的布局创建 descriptorPool
VkDescriptorPool descriptorPool;
{
	VkDescriptorPoolCreateInfo descriptorPoolInfo = {};
	descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
	descriptorPoolInfo.maxSets = 5;
	descriptorPoolInfo.poolSizeCount = 2;
	std::vector<VkDescriptorPoolSize> poolSizes = {
		{.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = 8;}
		{.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .descriptorCount = 6};
	}
	descriptorPoolInfo.pPoolSizes = poolSizes.data();
	VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
}
		
// 基于上面setLayout,从descriptorPool中分配DescriptorSet
VkDescriptorSet descriptorSet;
{
	VkDescriptorSetAllocateInfo allocInfo = {};
	allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
	allocInfo.descriptorPool = descriptorPool;
	allocInfo.descriptorSetCount = 1;
	allocInfo.pSetLayouts = &setLayout;
	VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet));
}

// 将Descriptor组装更新到DescriptorSet中,下面示例绑定了一个buffer和一个imageview
{
	std::vector<VkWriteDescriptorSet> writeDescriptors(2);
	VkDescriptorBufferInfo descBufferInfo927 = {.buffer = buffer927, .offset = 0, .range = VK_WHOLE_SIZE};
	writeDescriptors[0].pBufferInfo = &descBufferInfo927;
	writeDescriptors[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
	writeDescriptors[0].dstSet = descriptorSet;
	writeDescriptors[0].dstBinding = 0;
	writeDescriptors[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
	writeDescriptors[0].descriptorCount = 1;

	VkDescriptorImageInfo descImageInfo920 = {.imageView = imageView920, .sampler = sampler919, .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
	writeDescriptors[1].pImageInfo = &descImageInfo920;
	writeDescriptors[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
	writeDescriptors[1].dstSet = descriptorSet;
	writeDescriptors[1].dstBinding = 1;
	writeDescriptors[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
	writeDescriptors[1].descriptorCount = 1;
	
	vkUpdateDescriptorSets(device, descriptorWriteSets.size(), writeDescriptors.data(), 0, nullptr);
}

		
// 将包装好的DescriptorSet绑定到commandbuffer上
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, nullptr);

 

标签:VK,layout,Descriptor,setlayoutBind,绑定,DESCRIPTOR,Vulkan,TYPE,writeDescriptors
From: https://www.cnblogs.com/sumingcai/p/17619144.html

相关文章

  • 使用MyEclipse如何部署Descriptor (XML)编辑器?
    Descriptor(XML)Editor编辑器包含了高级的XML编辑功能,在本文中您将了解到这些编辑功能、WebXML编辑等,此功能包含在MyEclipse中可用。MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论1.WebXML编辑器MyEclipse WebXML编辑器包括高级XML编......
  • scp tcpdump 多网卡绑定 永久修改网络相关配置文件
    scptcpdump多网卡绑定 永久修改网络相关配置文件网卡[root@localhost~]#vim/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO=static     //网卡获取地址模式ONBOOT=yes        //开机是否自启动​​IPADDR=192.168.91.105   ......
  • 练习回—绑定网卡
    BOND将多块网卡绑定同一IP地址对外提供服务。bond聚合链路模式共7种模式:0-6Mode实现“bond”两种方式:手写,改配置文件;命令.手动配置 ​BONDINGOPTS="mode=1miimon=100failover_mac=1"#miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms监测一次链路连接......
  • 传奇引擎知识分享传奇GEE引擎设置装备物品绑定的方法
    功能:设置新的装备绑定功能.(专用登录器)SetItemBind,设置物品和人物绑定绑定后物品属性会显示“已绑定”格式:SetItemBind装备位置(-1~13,-1时为OK框中物品)绑定(0-1)说明:参数20=取消1=绑定例子:绑定武器.#IFCheckGold10000#ACTSetItemBind11Take金币10000例子:取消......
  • 微信小程序8 data数据,双向绑定
    声明变量data我们每个页面文件(wxml)都有对应的js文件,点进去可以看到有data结构,这个就是存放变量的地方。data:{}我们写一个变量进去data:{message:"我是message变量"} 获取变量页面中使用<view>{{message}}</view>在js方法中调用变量,修改一下......
  • vue 动态绑定style class
    绑定style<!--基本使用--><div:style="{color:activeColor,fontSize:fontSize+'px'}">基本使用</div><!--数组--><div:style="styleArr">123</div><div:style="[astyle,bStyle]"&g......
  • 微信小程序7 事件绑定,传值,嵌套传值
    之前介绍的控件,比如按钮,单选,复选这些,通常我们都需要绑定相应的事件来实现功能。以button为例找到之前我们test页面的按钮,使用bind:tap绑定js事件<buttonbind:tap="clickBtn1">我是按钮1</button>在test.js中追加方法clickBtn1(){console.log("btn1isclick");......
  • WPF动态绑定隐藏或显示DataGrid一列
     因为datagridtemplatecolumn不在VirsualTree中,不能继承DataGrid的DataContext,所以想要绑定到datagridtemplatecolumn的visibility,需要添加一个代理 一、添加一個FrameworkElement的代理<Window.Resources><FrameworkElementx:Key="ProxyElement"DataContext......
  • Vue组件可以使用v-model实现双向数据绑定
    Vue组件可以使用v-model实现双向数据绑定。在组件中,可以在props中定义一个value属性,并在组件中的对应位置使用v-model进行绑定。例如:Copy<template><div><input:value="value"@input="$emit('input',$event.target.value)"></div></template......
  • C++函数传递函数指针、仿函数、绑定器、可调用对象
    只定义voidtestFunc(intnum,conststd::function<int(int)>&functor)就可以,其他的相当于这个函数的特化版本#include<iostream>#include<functional>usingnamespacestd;intfunc1(intnum){cout<<"func1:"<<num<<en......