Vulkan实战
  • 推荐0
  • 收藏0
  • 浏览178

Vulkan实战

Pawel Lapinski (作者)  苏宝龙 (译者)

  • 书  号:978-7-121-42493-9
  • 出版日期:2022-01-11
  • 页  数:620
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 原书名: Vulkan Cookbook
  • 原书号:9781786468154
  • 维护人:张春雨
纸质版 ¥199.00
3D 图形加速功能是 3D 应用程序的绝对关键点。实践证明只有低层级的操作方式才能发挥出图形硬件的全部潜能。接替 OpenGL 的 Vulkan 正是这种低层级 API。它可以给予开发者更多的硬件控制权,并使 3D 应用程序获得更高的运行速度。本书详细介绍了 Vulkan 的各种知识。
本书由 12 章构成,其中包括:Vulkan API 的基础知识、Vulkan 图像显示、命令缓冲区和同步化、资源和内存、描述符集合、渲染通道和帧缓冲区、着色器、图形和计算管线、记录命令和绘制操作、拾遗补缺、照明、高级渲染技术。
作者简介
Pawel Lapinski 是一位图形软件工程师,就职于 Intel 公司。十多年前,Pawel Lapinski 和他的朋友们使用 C++、OpenGL 和 Cg 开发了一款 3D 培训/模拟应用程序,这款软件使用了头盔式显示器和立体成像等高端技术,至此开启了他的职业生涯。当开始研究工作后,Pawel Lapinski 就专注于 3D 图形技术,尤其对开放式的跨平台 OpenGL 库感兴趣。他撰写了一部论述高效使用顶点和片段着色器的教程。至此之后,他就不断谋求与 3D 图形有关的工作机会,并扩展他在这一领域的知识。Pawel Lapinski 有幸加入了一个优秀的开发小组,这个小组当时正在波兰格但斯克科技大学开发一个当时最大的类 CAVE 系统。Pawel Lapinski 负责使用 Unity3D 引擎实现 3D 可视化功能,以及通过立体成像支持运动跟踪功能。
Pawel Lapinski 的整个职业生涯都在研究计算机图形技术、OpenGL 库和着色器。然而,在成为 Intel 公司的一名程序员后,他负责对 Vulkan 图形驱动程序进行确认测试,因而获得了研究 Vulkan 的机会。Pawel Lapinski 编写了一系列介绍如何使用 Vulkan 的教程,通过本书与读者分享他掌握的 Vulkan 知识。

译者简介
苏宝龙,1999年毕业于辽宁石化大学计算机系,从事过计算机硬件维修、网络和网站架设等计算机专业实践工作。投身计算机图书翻译行业已有二十余年,译著三十余部,包括《响应式架构:消息模式Actor实现与Scala、Akka应用集成》《Scala 并发编程》《PHP 7 编程实战》等书。
计算机图形技术有较长和有趣的发展史,许多用于生成 2D 或 3D 图像的 API 和自定义图形处理方式不断涌现。在计算机图形技术的发展史中,OpenGL 是一个里程碑,是最早出现的一批图形库之一。OpenGL 不仅可以用于实时创建高性能 3D 图形,而且任何人都可以在多种操作系统上使用它。现在 OpenGL 仍旧在发展中,而且被广泛使用。
自从 OpenGL 被开发出来,图形硬件发展非常迅速。最近,为了适应这种高速发展,一种新的 3D 图形渲染技术处理方式出现了,这种处理方式通过低层级方式访问图形硬件。
OpenGL 被设计成一种高层级 API,使用它可以轻松地在屏幕上渲染图像。虽然这种高层级的处理方式为用户提供了方便,但图形驱动程序的处理工作变得困难,这是制约硬件发挥其全部潜能的主要原因之一。新的处理方式尝试战胜这些困难——它给予用户更多的硬件控制权,但同时需要用户承担更多责任。因为这种处理方式能够消除驱动程序的阻碍,应用程序开发者可以使图形硬件发挥全部潜能。低层级的访问操作使驱动程序能够变得更为小巧,但获得这些益处的代价是开发者必须做更多的工作。
这种新的图形渲染技术是由 AMD 公司在设计 Mantle API 时提出的。当 Mantle API 证明低层级访问方式可以大幅度提高性能后,其他图形硬件公司纷纷开始开发自己的图形库。
这些图形库中两个最突出的代表是苹果公司的 Metal API 和微软公司的 DirectX 12。
上面提到的这些图形库都是专门为指定的操作系统和/或硬件开发的,它们不具备像OpenGL 那样的开源和跨平台特性。2016 年 Vulkan 横空出世,它是由 Khronos Group 行业协会开发的,该协会也开发并维护了 OpenGL。Vulkan 代表了一种新的图形处理方式——通过低层级操作访问图形硬件,但是与其他图形库不同,任何人都可以在多种操作系统和硬件平台上使用 Vulkan——从安装了 Windows 或 Linux 操作系统的高性能台式机,到使用Android 操作系统的移动设备。因为 Vulkan 还是一个非常新的图形 API,所以指导开发者如何使用 Vulkan 的教程还比较少。本书旨在填补这个空白。
本书主要内容
第 1 章介绍 Vulkan 的基础知识。本章介绍了下载 Vulkan 的 SDK、连接 Vulkan Loader 库的方式、怎样选择用于执行操作的物理设备,以及创建逻辑设备的方式。
第 2 章介绍 Vulkan 图像显示。本章介绍了交换链的定义和用于创建交换链的参数。掌握这些知识后,我们就可以使用交换链执行渲染操作并在屏幕上查看工作成果。
第 3 章介绍命令缓冲区和同步化。本章介绍了如何将命令记录到命令缓冲区并提交到队列中,以便命令被硬件执行。本章还介绍了各种同步机制。
第 4 章介绍资源和内存两种基础且最为重要的资源——图像和缓冲区,使用它们可以存储数据。本章介绍了创建图像和缓冲区的方式、为图像和缓冲区准备内存空间的方式,以及通过我们编写的应用程序(CPU)将数据加载到图像和缓冲区中的方式。
第 5 章介绍如何将创建好的资源提供给着色器。本章介绍了如何创建在着色器内部使用的资源,以及如何设置描述符集合——应用程序和着色器之间的接口。
第 6 章介绍将一组绘制操作组织到一个集合中的方式,该集合称为子通道。多个子通道构成了渲染通道。本章介绍了如何创建附着材料(渲染操作的目标,会在执行绘制操作的过程中被使用),以及如何创建帧缓冲区。帧缓冲区会根据附着材料描述,与指定的资源绑定到一起。
第 7 章介绍所有可用图形和计算着色器阶段的编程规范。本章介绍了如何使用 GLSL 编程语言编写着色器程序,还介绍了如何将这些着色器程序转换为 SPIR‑V 程序——Vulkan 核心唯一接收的形式。
第 8 章介绍创建图形和计算管线的过程。这两个管线用于设置绘制命令和计算操作的参数,以便图形硬件能够正确地处理这些命令和操作。
第 9 章介绍如何将用于绘制 3D 模型的所有操作记录下来,以及分配计算工作。本章介绍了各种优化技巧,使用这些技巧可以提高应用程序的性能。
第 10 章介绍 3D 渲染应用程序必然会用到的一组便捷工具。本章介绍了如何从文件中加载纹理数据和 3D 模型,还介绍了如何在着色器内部处理几何图形。
第 11 章介绍常用的照明技巧,从简单的漫反射和镜面反射照明计算,到法线贴图和阴影贴图技巧。
第 12 章介绍高级渲染技术,该技术广泛应用于许多流行的应用程序,如游戏和基准测试程序。
阅读本书前需要了解的注意事项
Vulkan 是开源的和跨平台的,本书介绍关于它的各方面知识。Vulkan 可以在 Microsoft Windows 7(以及更新的版本)和 Linux (Ubuntu 16.04 或更新的版本)操作系统中使用。
Android 7.0 以上的版本和 Android Nougat 也支持 Vulkan,但是本书中的示例代码不是专门为 Android 操作系统设计的。
如果想要为 Windows 7+和 Linux 之外的操作系统开发自己的应用程序或在这二者之外的操作系统上运行本书的示例程序,那么图形硬件和驱动程序都必须支持 Vulkan。要了解详细信息,应查询 3D 图形硬件厂商的网址和/或客服,以便查明图形硬件是否能够运行使用 Vulkan 的软件。
在使用 Windows 操作系统时,可使用免费软件 Visual Studio Community 2015 IDE(或更新的版本)编译本书的示例代码,还应将 CMAKE 3.0 或更新的版本与 Visual Studio Community 2015 IDE 一起使用,以便获得高效的软件编译解决方案。
在使用 Linux 操作系统时,可以组合使用 CMAKE 3.0 和 make 工具进行编译工作,也可以使用其他编译工具(如 QtCreator)编译本书的示例代码。
本书面向的读者
了解 C/C++语言、掌握图形编程基础知识,以及想要了解 Vulkan 优势的开发者,最适合阅读本书。掌握 Vulkan 基础知识的读者,可以更轻松地完成本书中的实验。希望了解Vulkan 优势的 OpenGL 开发者也能更深刻地体会到本书的价值。
本书中的标题
本书中出现了多个重复的标题(准备工作、具体处理过程、具体运行情况、补充说明和参考内容)。
下面说明这些标题的具体含义。
 准备工作:这个标题下方介绍实验的主要目的,还会介绍该实验需要设置哪些软件和初始设置。
 具体处理过程:这个标题下方介绍实验步骤。
 具体运行情况:这个标题下方详细介绍实验步骤的执行情况。
 补充说明:这个标题下方介绍更多关于这个实验的信息,以便读者能够获得更多的知识。
 参考内容:这个标题下方提供一些有价值的参考信息。

目录

第 1 章 Vulkan 的基础知识 ............................................................................................. 1
本章主要内容 ................................................................................................................. 2
下载 Vulkan 的 SDK ....................................................................................................... 2
启用验证层 ..................................................................................................................... 4
连接 Vulkan Loader 库 ................................................................................................... 7
加载 Vulkan 函数的准备工作 ........................................................................................ 9
加载从 Vulkan Loader 库导出的函数 .......................................................................... 13
加载全局级函数 ........................................................................................................... 15
检查可用的实例扩展 ................................................................................................... 18
创建 Vulkan 实例 .......................................................................................................... 20
加载实例级函数 ........................................................................................................... 23
确认哪些物理设备可用 ............................................................................................... 28
检查可用的设备扩展 ................................................................................................... 30
获取物理设备的功能和属性信息 ............................................................................... 32
检查可用队列家族和它们的属性 ............................................................................... 34
根据功能选择队列家族的索引 ................................................................................... 37
创建逻辑设备 ............................................................................................................... 39
加载设备级函数 ........................................................................................................... 45
获取设备队列 ............................................................................................................... 49
使用几何着色器、图形和计算队列创建逻辑设备 .................................................... 51
销毁逻辑设备 ............................................................................................................... 55
销毁 Vulkan 实例 .......................................................................................................... 56
释放 Vulkan Loader 库 ................................................................................................. 56
第 2 章 Vulkan 图像显示 ............................................................................................... 58
本章主要内容 ............................................................................................................... 59
通过已启用的 WSI 扩展创建 Vulkan 实例 ................................................................. 59
创建显示曲面 ............................................................................................................... 62
选择支持显示指定曲面功能的队列家族.................................................................... 67
通过已启用的 WSI 扩展创建逻辑设备 ...................................................................... 69
选择显示模式 ............................................................................................................... 71
获取显示曲面的功能 ................................................................................................... 76
选择交换链图像 ........................................................................................................... 78
选择交换链图像的尺寸 ............................................................................................... 80
选择使用交换链图像的场景 ....................................................................................... 81
选择转换交换链图像的方式 ....................................................................................... 83
选择交换链图像的格式 ............................................................................................... 84
创建交换链 ................................................................................................................... 88
获取交换链图像的句柄 ............................................................................................... 92
通过 R8G8B8A8 格式和邮箱显示模式(mailbox present mode)创建交换链 ....... 94
获取交换链图像 ........................................................................................................... 98
显示图像 ..................................................................................................................... 101
销毁交换链 ................................................................................................................. 104
销毁显示曲面 ............................................................................................................. 105
第 3 章 命令缓冲区和同步化 ....................................................................................... 107
本章主要内容 ............................................................................................................. 108
创建命令池 ................................................................................................................. 108
分配命令缓冲区 ......................................................................................................... 110
启动命令缓冲区记录操作 ......................................................................................... 113
停止命令缓冲区记录操作 ......................................................................................... 116
重置命令缓冲区 ......................................................................................................... 117
重置命令池 ................................................................................................................. 118
创建信号 ..................................................................................................................... 120
创建栅栏 ..................................................................................................................... 122
等待栅栏 ..................................................................................................................... 124
重置栅栏 ..................................................................................................................... 126
将命令缓冲区提交给队列 ......................................................................................... 127
使两个命令缓冲区同步 ............................................................................................. 131
查明已提交命令缓冲区的处理过程是否已经结束 .................................................. 133
在提交给队列的所有命令都被处理完之前等待 ...................................................... 135
等待已提交的所有命令都被处理完 ......................................................................... 136
销毁栅栏 ..................................................................................................................... 137
销毁信号 ..................................................................................................................... 138
释放命令缓冲区 ......................................................................................................... 139
销毁命令池 ................................................................................................................. 141
第 4 章 资源和内存 ..................................................................................................... 143
本章主要内容 ............................................................................................................. 144
创建缓冲区 ................................................................................................................. 144
为缓冲区分配内存对象并将它们绑定到一起 .......................................................... 147
设置缓冲区内存屏障 ................................................................................................. 152
创建缓冲区视图 ......................................................................................................... 157
创建图像 ..................................................................................................................... 159
将内存对象分配给图像并将它们绑定到一起 .......................................................... 164
设置图像内存屏障 ..................................................................................................... 168
创建图像视图 ............................................................................................................. 174
创建 2D 图像和视图 .................................................................................................. 177
通过 CUBEMAP 视图创建分层的 2D 图像 ............................................................. 179
映射、更新主机可见内存及移除主机可见内存的映射关系 .................................. 181
在缓冲区之间复制数据 ............................................................................................. 185
将数据从缓冲区复制到图像 ..................................................................................... 186
将数据从图像复制到缓冲区 ..................................................................................... 190
使用暂存缓冲区更新与设备本地内存绑定的缓冲区 .............................................. 193
使用暂存缓冲区更新与设备本地内存绑定的图像 .................................................. 198
销毁图像视图 ............................................................................................................. 203
销毁图像 ..................................................................................................................... 204
销毁缓冲区视图 ......................................................................................................... 204
释放内存对象 ............................................................................................................. 205
销毁缓冲区 ................................................................................................................. 206
具体处理过程 ............................................................................................................. 207
第 5 章 描述符集合 ..................................................................................................... 208
本章主要内容 ............................................................................................................. 209
创建采样器 ................................................................................................................. 209
创建已采样的图像 ..................................................................................................... 212
创建合并的图像采样器 ............................................................................................. 216
创建仓库图像 ............................................................................................................. 218
创建统一纹素缓冲区 ................................................................................................. 221
创建仓库纹素缓冲区 ................................................................................................. 225
创建统一缓冲区 ......................................................................................................... 229
创建仓库缓冲区 ......................................................................................................... 231
创建输入附着材料 ..................................................................................................... 233
创建描述符集合布局 ................................................................................................. 238
创建描述符池 ............................................................................................................. 240
分配描述符集合 ......................................................................................................... 242
更新描述符集合 ......................................................................................................... 245
绑定描述符集合 ......................................................................................................... 251
通过纹素和统一缓冲区创建描述符 ......................................................................... 253
释放描述符集合 ......................................................................................................... 258
重置描述符池 ............................................................................................................. 259
销毁描述符池 ............................................................................................................. 261
销毁描述符集合布局 ................................................................................................. 262
销毁采样器 ................................................................................................................. 262
第 6 章 渲染通道和帧缓冲区 ....................................................................................... 264
本章主要内容 ............................................................................................................. 264
设置附着材料描述 ..................................................................................................... 265
设置子通道描述 ......................................................................................................... 268
设置子通道之间的依赖关系 ..................................................................................... 272
创建渲染通道 ............................................................................................................. 274
创建帧缓冲区 ............................................................................................................. 277
为几何渲染和后处理子通道准备渲染通道 .............................................................. 280
通过颜色和深度附着材料准备渲染通道和帧缓冲区 .............................................. 287
启动渲染通道 ............................................................................................................. 293
进入下一个子通道 ..................................................................................................... 295
停止渲染通道 ............................................................................................................. 296
销毁帧缓冲区 ............................................................................................................. 297
销毁渲染通道 ............................................................................................................. 298
第 7 章 着色器 ............................................................................................................ 299
本章主要内容 ............................................................................................................. 299
将 GLSL 着色器转换为 SPIR-V 程序 ....................................................................... 300
编写顶点着色器 ......................................................................................................... 302
编写细分曲面控制着色器 ......................................................................................... 304
编写细分曲面评估着色器 ......................................................................................... 307
编写几何着色器 ......................................................................................................... 310
编写片段着色器 ......................................................................................................... 314
编写计算着色器 ......................................................................................................... 316
编写通过将顶点位置乘以投影矩阵获得新顶点位置的顶点着色器 ...................... 319
在着色器中使用入栈常量 ......................................................................................... 321
编写纹理化的顶点和片段着色器 ............................................................................. 323
通过几何着色器显示多边形的法线 ......................................................................... 326
第 8 章 图形和计算管线 .............................................................................................. 332
本章主要内容 ............................................................................................................. 333
创建着色器模块 ......................................................................................................... 334
设置管线着色器阶段 ................................................................................................. 336
设置管线顶点绑定关系描述、属性描述和输入状态 .............................................. 339
设置管线输入组合状态 ............................................................................................. 342
设置管线细分曲面状态 ............................................................................................. 345
设置管线视口和剪断测试状态 ................................................................................. 346
设置管线光栅化状态 ................................................................................................. 350
设置管线多重采样状态 ............................................................................................. 353
设置管线深度和刻板状态 ......................................................................................... 355
设置管线混合状态 ..................................................................................................... 358
设置管线动态状态 ..................................................................................................... 363
创建管线布局 ............................................................................................................. 366
设置图形管线创建参数 ............................................................................................. 370
创建管线缓存对象 ..................................................................................................... 375
通过管线缓存获取数据 ............................................................................................. 377
合并多个管线缓存对象 ............................................................................................. 379
创建图形管线 ............................................................................................................. 381
创建计算管线 ............................................................................................................. 384
绑定管线对象 ............................................................................................................. 387
通过合并的图像采样器、缓冲区和入栈常量范围,创建管线布局 ...................... 388
创建含有顶点和片段着色器,并启用了深度测试及动态视口和剪断测试功能的图
形管线 ................................................................................................................................. 391
在多个线程中创建多个图形管线 ............................................................................. 397
销毁管线 ..................................................................................................................... 401
销毁管线缓存对象 ..................................................................................................... 402
销毁管线布局 ............................................................................................................. 403
销毁着色器模块 ......................................................................................................... 404
第 9 章 记录命令和绘制操作 ....................................................................................... 406
本章主要内容 ............................................................................................................. 407
清除颜色图像 ............................................................................................................. 407
清除深度—刻板图像 ................................................................................................. 409
清除渲染通道附着材料 ............................................................................................. 411
绑定顶点缓冲区 ......................................................................................................... 412
绑定索引缓冲区 ......................................................................................................... 415
通过入栈常量为着色器提供数据 ............................................................................. 416
通过动态方式设置视口状态 ..................................................................................... 418
通过动态方式设置剪断状态 ..................................................................................... 420
通过动态方式设置线条宽度状态 ............................................................................. 421
通过动态方式设置深度偏移状态 ............................................................................. 422
通过动态方式设置混合常量状态 ............................................................................. 423
绘制几何图形 ............................................................................................................. 425
绘制带索引的几何图形 ............................................................................................. 427
分配计算工作 ............................................................................................................. 429
在主要命令缓冲区的内部执行次要命令缓冲区 ...................................................... 431
在命令缓冲区中记录通过动态视口和剪断状态绘制几何图形的命令 .................. 432
通过多个线程向命令缓冲区中记录命令.................................................................. 441
创建动画中的单个帧 ................................................................................................. 445
通过增加已渲染帧的数量提高性能 ......................................................................... 450
第 10 章 拾遗补缺 ...................................................................................................... 456
本章主要内容 ............................................................................................................. 456
创建转移矩阵 ............................................................................................................. 457
创建旋转矩阵 ............................................................................................................. 459
创建缩放矩阵 ............................................................................................................. 462
创建透视投影矩阵 ..................................................................................................... 464
创建正交投影矩阵 ..................................................................................................... 468
从文件加载纹理数据 ................................................................................................. 470
从 OBJ 文件加载 3D 模型 ......................................................................................... 473
第 11 章 照明 .............................................................................................................. 479
本章主要内容 ............................................................................................................. 479
通过顶点漫射照明渲染几何图形 ............................................................................. 480
通过片段镜面反射照明渲染几何图形 ..................................................................... 496
通过法线贴图渲染几何图形 ..................................................................................... 502
使用立方体贴图绘制反射和折射几何图形 .............................................................. 513
向场景中添加阴影 ..................................................................................................... 524
第 12 章 高级渲染技术 ............................................................................................... 540
本章主要内容 ............................................................................................................. 540
绘制天空盒 ................................................................................................................. 541
使用几何着色器绘制广告牌 ..................................................................................... 549
使用计算和图形管线绘制微粒 ................................................................................. 556
渲染细化的地形 ......................................................................................................... 568
为进行后处理渲染四画面全屏效果 ......................................................................... 583
对颜色纠偏后处理效果使用输入附着材料 .............................................................. 591

读者评论

下载资源