书籍作者:帕敏德·辛格 | ISBN:9787111647867 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:4530 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
Vulkan是新一代的图形和计算API,是Khronos推出的产品。该API继承自OpenGL,为开发者提供了极大的灵活性与高性能。
本书将首先介绍Vulkan系统的基本原理,尝试与硬件设备进行连接并查询可用的队列、内存类型,以及提供的功能。Vulkan很冗长,所以在深入编程之前,开发者需要首先理解相关的调试技巧,这样即使是新手也可以使用Vulkan的层和扩展特性来排除一些常见错误。
通过阅读本书,你将学到:
●学习Vulkan编程模型的基本知识,理解现代GPU设备的基本功能。
●实现设备、指令缓存,以及队列的功能,与物理硬件设备进行连接。
●了解Vulkan中的验证层概念,学习调试方法与技巧。
●深入理解内存管理的知识,控制宿主机和设备端的内存操作。
●理解和实现缓存与图像资源的类型。使用线性和优化类型的纹理。
●定义渲染通道中的绘制操作,实现完整的图形流水线。
●通过SPIR-V管理GLSL着色器,使用描述符集和推送常数来更新着色器资源。
●学习绘制的过程、同步资源,并通过交换链将3D场景渲染到屏幕上。
帕敏德·辛格(Parminder Singh)
新加坡Blackmagic Design公司的计算机图形学工程师。在过去的十年里,他一直致力于网络模拟、几何建模、导航、自动驾驶、信息娱乐系统、图像处理及后期制作等领域的图形学软件开发。他的研究主要包括泛图形的GPU编程、通用计算,平台移植以及性能优化技术。
本书将帮助你从零开始学习Vulkan。
Vulkan是新一代的跨平台图形和计算API接口。尽管它是以OpenGL API的继承者的身份出现的,但是它实际上是一套经过了底层全部重新设计的API,可以满足使用者的更多竞争性需求,并且与底层GPU硬件之间的联系更为紧密。
本书将手把手地帮助初学者逐步掌握这些内容,通过简单易懂的例子来完成每个章节的学习。本书的各个章节之间是循序渐进的,新的一章总是构建于前一章的内容之上,这样读者可以更好地理解各个功能模块之间的细节差异。
本书实战性很强,目的就是帮助读者学习Vulkan的思想、概念以及API标准,并且通过随书的案例来进行实践。本书中涉及大量的参考文献,读者可以从中了解到更多的相关概念,在学习和实践过程中巩固自己的基础知识。
【前言】
本书将帮助你从零开始学习Vulkan。Vulkan是新一代的跨平台图形和计算API接口。尽管它是以OpenGL API的继承者的身份出现的,但是它实际上是一套经过了底层全部重新设计的API,可以满足使用者的更多竞争性需求,并且与底层GPU硬件之间的联系更为紧密。Vulkan是一套可以对GPU硬件设置进行控制的软件接口,并且充分使用了硬件并行计算的能力。Vulkan的设备驱动层非常轻量化,它把更多的权力交到了应用软件开发者的手里,从而实现应用程序和资源的管理、内存的管理、同步等功能,这一显式特性使Vulkan显得有些烦琐。本书将手把手地帮助初学者逐步掌握这些内容,通过简单易懂的例子来完成每个章节的学习。本书的各个章节之间是循序渐进的,新的一章总是构建于前一章的内容之上,这样读者可以更好地理解各个功能模块之间的细节差异。
Vulkan API的学习显然需要读者对计算机图形学和通用计算方面有一定的理解,然后才可以开始进行程序的开发。本书中会直接用到很多通用的概念和术语。
本书实战性很强,目的就是帮助读者学习Vulkan的思想、概念以及API标准,并且通过随书的案例来进行实践。本书中涉及大量的参考文献,读者可以从中了解到更多的相关概念,在学习和实践过程中巩固自己的基础知识。
【本书内容】
●第1章将介绍Vulkan API的一些基础知识,并且通过与它的前身OpenGL API进行比较的方式,对Vulkan的一些核心特性进行概述。该章会涵盖Vulkan编程过程中必须了解的基础、概念、应用程序模型以及技术术语,这些对于初次接触Vulkan的学习者来说至关重要。你可以快速地概览Vulkan的编程模型,了解每一个模块的主要作用和学习要点。
●第2章将帮助你用伪代码的方法编写一个简单的Hello World程序。初学者可以感受Vulkan编程的基本方法,并且逐步地学会构建第一个Vulkan应用程序。你还可以从该章中了解安装必需软件以及SDK的方法。
●第3章将带你设置开发环境来构建你的第一个Vulkan案例。你可以创建一个Vulkan实例并初始化程序;还可以连接物理硬件设备,探索该设备所提供的不同队列,查询各个可用的层和扩展。该章会详细地讲解设备队列和队列族的概念,以及它与逻辑设备的关系。
●第4章将介绍Vulkan应用程序中进行调试的方法。Vulkan允许我们通过验证层来进行调试。该章我们会讨论每种验证层的功能并编写一个简单的例子来实际理解调试的过程。此外,我们还会查询层的扩展属性,以便增加更多的功能。这些功能可能并非是Vulkan标准中定义的。
●第5章将深入讨论和实现Vulkan中的指令缓存。读者将了解到指令池的作用,并学习如何使用Vulkann中的指令缓存进行录制。该章的后半部分会介绍Vulkan中的内存管理。你将深入理解设备内存,并学习GPU内存的分配和销毁操作,理解CPU和GPU内存之间的映射关系。
●第6章将介绍图像资源的概念,并讨论相关内存管理的概念,包括图像的创建、分配、绑定和映射。我们会使用这种方法来创建一个深度图像,以便进行深度测试。该章将介绍WSI交换链,使用它来实现渲染可绘制对象并展示到屏幕的功能。我们会尝试获取交换链的颜色图像,并创建颜色视图以便用于绘制图元。
●第7章将讨论缓存资源及其相关用途,即可绘制对象的几何体顶点缓存的构建。该章会详细地介绍使用渲染通道定义绘制操作的相关工作的方法,并使用多个附件和子通道。我们将使用渲染通道在Vulkan中实现帧缓存,并使用一个简单的示例演示如何清除背景颜色。在该章的结尾部分,我们将使用SPIR-V实现第一个Vulkan着色器程序。我们会学习一些SDK工具的用法,将GLSL代码转换为SPIR-V的中间语言格式。
●第8章将介绍Vulkan中的计算流水线和图形流水线。该章将会对图形流水线的流程做一个概述,并且涵盖整个流程中所用到的各个模块的作用讲解。我们将讨论流水线状态对象、流水线缓冲对象,以及流水线布局。该章还包含所有流水线状态的介绍,包括动态状态、输入装配(以及图元绘制)、光栅化、融混、视口、深度/模板测试,以及多重采样。我们将使用这些状态对象来实现一个完整的图形流水线。
●第9章将全面地介绍Vulkan中对象绘制的过程。我们将录制和执行绘制物体的指令缓存。录制过程中的视口和几何体数据将关联到渲染通道、帧缓存,以及流水线。指令缓存的执行过程包括将指令缓存提交到设备队列,以及将交换链图像提交给展示引擎。我们还将讨论Vulkan中的同步机制,并理解有关栅栏、信号量,以及内存屏障的知识。此外,我们还会介绍如何绘制相关的API并通过一些简单的案例演示它们的用法。
●第10章将介绍Vulkan程序中对着色器资源进行更新的过程,这里用到了描述符和推送常数的概念。我们会讨论描述符池以及描述符集布局的创建过程。读者将从中学到有关流水线布局的用法,并使用描述符来更新设备内存端的缓存资源,以及将更新后的几何体渲染到屏幕上。与描述符不同的是,推送常数并不会使用指令缓存,而是使用一种更为优化的方式来更新资源。用户可以尝试实现一个简单的程序来深入理解推送常数的相关知识。
●第11章将尝试使用更为真实的方法,即贴敷纹理来渲染3D可绘制对象。用户将会学习如何创建图像资源并为它设置采样器对象,还将学习使用线性和优化平铺的方式来更新纹理。在优化平铺的模式下,用户还需要考虑使用传输缓存和图像内存的指令方法。
【本书的目标读者】
本书适用于对跨平台、高性能的图形开发,以及桌面级和嵌入式的计算程序开发技术感兴趣的读者。读者需要对C/C++编程有较为深入的理解,同时具备一定的实际开发经验,还需要具备一些图形学和计算领域的知识和经验,以便更好地理解Vulkan中的概念。
【下载示例代码及彩色图像】
本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。
●第1章 开始学习新一代3D图形API 1
1.1 Vulkan及其演化史1
1.2 Vulkan与OpenGL的对比2
1.3 重要术语4
1.4 Vulkan的原理5
1.4.1 Vulkan的执行模型5
1.4.2 Vulkan的队列6
1.4.3 对象模型7
1.4.4 对象生命周期与指令语法7
1.4.5 错误检查与验证8
1.5 理解Vulkan应用程序8
1.5.1 驱动8
1.5.2 应用程序9
1.5.3 WSI9
1.5.4 SPIR-V9
1.5.5 LunarG SDK9
1.6 开始学习Vulkan编程模型9
1.6.1 硬件初始化10
1.6.2 窗口展示表面11
1.6.3 资源设置12
1.6.4 流水线设置14
1.7 总结18
●第2章 你的第一个Vulkan伪代码程序19
2.1 Vulkan的安装19
2.2 Hello World伪代码20
2.2.1 初始化—与设备握手的过程21
2.2.2 交换链初始化—查询WSI扩展24
2.2.3 着色器支持—将着色器编译到SPIR-V32
2.2.4 构建布局—描述符与流水线布局33
2.2.5 创建渲染通道—定义通道属性34
2.2.6 帧缓存—将绘制图像关联到渲染通道35
2.2.7 产生几何体—在GPU内存中保存一个顶点36
2.2.8 流水线状态管理—创建流水线38
2.2.9 执行渲染通道—显示Hello World!!!41
2.2.10 队列的提交和同步—发送任务43
2.2.11 使用展示层进行显示—渲染三角形44
2.3 全部整合到一起45
2.4 总结46
●第3章 连接硬件设备47
3.1 学习使用LunarG SDK48
3.2 使用CMake设置我们的第一个工程49
3.3 扩展简介53
3.4 创建一个Vulkan实例58
3.5 理解物理设备和逻辑设备65
3.5.1 物理设备65
3.5.2 逻辑设备69
3.6 理解队列和队列族71
3.6.1 查询队列族72
3.6.2 创建队列74
3.7 整合设备和队列的代码76
3.8 总结78
●第4章 调试Vulkan程序80
4.1 初探Vulkan中的调试方法81
4.2 了解LunarG验证层及其特性82
4.3 在Vulkan程序中实现调试83
4.4 总结90
●第5章 Vulkan中的指令缓存和内存管理91
5.1 开始使用指令缓存91
5.1.1 显式同步92
5.1.2 指令缓存中的指令类型93
5.1.3 指令缓存与队列94
5.2 理解指令池和指令缓存API94
5.2.1 创建指令池95
5.2.2 指令缓存的分配97
5.3 记录指令缓存99
5.3.1 队列提交100
5.3.2 队列等待101
5.4 实现指令缓存的封装类101
5.4.1 实现指令缓存的分配过程102
5.4.2 记录指令缓存的分配过程103
5.4.3 提交指令到队列104
5.5 管理Vulkan内存105
5.5.1 宿主机内存105
5.5.2 设备内存106
5.5.3 分配设备内存108
5.5.4 释放设备内存110
5.5.5 从宿主机访问设备内存110
5.5.6 延迟分配内存111
5.6 总结112
●第6章 图像资源分配与交换链构建113
6.1 什么是图像资源113
6.2 了解图像资源116
6.2.1 创建图像116
6.2.2 理解图像的布局120
6.2.3 创建图像视图121
6.3 内存分配和图像资源的绑定122
6.3.1 获取内存分配的需求条件123
6.3.2 在设备端分配物理内存123
6.3.3 将分配的内存绑定到图像对象124
6.4 交换链简介124
6.4.1 了解交换链实现的工作流125
6.4.2 交换链实现类的框图127
6.4.3 渲染器—窗口管理的自定义类127
6.4.4 VulkanSwapChain—交换链的管理类132
6.4.5 使用WSI创建表面并关联到窗口135
6.4.6 支持画面展示的图形队列137
6.4.7 查询交换链的图像格式138
6.4.8 创建交换链139
6.5 创建一个深度图147
6.5.1 平铺简介147
6.5.2 创建深度缓存图像对象149
6.5.3 获取深度图的内存需求150
6.5.4 判断内存的类型151
6.5.5 将物理内存分配并绑定到深度图像151
6.5.6 图像布局变换152
6.5.7 图像布局变换与内存屏障152
6.5.8 创建图像视图156
6.6 总结程序流程157
6.6.1 初始化157
6.6.2 渲染—显示输出窗口158
6.7 总结158
●第7章 缓存资源、渲染通道、帧缓存以及SPIR-V着色器160
7.1 理解Vulkan的缓存资源类型161
7.1.1 创建缓存资源对象161
7.1.2 创建缓存视图162
7.2 使用缓存资源创建几何体164
7.2.1 准备几何体数据164
7.2.2 创建顶点缓存164
7.2.3 缓存创建概述165
7.2.4 实现一个缓存资源—创建几何体的顶点缓存166
7.2.5 理解代码流线169
7.3 理解渲染通道171
7.3.1 附件171
7.3.2 子通道172
7.3.3 渲染通道对应的Vulkan API172
7.3.4 实现渲染通道176
7.4 使用渲染通道来创建帧缓存179
7.5 清除背景颜色182
7.5.1 设置渲染通道实例的背景颜色183
7.5.2 渲染颜色背景185
7.6 在Vulkan中实现着色器186
7.6.1 SPIR-V简介187
7.6.2 将GLSL着色器编译为SPIR-V188
7.6.3 实现着色器190
7.7 总结197
●第8章 流水线和流水线状态管理199
8.1 开始学习流水线199
8.2 通过PCO缓冲流水线对象203
8.2.1 创建流水线缓冲对象203
8.2.2 合并流水线缓冲204
8.2.3 从流水线缓冲获取数据205
8.2.4 实现PCO206
8.3 创建图形流水线207
8.3.1 实现图形流水线209
8.3.2 销毁流水线211
8.4 理解计算流水线211
8.5 Vulkan的流水线状态对象213
8.5.1 动态状态214
8.5.2 顶点输入状态216
8.5.3 输入装配状态217
8.5.4 光栅化224
8.5.5 融混226
8.5.6 视口管理229
8.5.7 深度测试和模板测试230
8.5.8 多重采样状态232
8.6 实现流水线235
8.7 总结237
●第9章 绘制对象238
9.1 概述Vulkan中的绘制过程238
9.2 准备绘制对象240
9.2.1 录制渲染通道指令240
9.2.2 绑定流水线对象244
9.2.3 设置绘制对象的几何体信息245
9.2.4 定义动态视口246
9.2.5 裁切248
9.2.6 绘制指令249
9.2.7 可绘制对象的准备过程250
9.3 渲染当前可绘制对象252
9.3.1 获取交换链图像253
9.3.2 执行绘制的指令缓存对象254
9.3.3 使用展示引擎显示输出内容254
9.3.4 实现可绘制对象的渲染256
9.4 渲染索引几何体259
9.5 理解Vulkan中的同步图元262
9.5.1 栅栏262
9.5.2 信号量265
9.5.3 事件266
9.6 改变显示窗口的大小269
9.7 总结271
●第10章 描述符与推送常数273
10.1 理解描述符的概念273
10.2 如何在Vulkan中实现一致变量292
10.3 推送常数的更新299
10.4 总结304
●第11章 绘制纹理305
11.1 图像资源快速回顾305
11.2 纹理绘制的准备工作306
11.4 使用优化平铺实现图像资源322
11.5 在图像和缓存之间复制数据329
11.6 更新描述符集330
11.7 总结332