Vulkan 渲染器

Vulkan 渲染器VulkanRender类的定义位于文件VulkanRenderer.h/.cpp当中。它负责管理一个唯一的展示窗口以及相关的应用程序资源,例如设备、交换链、流水线,等等。应用程序可以有多个渲染窗口,如图所示。每个渲染器都负责维护一个独立的展示窗口以及所有相关的资源。

Vulkan 渲染器

作为初学的阶段,我们的例子只能输出一个展示窗口。因此,VulkanApplication中只包含了一个VulkanRenderer类的对象。

如图所示给出了VulkanRenderer头文件(createPresentationWindow()),之后我们会使用交换链的颜色图来填充它。空白窗口的创建过程与系统平台密切相关,在我们的示例程序中,只实现了Windows的创建代码。

Vulkan 渲染器

此外,VulkanRenderer类还负责管理初始化(initialize())和展示窗口渲染(render())的过程。这个类也负责管理各种指令缓存所需的指令池:

Vulkan 渲染器

Vulkan 渲染器

1.创建展示窗口

下面我们会实现交换链颜色图展示到显示窗口所需的窗口系统代码。示例代码主要着重于Windows平台的实现,并且用到了CreateWindowEx()函数来创建一个交叠的弹出式窗口(或者子窗口),同时设置扩展窗口样式。

请参看在线的MSDN文档来了解相关API的更多信息(https://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v vs.85).aspx):

Vulkan 渲染器
对于Microsoft Windows系统的窗口,我们还需要一个窗口回调函数来处理所有的事件。这里我们只考虑WM_PAINT,WM_SIZE和WM_CLOSE事件的处理。WM_CLOSE事件在用户点击了窗口的关闭按钮时被触发。而WM_PAINT事件在渲染窗口时被触发。
Vulkan 渲染器

2.初始化渲染器

初始化过程会创建一个给定维度的展示窗口,并且执行交换链所需的各种前置操作。其中包括查询交换链的扩展API,创建表面对象,找到展示层对应的队列,获取可用于绘制的图像格式,等等。Renderer类的初始化过程是通过成员函数initialize()完成的,它的实现代码如下所示,请参看注释中的文字来了解每行代码的作用:

Vulkan 渲染器

3.创建指令池

VulkanRenderer类包括指令池的相关成员。指令池用于指令缓存的分配工作,也用作其他一些操作类型,例如深度图的创建,流水线状态的设置,绘制图元,等等。

在下文的代码中,我们将通过VkCommandPoolCreateInfo结构体来定义指令池创建所需的属性。这个结构体包括了指令缓存分配时对应的图形队列的索引号。Vulkan在这个结构体中通过这些参数来定义和提前优化底层的流水线。有关指令缓存和指令池的更多详细信息,参考酷客教程Vulkan 指令池和指令缓存API

Vulkan 渲染器

4.构建交换链和深度图

buildSwapChainAndDepthimage()函数是创建交换链和深度图的入口函数。接下来我们将详细讨论这些内部函数:

Vulkan 渲染器

5.渲染展示窗口

在显示器上绘制展示窗口并处理Windows消息。当用户点击了关闭按钮之后,我们将退出展示窗口并且中断无限循环的渲染过程:

Vulkan 渲染器

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!