Vulkan是新一代跨平台绘图接口,是Khronos最新推出的产品。本书首先介绍Vulkan系统并展示其独特性能。本书将讲述如何与硬件设备建立连接,以查询可用的队列、内存类型和提供的功能;介绍如何获取知识以将各种操作命令记录到命令缓冲区中,并将其提交到适当的队列以进行GPU处理;详细讨论内存管理,并演示如何使用缓冲区和图像资源来为呈现引擎和顶点缓冲区创建绘图纹理和图像视图,以存储几何信息;以及简要介绍SPIR-V等。
封面图
目录
- 译者序
- 前言
- 致谢
- 作者简介
- 审阅者简介
- 第1章开始学习新一代3D图形API 1
- 1.1Vulkan及其演化史1
- 1.2Vulkan与OpenGL的对比2
- 1.3重要术语4
- 1.4Vulkan的原理5
- 1.4.1Vulkan的执行模型5
- 1.4.2Vulkan的队列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.3WSI9
- 1.5.4SPIR-V9
- 1.5.5LunarG 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.1Vulkan的安装19
- 2.2Hello 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.4VulkanSwapChain—交换链的管理类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.1SPIR-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.5Vulkan的流水线状态对象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.1.1VulkanDescriptor—用户自定义的描述符类274
- 10.1.2描述符集布局275
- 10.1.3理解流水线布局279
- 10.1.4描述符池281
- 10.1.5创建描述符集的资源283
- 10.1.6创建描述符集287
- 10.2如何在Vulkan中实现一致变量292
- 10.2.1预备条件292
- 10.2.2执行模型概述293
- 10.2.3初始化294
- 10.2.4渲染296
- 10.2.5更新297
- 10.3推送常数的更新299
- 10.3.1定义着色器中的推送常数299
- 10.3.2更新流水线布局以及推送常数300
- 10.3.3更新资源数据301
- 10.4总结304
- 第11章绘制纹理305
- 11.1图像资源快速回顾305
- 11.2纹理绘制的准备工作306
- 11.2.1设置纹理坐标307
- 11.2.2更新着色器程序307
- 11.2.3加载图像文件308
- 11.2.4本地图像数据结构309
- 11.3实现线性平铺的图像资源310
- 11.3.1加载图像文件311
- 11.3.2创建图像对象311
- 11.3.3内存分配和绑定313
- 11.3.4存储数据到设备内存314
- 11.3.5创建指令缓存对象315
- 11.3.6设置图像布局315
- 11.3.7提交指令缓存315
- 11.3.8创建一个图像采样器316
- 11.3.9滤波318
- 11.3.10边界截取方式319
- 11.3.11创建图像视图321
- 11.4使用优化平铺实现图像资源322
- 11.4.1加载图像文件322
- 11.4.2缓存对象的内存分配和绑定322
- 11.4.3存储数据到设备内存323
- 11.4.4创建图像对象324
- 11.4.5图像对象内存的分配和绑定324
- 11.4.6创建指令缓存对象325
- 11.4.7设置图像布局325
- 11.4.8缓存到图像副本325
- 11.4.9设置优化的图像布局参数326
- 11.4.10提交指令缓存327
- 11.4.11创建图像采样器327
- 11.4.12创建图像视图328
- 11.5在图像和缓存之间复制数据329
- 11.6更新描述符集330
- 11.7总结332