Vulkan-Descriptor
Vulkan - Desciptor
1. sources in OpenGL
- 与OpenGL不同,Vulkan的所有使用的资源都需要显示的定义,最后把资源放到合适的位置,调用渲染,最后显示出正确的图形。 在OpenGL中,有如下Shader代码:
1 |
|
在CPU端我们需要手动建立一个绑定关系,让CPU的纹理资源绑定到具体的点位,以及让Shader知道应该去哪个点位招对应的数据。
1 | glUseProgram(program); /// 绑定shader |
source in Vulkan
从Vulkan的Shader看起 1
2
3
4
5
6
7
8
9
10
11
12
13// 相机数据
layout(set = 0, binding=0) uniform CameraUBO{
mat4 viewProject;
} cam;
// set = 1: 模型数据
layout(set = 1, binding = 0) uniform ModelUBO {
mat4 model;
} model;
// set = 1: 模型的纹理
layout(set = 1, binding = 1) uniform sampler2D tex;
首先这个里面有两组编号体系
- set
- binding
接下来我们就会介绍这两个是两个什么样子的概念.
从我们的着色器程序片段可以看到,我们定义了三个资源,当这个shader
程序在运行的时候,需要知道这三个资源分别在什么地方,或者说,shader
需要知道我们去找到这三个资源。
要完成上述的功能,需要使用Vulkan
的描述符集的体系。
描述符集有三个比较核心的概念:
VkDescriptorSetLayoutBinding
, 定义每一条资源, 对应binding
的声明VkDescriptorSetLayout
, 是由多个VkDescriptorSetLayoutBinding
组成,描述一个DescriptorSet
,对应shader
中的set=x
的定义.VkDescriptorSet
, 是一个实例,根据VkDescriptorSetLayout
这个描述符描述的信息实例化得来,实际要传递给GPU的资源都包含在这个里面。