介绍

现在,我们已经可以传递顶点属性给顶点着色器,但对于一些所有顶点都共享的属性,比如顶点的变换矩阵,将它们作为顶点属性为每个顶点都传递一份显然是非常浪费的。

Vulkan提供了资源描述符来解决这一问题。描述符是用来在着色器中访问缓冲和图像数据的一种方式。我们可以将变换矩阵存储在一个缓冲中,然后通过描述符在着色器中访问它。使用描述符需要进行下面三部分的设置:

  • 在管线创建时指定描述符布局

  • 从描述符池分配描述符集

  • 在渲染时绑定描述符集

描述符布局用于指定可以被管线访问的资源类型,类似渲染流程指定可以被访问的附着类型。描述符集指定了要绑定到描述符上的缓冲和图像资源,类似帧缓冲指定绑定到渲染流程附着上的图像视图。最后,将描述符集绑定到绘制指令上,类似绑定顶点缓冲和帧缓冲到绘制指令上。

有多种类型的描述符,但在本章节,我们只使用uniform缓冲对象(UBO)。在之后的章节,我们会看到其它类型的描述符,它们的使用方式和uniform缓冲对象类似。现在,让我们先用结构体定义我们要在着色器中使用的uniform数据:

struct UniformBufferObject {
            glm::mat4 model;
            glm::mat4 view;
            glm::mat4 proj;
};

我们将要使用的uniform数据复制到一个VkBuffer中,然后通过一个uniform缓冲对象描述符在顶点着色器中访问它:

layout(binding = 0) uniform UniformBufferObject {
    mat4 model;
    mat4 view;
    mat4 proj;
} ubo;

void main() {
    gl_Position = ubo.proj * ubo.view * ubo.model *
    vec4(inPosition, 0.0, 1.0);
    fragColor = inColor;
}

接下来,我们在每一帧更新模型,视图,投影矩阵,来让上一章节渲染的矩形在三维空间中旋转。