20Vulkan———绘制对象

旧时模样 提交于 2020-08-09 01:54:36

1.绘制对象过程

包括记录和执行绘图对象的命令缓冲区。 记录将 Render Pass,framebuffer 和管线与视口和几何数据相关联。 命令缓冲区执行涉及在设备队列中提交命令缓冲区,并将绘制的交换链图像呈现在展示引擎上。

 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。
    • 绘制对象。

2.命令缓冲区执行绘图命令来渲染对象:

准备阶段中创建的命令缓冲区会被多次重用和执行,以便渲染绘图对象:

  • 获取(对它来说)可用于执行渲染的交换链图像 swapchain image。
  • 提交命令缓冲区 command buffer 到渲染对象 render the object。
  • 在展示引擎 presentation engine 上显示渲染的图形图像 rendered drawing image。

主命令缓冲区和辅助命令缓冲区

  主命令缓冲区没有任何父命令缓冲区。 而辅助命令缓冲区总是从主命令缓冲区执行,相当于它的父亲。 辅助命令缓冲区不直接被提交到设备队列中;这些会被记录到主命令缓冲区中并使用 vkCmdExecuteCommands()API 执行。

渲染绘图对象 drawing object

绘制一个对象包括三个步骤:

首先,我们需要获取下一个可用交换链图像的索引,图元将会在其上(交换链图像)进行绘制或者光栅化。

其次,我们需要将命令缓冲区提交给图形队列,以在 GPU 上执行记录的命令;GPU 会执行这些命令并使用这些绘图命令绘制可用的交换链绘图图像。 最后,绘制图像会被移交给展示引擎,它会把输出渲染到附加的显示窗口上。

Vulkan 中的同步原语

同步是将顺序和约束引入异步系统的关键。 它不仅提高了资源利用率,而且还通过减少 CPU 和 GPU 空闲时间从并行性中受益。

Vulkan 为并发执行提供以下四种类型的同步原语:

  • 栅栏:Fences,提供主机和设备之间的同步

当主机在队列中提交命令时,会对主机进行调度,以便进行设备的处理。 有时主机可能需要知道 GPU 上命令执行的状态,以便控制下一个批处理的执行,以此来确保它不会与前一批命令重叠,这可能会产生未定义的结果或导致资源访问非法的情况 。

栏栅提供主机和 GPU 之间的同步;使用栏栅,应用程序指示主机等待某个提交的操作完成。 这样,就可以防止 GPU 将更多操作堆积到命令队列中:

  • 信号量:Semaphores,在队列之间以及队列内部进行同步

信号量提供了在队列级别实现同步的灵活性;它们用于同步一个或多个队列。 信号量有两种状态:有信号和无信号。 有信号的信号量在队列提交命令 vkQueueSubmit()中指定;它会阻塞批处理的其余部分,直到设备获得信号量的信号。 创建的信号量在多个队列中可见。 如果两个或多个队列提交命令在同一信号量上等待,则只有一个会收到有信号状态;其他队列可能会继续等待,以便确保原子性。

  • 事件:Events,对队列提交操作之间提供同步

事件控制着细粒度的同步,并且可以以有信号和无信号两种状态存在。 它允许在单个命令缓冲区或提交给队列的多个命令缓冲区序列内进行同步操作。 主机和设备都可以发信号或重置事件。 同样,两者都可以等待事件对象;然而,设备只允许在管线内的某个特定管线阶段等待。

  • 障碍:Barriers,在一个命令缓冲区内的命令之间进行同步

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!