Vulkan-Descriptor

Vulkan - Desciptor

1. sources in OpenGL

  • 与OpenGL不同,Vulkan的所有使用的资源都需要显示的定义,最后把资源放到合适的位置,调用渲染,最后显示出正确的图形。 在OpenGL中,有如下Shader代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
#version 450 core

in vec2 TexCoord;
uniform sample2D uTexture;

out vec4 FragColor;

void main()
{
vec4 tex = texture(uTexture, TexCoord);
FragColor = tex;
}

在CPU端我们需要手动建立一个绑定关系,让CPU的纹理资源绑定到具体的点位,以及让Shader知道应该去哪个点位招对应的数据。

1
2
3
4
5
6
7
glUseProgram(program);  /// 绑定shader

glUniform1i(glGetUniformLocation(program, "uTexture"), 0); // 采样器 uTexture → 单元0

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, uTexture); /// uTexture是我在CPU端创建好的纹理对象

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的资源都包含在这个里面。