Vulkan 编程指南
Alexander Overvoorde 著
fangcun 译
2019 年 3 月 22 日
1
目录
1 序
目录
2
9
2 前言
13
2.1 关于本书 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 电子书 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 教程结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3 概述
16
3.1 Vulkan 起源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 画一个三角形 . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4 API 概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.5 校验层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4 开发环境
22
4.1 Windows
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.3 MacOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5 基础代码
45
5.1 一般结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2 资源管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3 和 GLFW 交互 . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6 实例
50
6.1 创建一个实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.2 检测扩展支持 . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.3 清理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7 校验层
54
7.1 校验层是什么? . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.2 使用校验层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.3 消息回调 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
7.4 配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
目录
3
8 物理设备和队列族
65
8.1 选择一个物理设备 . . . . . . . . . . . . . . . . . . . . . . . . 65
8.2 设备需求检测 . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
8.3 队列族 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
9 逻辑设备和队列
71
9.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.2 指定要创建的队列 . . . . . . . . . . . . . . . . . . . . . . . . 71
9.3 指定使用的设备特性 . . . . . . . . . . . . . . . . . . . . . . . 72
9.4 创建逻辑设备 . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
9.5 获取队列句柄 . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
10 窗口表面
75
10.1 创建窗口表面 . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
10.2 查询呈现支持 . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
10.3 创建呈现队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
11 交换链
80
11.1 检测交换链支持 . . . . . . . . . . . . . . . . . . . . . . . . . . 80
11.2 查询交换链支持细节 . . . . . . . . . . . . . . . . . . . . . . . 82
11.3 为交换链选择合适的设置 . . . . . . . . . . . . . . . . . . . . 84
11.4 表面格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
11.5 呈现模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
11.6 交换范围 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
11.7 创建交换链 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
11.8 获取交换链图像 . . . . . . . . . . . . . . . . . . . . . . . . . . 93
12 图像视图
13 图形管线概述
95
98
14 着色器模块
102
14.1 顶点着色器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
14.2 片段着色器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
14.3 逐顶点着色 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
目录
4
14.4 编译着色器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
14.5 载入着色器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
14.6 创建着色器模块 . . . . . . . . . . . . . . . . . . . . . . . . . . 110
14.7 创建着色器阶段 . . . . . . . . . . . . . . . . . . . . . . . . . . 112
15 固定功能
114
15.1 顶点输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
15.2 输入装配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
15.3 视口和裁剪 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
15.4 光栅化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
15.5 多重采样 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
15.6 深度和模板测试 . . . . . . . . . . . . . . . . . . . . . . . . . . 119
15.7 颜色混合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
15.8 动态状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
15.9 管线布局 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
15.10 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
16 渲染流程
125
16.1 配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
16.2 附着描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
16.3 子流程和附着引用 . . . . . . . . . . . . . . . . . . . . . . . . 127
16.4 渲染流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
17 阶段总结
18 帧缓冲
130
133
19 指令缓冲
136
19.1 指令池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
19.2 分配指令缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
19.3 记录指令到指令缓冲 . . . . . . . . . . . . . . . . . . . . . . . 139
19.4 开始渲染流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
19.5 基础绘制指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
19.6 结束渲染流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
目录
5
20 渲染和呈现
143
20.1 配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
20.2 同步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
20.3 信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
20.4 从交换链获取图像 . . . . . . . . . . . . . . . . . . . . . . . . 145
20.5 提交指令缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
20.6 子流程依赖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
20.7 呈现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
20.8 多帧并行渲染 . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
20.9 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
21 重建交换链
158
21.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
21.2 重建交换链 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
21.3 交换链不完全匹配和交换链过期 . . . . . . . . . . . . . . . . . 161
21.4 显式处理窗口大小改变 . . . . . . . . . . . . . . . . . . . . . . 163
21.5 处理窗口最小化 . . . . . . . . . . . . . . . . . . . . . . . . . . 165
22 顶点输入描述
166
22.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
22.2 顶点着色器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
22.3 顶点数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
22.4 绑定描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
23 创建顶点缓冲
169
23.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
23.2 创建缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
23.3 内存需求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
23.4 内存分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
23.5 填充顶点缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
23.6 绑定顶点缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
24 暂存缓冲
178
24.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
24.2 传输队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
目录
6
24.3 创建缓冲的辅助函数 . . . . . . . . . . . . . . . . . . . . . . . 179
24.4 使用暂存缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
24.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
25 索引缓冲
185
25.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
25.2 创建索引缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
25.3 使用索引缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
26 描述符布局和缓冲
190
26.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
26.2 顶点着色器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
26.3 描述符集布局 . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
26.4 uniform 缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
26.5 更新 uniform 数据 . . . . . . . . . . . . . . . . . . . . . . . . 196
27 描述符池和描述符集
200
27.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
27.2 描述符池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
27.3 描述符集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
27.4 使用描述符集 . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
27.5 多个描述符集 . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
28 图像
207
28.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
28.2 图像库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
28.3 载入图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
28.4 暂存缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
28.5 纹理图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
28.6 布局变换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
28.7 复制缓冲到图像 . . . . . . . . . . . . . . . . . . . . . . . . . . 220
28.8 准备纹理图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
28.9 变换屏障掩码 . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
28.10 清理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
目录
7
29 图像视图和采样器
226
29.1 纹理图像视图 . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
29.2 采样器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
29.3 各向异性设备特性 . . . . . . . . . . . . . . . . . . . . . . . . 233
30 组合图像采样器
235
30.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
30.2 更新描述符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
30.3 纹理坐标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
30.4 着色器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
31 深度缓冲
244
31.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
31.2 三维几何 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
31.3 深度图像和视图 . . . . . . . . . . . . . . . . . . . . . . . . . . 247
31.4 渲染流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
31.5 帧缓冲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
31.6 清除值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
31.7 深度和模板状态 . . . . . . . . . . . . . . . . . . . . . . . . . . 256
31.8 处理窗口大小变化 . . . . . . . . . . . . . . . . . . . . . . . . 257
32 载入模型
259
32.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
32.2 库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
32.3 网格样例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
32.4 载入顶点和索引 . . . . . . . . . . . . . . . . . . . . . . . . . . 260
32.5 顶点去重 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
33 生成细化贴图
268
33.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
33.2 创建图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
33.3 生成细化贴图 . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
33.4 线性过滤支持 . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
33.5 采样器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
33.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
目录
8
34 多重采样
282
34.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
34.2 获取可用样本数 . . . . . . . . . . . . . . . . . . . . . . . . . . 283
34.3 设置渲染目标 . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
34.4 添加附着 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
34.5 提升质量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
34.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
35 FAQ
295