关注专栏 写文章
第 10 章. 描述符 Descriptors 以及 Push 常量 Constant

第 10 章. 描述符 Descriptors 以及 Push 常量 Constant

2 人 赞同了该文章

第 10 章. 描述符 Descriptors 以及 Push 常量 Constant

在前一章中,我们在显示输出中渲染了第一个绘图对象。 在本章中,我们将采用先前的实现,并在 Uniforms 的帮助下对渲染的几何图形执行一些 3D 转换。 Uniform 是着色器中可访问的只读数据块,它们的值对于整个绘制调用而言是恒定不变的。

Uniform 由描述符和描述符池进行管理。 描述符有助于将资源与着色器连接起来。 但它可能会经常变化;因此,分配是通过预先分配的描述符缓冲区(称为描述符池 descriptor pool)来执行的。

在本章中,我们还将实现一个 push 常量。 push 常量允许您使用优化的高速路径更新着色器中的常量数据。

我们将涵盖以下主题:

  • 理解描述符 descriptors 的概念
  • 如何在 Vulkan 中实现 Uniforms
  • pushPush 常量 constant 更新

理解描述符 descriptors 的概念

描述符由描述符集 descriptor set 对象组成。 这些对象包含了一组描述符的存储。 描述符集会把给定的资源(例如 uniform 缓冲区,采样的图像,存储的图像等)连接到着色器,帮助它通过布局绑定(使用描述符集布局定义的)来读取和解释传入的资源数据。 例如,使用描述符将资源(如图像纹理,采样器和缓冲区)绑定到着色器。

描述符是不透明的对象,并定义了与着色器进行通信的协议;在幕后,它提供了一种静默的机制,借助位置绑定将资源内存与着色器相关联。

VulkanDescriptor - 用户定义的描述符类

在本章中,我们将介绍一个名为 VulkanDescriptor 的新用户类,并在此处保留与描述符相关的成员变量和函数。 这将有助于把描述符的代码与实现的其余部分隔离,从而提供了一种更简洁、更容易理解描述符功能的方法。

以下是 VulkanDescriptor.h /.cpp 中 VulkanDescriptor 类的头文件声明。 在我们继续讨论各个部分之前,我们会详细讨论这个类中声明的函数和变量的目的和实现。 请参阅内嵌注释以便快速掌握:

// A user define descriptor class implementing Vulkan descriptors
class VulkanDescriptor
{
public:
VulkanDescriptor(); // Constructor
~VulkanDescriptor();  // Destructor
// Creates descriptor pool and allocate descriptor set from it
void createDescriptor(bool useTexture);
// Deletes the created descriptor set object
void destroyDescriptor();