介绍
现在,我们已经可以传递顶点属性给顶点着色器,但对于一些所有顶点都共享的属性,比如顶点的变换矩阵,将它们作为顶点属性为每个顶点都传递一份显然是非常浪费的。
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;
}
接下来,我们在每一帧更新模型,视图,投影矩阵,来让上一章节渲染的矩形在三维空间中旋转。