无秘 API:Vulkan 入门 第 0 部分:前言





5.00/5 (1投票)
这是一篇关于如何使用 Vulkan 编写应用程序的教程。我将分享我作为一名了解 OpenGL 并希望“迁移”到其后继者的人的想法和经验。
Intel® 开发者专区 提供跨平台应用程序开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发者创新并取得成功。加入我们的社区,了解 Android、物联网、Intel® RealSense™ 技术 和 Windows,下载工具,获取开发套件,与志同道合的开发者交流想法,并参与黑客松、竞赛、路演和本地活动。
关于作者
我是一名软件开发人员,已有九年多的工作经验。我的主要兴趣领域是图形编程,我的职业生涯大部分时间都致力于 3D 图形。我在 OpenGL* 和着色语言(主要是 GLSL 和 Cg)方面拥有丰富的经验,并且大约三年时间里,我还使用过 Unity* 软件。我还曾有机会参与一些涉及使用 Oculus Rift* 或类 CAVE 系统等头戴式显示器的 VR 项目。
最近,在 Intel 的团队中,我参与了为我们图形驱动程序对新兴 API Vulkan 的支持准备验证工具。这个图形编程接口及其所代表的方法对我来说是全新的。我产生了一个想法,即在学习它的同时,我可以同时准备一篇关于使用 Vulkan 编写应用程序的教程。我可以分享我作为一名了解 OpenGL 并希望“迁移”到其后继者的人的想法和经验。
关于 Vulkan
Vulkan 被视为 OpenGL 的后继者。它是一个多平台 API,允许开发者创建高性能图形应用程序,如游戏、CAD 工具、基准测试等。它可以在 Windows*、Linux* 或 Android* 等不同操作系统上使用。Khronos 联盟创建并维护 Vulkan。Vulkan 还与 OpenGL 有一些其他相似之处,包括图形管线阶段、GLSL 着色器(某种程度上)或命名约定。
但是,有很多差异证实了对新 API 的需求。OpenGL 已经发展了二十多年。自 20 世纪 90 年代初以来,计算机行业发生了许多变化,尤其是在图形卡架构方面。OpenGL 是一个很好的库,但并非所有事情都可以通过仅添加与新图形卡功能匹配的新功能来完成。有时需要进行大规模的重新设计。这就是 Vulkan 被创建的原因。
Vulkan 基于 Mantle*——一系列新的底层图形 API 中的第一个。Mantle 由 AMD 开发,仅针对 Radeon 卡的架构而设计。尽管它是第一个公开可用的 API,但使用 Mantle 的游戏和基准测试取得了令人瞩目的性能提升。随后出现了其他底层 API,例如微软的 DirectX* 12、苹果的 Metal*,以及现在的 Vulkan。
传统图形 API 与新的底层 API 有何区别?像 OpenGL 这样的高级 API 使用起来非常简单。开发者声明他们想要做什么以及如何去做,驱动程序会处理其余的事情。驱动程序会检查开发者是否以正确的方式使用 API 调用,是否传递了正确的参数,以及状态是否已充分准备好。如果出现问题,会提供反馈。为了方便使用,驱动程序必须在“幕后”完成许多任务。
在底层 API 中,开发者必须负责大部分事情。他们需要遵守严格的编程和使用规则,并且还必须编写更多的代码。但这种方法是合理的。开发者知道他们想要做什么以及想要实现什么。驱动程序不知道,所以使用传统 API 时,驱动程序必须付出额外的努力才能使程序正常工作。使用 Vulkan 等 API 可以避免这种额外的努力。这就是为什么 DirectX 12、Metal 或 Vulkan 被称为“瘦驱动程序/瘦 API”的原因。它们大多只将用户请求传达给硬件,只提供对硬件本身的薄层抽象。为了获得更高的性能,驱动程序尽量少做工作。
底层 API 需要在应用程序端进行额外的工作。但这项工作是无法避免的。总得有人或什么东西来完成它。因此,由开发者来完成这项工作是更合理的,因为他们知道如何将工作分成单独的线程,何时图像将成为渲染目标(颜色附件)或用作纹理/采样器等。开发者知道哪个管线状态或哪个顶点属性变化更频繁。所有这些都导致图形卡硬件的使用效率大大提高。最棒的是,它确实有效。可以观察到令人瞩目的性能提升。
但“可以”这个词很重要。它需要额外的努力,但也需要正确的方法。在某些情况下,OpenGL 和 Vulkan 之间的性能差异将不会被观察到。如果一个人不需要多线程,或者应用程序不以 CPU 为瓶颈(渲染场景不复杂),那么 OpenGL 就足够了,使用 Vulkan 不会带来任何性能提升(但它可能会降低功耗,这在移动设备上很重要)。但如果我们想从图形硬件中榨取最后一丝性能,Vulkan 是最佳选择。
迟早所有主要的图形引擎都将支持新的底层 API,即使不是全部。所以如果我们想使用 Vulkan 或其他 API,我们就无需从头开始编写所有内容。但了解“幕后”发生了什么总是有益的,这就是我准备本教程的原因。
关于源代码的说明
我是一名 Windows 开发人员。在有选择的情况下,我会为 Windows 编写应用程序。因为我对其他操作系统没有经验。但 Vulkan 是一个多平台 API,我希望展示它可以在不同的操作系统上使用。因此,我准备了一个可以在 Windows 和 Linux 上编译和执行的示例项目。
本教程的源代码可以在这里找到
https://github.com/GameTechDev/IntroductionToVulkan
我尽量使代码示例尽可能简单,并且不添加不必要的 `#ifdef`。有时这是不可避免的(例如窗口创建和管理),所以决定将代码分成几个小部分
- Tutorial 文件在这里最重要。它们包含了所有激动人心的 Vulkan 相关代码。每个教程都放在一个头文件/源文件对中。
- OperatingSystem 头文件和源文件包含代码中依赖于操作系统的部分,如窗口创建、消息处理和渲染循环。这些文件包含 Linux 和 Windows 的代码,但我尽量将它们统一起来。
- main.cpp 文件是每个教程的起点。因为它使用了我的自定义 Window 类,所以不包含任何特定于操作系统的代码。
- VulkanCommon 头文件/源文件包含了从第三个教程开始的所有教程的基础类。这个类基本上复制了教程 1 和 2——创建 Vulkan 实例和其他使渲染图像出现在屏幕上所必需的所有资源。我提取了这些准备代码,以便所有其他章节的代码可以只关注所介绍的主题。
- Tools 包含一些额外的实用函数和类,例如读取二进制文件内容的函数或自动销毁对象的包装器类。
每个章节的代码都放在一个单独的文件夹中。有时可能包含一个额外的 Data 目录,其中存放了给定章节所需的着色器或纹理等资源。这个 Data 文件夹应该被复制到与可执行文件相同的目录中。默认情况下,可执行文件会被编译到 build 文件夹中。
好的。编译和构建文件夹。由于示例项目应在 Windows 和 Linux 上轻松维护,我决定使用 *CMakeLists.txt* 文件和 CMake 工具。在 Windows 上,有一个 build.bat 文件可以创建一个 Visual Studio* 解决方案——默认情况下,在 Windows 上编译代码需要 Microsoft Visual Studio 2013。在 Linux 上,我提供了一个 build.sh 脚本,它使用 make 编译代码,但 CMakeLists.txt 也可以轻松地被 Qt 等工具打开。当然,CMake 也是必需的。
解决方案和项目文件会被生成,可执行文件会被编译到 build 文件夹中。这个文件夹也是默认的工作目录,因此 Data 文件夹应该被复制进去,教程才能正常工作。在执行过程中,如果出现任何问题,额外的消息会被“打印”在 cmd/终端中。所以如果有什么不对,请从命令行/终端运行教程,或者查看控制台/终端窗口,看看是否有任何消息显示。
希望这些说明能帮助您理解并跟进我的 Vulkan 教程。现在,让我们专注于学习 Vulkan 本身!
前往:无密级API:Vulkan* 入门教程 第1部分:开端
注意事项
本文档不授予任何知识产权的许可(明示或暗示,禁止反言或以其他方式)。
英特尔不对任何明示或暗示的保证承担责任,包括但不限于适销性、特定用途的适用性以及非侵权的默示保证,以及任何由履约过程、交易过程或商业惯例引起的保证。
本文档包含正在开发中的产品、服务和/或流程的信息。此处提供的所有信息如有更改,恕不另行通知。请联系您的英特尔代表以获取最新的预测、时间表、规格和路线图。
所描述的产品和服务可能包含称为勘误的缺陷或错误,这可能导致与公布的规格不符。当前的已特性化勘误可应要求提供。
可通过致电 1-800- 548-4725 或访问 www.intel.com/design/literature.htm 获取带有订购号并在此文件中引用的文档副本。
此示例源代码根据 英特尔示例源代码许可协议 发布。
Intel 和 Intel 标志是 Intel Corporation 在美国和/或其他国家/地区的商标。
*其他名称和品牌可能被声明为他人的财产。
© 2016 英特尔公司。