Vulkan入门系列9 - Uniform Buffer 资源描述符
一:概述
我们现在可以通过使用Vertex Buffer的形式,将顶点的任意属性传递到顶点着色器,但全局变量如何传递给着色器呢?从这一篇文章开始,我们将进入3D图形绘制阶段,这需要一个模型视图投影矩阵。我们可以将其作为顶点数据放到Vertex buffer中,但这会浪费内存,并且每当发生矩阵变换时,我们都需要更新顶点缓冲区。这些矩阵变换可能在每一帧中都会发生(如改变相机视角位置等)。
在Vulkan中解决这个问题的正确方法是使用资源描述符。描述符是一种让着色器自由访问像缓冲区和图像等资源的方式。我们将设置一个包含变换矩阵的缓冲区,并让顶点着色器通过描述符访问它们。描述符的使用包括三个部分:
1. 在管线创建期间指定描述符布局。
2. 从描述符池中分配描述符集。
3. 在渲染期间绑定描述符集。
描述符布局指定将被管线访问的资源类型,就像渲染通道(render pass)指定将被访问的附件(attchment)类型一样。描述符集合将实际要访问的缓冲区或图像资源绑定到该描述符上面,就像帧缓冲区将实际要访问的图像视图绑定到渲染通道附件上一样。然后,描述符集合被绑定用于绘制的命令上,就像绘制时绑定顶点缓冲区和帧缓冲区一样。
有许多类型的描述符,但在本章中我们将使用统一(Uniform)缓冲区对象(UBO)。我们将在未来的章节中查看其他类型的描述符,但基本过程是相同的。假设我们有一个 C 结构体,里面包含我们希望顶点着色器使用的数据:
struct UniformBufferObjec