关注专栏 写文章
第 9 章. Drawing Objects 绘制对象

第 9 章. Drawing Objects 绘制对象

4 人 赞同了该文章

第 9 章. Drawing Objects 绘制对象

在上两章中,我们实现了渲染通道实例并显示了具有指定背景色的交换链图像。 在前一章中,我们将各种管线状态与 Render Pass 一起放入图形管线中。 在本章中,我们将把所有以前的实现结合在一起来构建 Vulkan 中的第一个 Hello World!程序并在显示输出中显示我们的第一个渲染对象。

本章全面介绍了在 Vulkan 中绘制对象的过程;包括记录和执行绘图对象的命令缓冲区。 记录将 Render Pass,framebuffer 和管线与视口和几何数据相关联。 命令缓冲区执行涉及在设备队列中提交命令缓冲区,并将绘制的交换链图像呈现在展示引擎上。 在本章的最后,我们将讨论 Vulkan API 中可用的各种同步原语。

在本章中,我们将介绍以下主题:

  • Vulkan 中绘图过程概述
  • 准备绘图对象
  • 渲染绘图对象
  • 渲染索引化的几何图形
  • 了解 Vulkan 中的同步原语
  • 调整显示窗口的大小

Vulkan 中绘图过程概述

在 Vulkan 中实现绘图对象很简单;它由两个阶段组成:准备或构建绘图对象并对其进行渲染。 前一阶段产生命令缓冲区并记录绘图命令。 在后一阶段,命令缓冲区会执行这些绘图命令来渲染对象。 我们来仔细看看这些阶段:

  1. 准备绘图对象:此阶段生成绘制对象所需的命令缓冲区:
  • 命令缓冲区创建:Command buffer creation,对于每个交换链彩色图像,需要创建一个相应的命令缓冲区对象。 例如,如果交换链是双缓冲区,那么它将包含两个彩色图像。 因此,我们应该创建两个命令缓冲区对应于每个图像。
  • 命令缓冲区记录:Command buffer recording,对于创建的命令缓冲区,一次记录 Render Pass 实例命令的一个子通道,请参阅以下步骤:
    • 将创建的 Render Pass 对象和 framebuffer 与展示渲染区域所需的尺寸关联。
    • 指定清除背景色和深度图的标量值。 我们在第 7 章“缓冲区资源”,“渲染通道”,“帧缓冲区”和“使用 SPIR-V 的着色器”中实现了此步骤。 有关更多信息,请参阅“清除背景色”部分。
    • 绑定图形管线对象 graphics pipeline object。
    • 绑定管线使用的资源,包括顶点缓冲区 vertex buffers 和描述符集 descriptor sets。
    • 定义视口 viewport 和剪裁区域 scissoring region。
    • 绘制对象。
  1. 渲染绘图对象:Rendering the drawing object,在这里,准备阶段中创建的命令缓冲区会被多次重用和执行,以便渲染绘图对象:
  • 获取(对它来说)可用于执行渲染的交换链图像 swapchain image。
  • 提交命令缓冲区 command buffer 到渲染对象 render the object。
  • 在展示引擎 presentation engine 上显示渲染的图形图像 rendered drawing image。

可绘制对象的准备和渲染是通过 VulkanDrawable 类的 prepare()和 render()函数实现的。

头文件声明

在本节中,我们先来看看 VulkanDrawable 的头文件声明。 请按照内联注释了解每个函数和变量的功能和用途。 在我们继续阅读本章时,我们会实现这些函数并对其详细讨论。 以下是新增的成员变量和函数:

class VulkanDrawable
{
public:
// Prepares the drawing object before rendering,