Introduction

我们现在可以将任意属性传递给每个顶点的顶点着色器使用。但是全局变量呢?我们将会从本章开始介绍3D图形相关的内容,并需要一个模型视图投影矩阵。我们确实可以将它一顶点的方式包含,但是这非常浪费带宽、内存,并且需要我们在变换的时候更新顶点缓冲区的数据。这种变换通常发生在每一帧。

 

在Vulkan中正确处理此问题的途径是使用资源描述符。描述符是着色器资源访问诸如缓冲区和图像这样资源的一种方式。我们需要设置一个包含转换矩阵的缓冲区,并使顶点着色器通过描述符访问它们。描述符的使用由三部分组成:

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

  • 从描述符对象池中分配描述符集合

  • 在渲染阶段绑定描述符集合

描述符布局指定了管线访问的资源的类型,就像渲染通道指定附件的类型一样。描述符集合指定将绑定到描述符的实际缓冲区或映射资源。就像帧缓冲区为绑定渲染通道的附件而指定实际的图像视图一样。描述符集合就像顶点缓冲区和帧缓冲区一样被绑定到绘制命令。

 

有许多类型的描述符,但在本章中,我们将使用统一的缓冲区对象uniform buffer objects(UBO)。我们将会在后面的章节中讨论其他类型的描述符,但基本过程是一样的。假设我们有一个数据,我们希望顶点着色器拥有一个这样的C结构体:

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

网友评论