教程 3: 第一个三角形 — 图形管道和绘制
在本教程中我们将最后在屏幕上绘制一些图形。 简单的三角形就是 Vulkan 生成一个比较好的的“图像”。
一般来说,图形管道和绘制操作要求 Vulkan 做许多准备工作(以在许多结构中填充复杂字段的形式)。 我们在很多方面都有可能犯错误,而且在 Vulkan 中,即使简单的错误也会造成应用无法按预期运行、显示空白屏幕,而且我们无法得知到达哪里出现了错误。 在这种情况下,验证层可为我们提供帮助。 但我不希望深入探讨 Vulkan API 的细节。 因此,我尽可能准备小型、简单的代码。
这样我们创建的应用就可以按照预期正常运行并显示简单的三角形,但它还使用不建议使用、不灵活,而且可能不高效(尽管正确)的机制。 我不想讨论不建议使用的情况,但它可显著简化教程,并支持我们仅专注于所需的最小 API 用法集。 只要遇到了“有争议的”功能,我都会指出来。 在下一教程中,我将介绍一些绘制三角形的推荐方法。
要绘制第一个简单的三角形,我们需创建渲染通道、帧缓冲器和图形管道。 当然也需要命令缓冲器,但我们已对其有所了解。 我们将创建简单的 GLSL 着色器,并将其编译成 Khronos 的 SPIR*-V 语言 — Vulkan(官方)理解着色器的(目前)唯一形式。
如果您的电脑屏幕没有显示任何内容,请尝试尽可能地简化代码,或者回到教程 2。 检查命令缓冲区是否按预期仅清空了图形行为,而且图形清空的颜色是否显示在屏幕上。 如果是,请通过本教程修改代码并添加一些部分。 如果不是 VK_SUCCESS,请检查每个返回值。 如果这些方法没有用,请等待本教程的验证层。
关于源代码示例
为方便本教程及其随后的教程,我更换了示例项目。 之前教程中介绍的 Vulkan 准备阶段放在单独文件(标头和源)的“VulkanCommon”类。 面向特定教程的类负责演示特定教程中介绍的主题、承袭“VulkanCommon”类并访问(所需)的 Vulkan,比如设备或交换链。 这样我们可以重新使用 Vulkan 创建代码,并准备仅专注于已演示主题的较小的类。 之前章节的代码能够正常运行,因此比较容易找出潜在错误。
我还为部分实用程序函数添加了独立的文件集。 此处我们将通过二进制文件读取 SPIR-V 着色器,因此我添加了一个函数,可检查二进制文件内容的加载。 它位于 Tools.cpp 和 Tools.h 文件。
创建渲染通道
为在屏幕上进行绘制,我们需要一个图形管道。 但现在创建这一管道需要其他结构的指示器,其中还可能需要另外其他结构的指示器。 因此我们从渲染通道开始。
什么是渲染通道? 常见图片可为我们提供一个用于许多常用渲染技巧(比如延迟着色)的“逻辑”渲染通道。 该技巧包含许多子通道。 第一个子通道使用填充 G-Buffer 的着色器绘制几何图形:将漫射颜色保存在一种纹理中,将标准矢量保存在另一纹理中、将亮度保存在另一纹理中,而将深度(位置)保存在另一纹理中。 接下来是各个光源,执行的绘制包括读取数据(标准矢量、亮度、深度/位置)、计算照明,并将其保存在另一纹理中。 最后一个通道整合照明数据和漫射颜色。 这只是有关延期着色的(粗略)解释,但它介绍了渲染通道 — 执行部分绘制操作所需的数据集:将数据保存在纹理中,并从其他纹理读取数据。
在 Vulkan 中,渲染通道代表…查看全文
了解更多相关内容,请关注CSDN英特尔开发专区!