Skip to content

Commit 2c676ca

Browse files
committed
finish
1 parent 4baad24 commit 2c676ca

19 files changed

+167
-1741
lines changed

docs/images/0420/Marry.png

-201 KB
Binary file not shown.

docs/images/0420/Marry_shadow.png

-152 KB
Binary file not shown.

docs/images/0420/depth_image.png

-158 KB
Binary file not shown.

docs/images/0421/defer.png

-175 KB
Binary file not shown.

docs/images/0430/ray_tracing.jpg

50.9 KB
Loading

docs/index.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ comments: true
1212

1313
教程将使用 C++ 编写代码,C++23 标准,使用 Vulkan-SDK 内含的 Vulkan-Hpp 封装,充分利用 RAII 等现代 C++ 特性。
1414

15-
如果需要,你可以降低至 C++17 或 C++20 标准进行学习。因为我们不会用到那些复杂的高级特性,且仅在“进阶”章节使用 C++20 模块功能。
15+
如果需要,可以降低至 C++17 或 C++20 标准进行学习。因为我们不会用到那些复杂的高级特性,且仅在“进阶”章节使用 C++20 模块功能。
1616

1717
> 如果你发现了文档的错误,请点击右上角前往Github仓库,提交 Issue 或 PR 。
1818
@@ -30,8 +30,6 @@ comments: true
3030

3131
`vcpkg` 用于管理第三方库,主要用于安装 `glfw3``glm` 等依赖,这非常简单。
3232

33-
> 教程预期在 C++23 标准库模块完全支持后再次重构内容。
34-
3533
## **其他说明**
3634

3735
Vulkan SDK 本身由 C 编写,因此具有更好的跨语言兼容性,可通过 C 接口供其他语言调用。

docs/md/00/00_intro.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ comments: true
88

99
### Vulkan 是什么
1010

11-
**[Vulkan](https://www.vulkan.org/)**[Khronos Group](https://www.khronos.org/) 推出的一款**跨平台****现代图形与计算 API**。与传统 API (如[OpenGL](https://en.wikipedia.org/wiki/OpenGL)[Direct3D](https://en.wikipedia.org/wiki/Direct3D))相比,它为显卡提供了更好的抽象,使你可以更好的描述应用程序的行为,从而减少意外的驱动程序行为并带来更好的性能。
11+
**[Vulkan](https://www.vulkan.org/)**[Khronos Group](https://www.khronos.org/) 推出的一款**跨平台****现代图形与计算 API**。与传统 API (如[OpenGL](https://en.wikipedia.org/wiki/OpenGL)[Direct3D](https://en.wikipedia.org/wiki/Direct3D))相比,它为显卡提供了更好的抽象,使你可以更好的描述应用的工作内容,从而减少意外的驱动程序行为并带来更好的性能。
1212

1313
> DirectX 12 同样是现代图形 API ,但它仅限于 Windows 平台。
1414
@@ -29,10 +29,10 @@ comments: true
2929

3030
如果您主要对游戏开发感兴趣,那么 OpenGL 或 Direct3D 可能更适合您,因为它们的上手难度相对较低,且在多数场景下仍然能够满足需求。
3131

32-
33-
3432
另一种选择是使用 [Unreal Engine](https://www.unrealengine.com/zh-CN)[Unity](https://unity.com/cn) 这样的游戏引擎。这些引擎可以利用 Vulkan 的高性能特性,同时为开发者提供更易用的高级 API,从而在不牺牲太多性能的前提下显著降低开发难度。
3533

34+
> 在实际开发中通常会通过一个“渲染硬件接口\(RHI\)”层对图形引擎进行抽象,但学习底层的引擎 API 仍有助于你理解渲染程序本身。
35+
3636
## **学习前提**
3737

3838
### 硬件要求
@@ -86,21 +86,21 @@ comments: true
8686

8787
11. 现在机器人终于可以画画了,我们要为他准备一个画桌,用于放置画纸等工具。这个画桌就是帧缓冲 `VkFrameBuffer` ,一帧代指一幅图像。
8888

89-
12. 我们还要为机器人设计一个房子,这个房子代指渲染通道 `VkRenderPass`而画笔等工具对应其中的附件 `Attachments`
89+
12. 我们还要为机器人设计一个房子,这个房子代指渲染通道 `VkRenderPass`而纸张对应其中的附件 `Attachments`
9090

9191
13. 虽然这些附件放置\(绑定\)在画桌\(帧缓冲\)上,但我们需要为房子贴上告示牌,写明房子内有哪些附件,即附件描述 `AttachmentDesctiption`
9292

93-
14. 机器人很笨,只能看着流程图画画,所以你需要在房间中放置一些流程图,可以是一张,也可以是多张。这个流程图就代指图形管线 `VkGraphicsPipeline`
93+
14. 机器人很笨,只能看着流程图画画,所以你需要在房子中放置一些流程图。这个流程图就代指图形管线 `VkGraphicsPipeline`
9494

95-
15. 一个大房子分成多个小房间(可以只有一个),可以用不同的房间干不同的事,这些小房间就是子通道 `VkSubpass`通常一个子通道绑定一个图形管线
95+
15. 一个大房子分成多个小房间(可以只有一个),可以用不同的房间干不同的事,这些小房间就是子通道 `VkSubpass`一个子通道绑定一个图形管线
9696

9797
16. 我们有一份流程图的模版,只需要修改它的部分内容就可以变成新的流程图。其中某几个部分是可编程的,这里就用到了着色器模块 `Shader Module`
9898

99-
17. 这些机器人很呆,需要你写信告诉他该画画了,在哪个房子的哪些房间根据哪些流程图画画。这个信就是命令缓冲 `VkCommandBuffer`
99+
17. 这些机器人很呆,需要你写信告诉他该画画了,在哪个房子的哪些房间根据哪些流程图画画。这些信代指命令缓冲 `VkCommandBuffer`
100100

101-
18. 特殊的是,这些信可以重用,所以我们使用一个命令池 `VkCommandPool` 管理这些资源。
101+
18. 特殊的是信可以重用,我们使用一个命令池 `VkCommandPool` 管理这些资源。
102102

103-
19. 事情一多,机器人做起来就乱了。要保证他先画画,画完才能把画拿出去,所以我们用信号量 `Semaphore` 处理 GPU 自身的同步。还要保证机器人先完成一张画,我们再寄出新的信,所以我们使用围栏 `Fence` 处理 CPU 和 GPU 之间的同步。
103+
19. 事情一多,机器人做起来就乱了。要保证它先画画,画完才能把画拿出去,所以我们用信号量 `Semaphore` 处理 GPU 自身的同步。还要保证机器人先完成一张画,我们再寄出新的信,所以我们使用围栏 `Fence` 处理 CPU 和 GPU 之间的同步。
104104

105105
绘制第一个三角形大致就是这些内容,你目前**不需要记住**,在后面的学习中随时可以回顾此内容。
106106

docs/md/00/02_diff.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ comments: true
44
---
55
# **接口介绍**
66

7+
> 本节主要讲述 C 与 C++ 接口的差异,您可以暂时跳过,感兴趣时再回来查看。
8+
79
## **接口概述**
810

911
Vulkan 提供了两种编程接口风格:

docs/md/01/00_base.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,9 @@ void cleanup() {
148148

149149
---
150150

151-
需要说明的是,基础部分的代码重点用于功能演示,因此可能忽略**可选**的 const 与 static 等 C++ 标识符细节。
151+
需要说明的是,基础部分的代码重点在于功能演示,因此可能忽略**可选**`const``static` 等 C++ 标识符细节。
152152
但进阶部分会提供尽量优雅的基础代码框架。
153153

154-
这个基础框架为后续开发奠定了良好基础,接下来可以开始初始化 Vulkan 实例和设备。
155-
156154
---
157155

158156
**[C++代码](../../codes/01/00_base/main.cpp)**

docs/md/01/01_instance.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ comments: true
1515
- 保证它的生命周期覆盖其他 Vulkan 组件
1616
- 可以无参构造,不可 `nullptr` 构造(特殊)
1717

18-
根据上面的要求,我们可以将它作为成员变量,在类实例化时自动创建并加载上下文
18+
根据上面的要求,我们可以将它作为成员变量,在创建类对象时自动构造并加载上下文
1919

2020
```cpp
2121
private:
@@ -71,9 +71,7 @@ void createInstance(){
7171

7272
前四个参数可以任意填写,最后一个参数是 API 版本号。具体值请参考你的 Vulkan SDK 版本,可以写的比 SDK 版本低、但不能更高。
7373

74-
> 版本号也可直接用宏 `VK_API_VERSION_X_X` 指定。
75-
76-
注意到它并不是 RAII 的,因为它只是个配置信息、不含特殊资源。
74+
注意到它并不是 RAII 的,因为这只是个配置信息、不含特殊资源。
7775
所以我们可以无参构造,然后直接修改成员变量,像这样:
7876

7977
```cpp
@@ -82,6 +80,8 @@ applicationInfo.pApplicationName = "xxxx"; // 可以直接修改成员变量
8280
applicationInfo.setApplicationVersion(1); // 也可以使用 setter 函数
8381
```
8482

83+
> `setter` 返回结构体对象本身,因此可以链式调用。
84+
8585
### 2. 配置基础创建信息
8686

8787
Vulkan 中资源的创建都依赖对应的 `CreateInfo` 结构体,我们必须先填写它。
@@ -96,7 +96,7 @@ vk::InstanceCreateInfo createInfo(
9696
`flags` 参数是标志位,用于控制特殊行为,默认认初始化为空,大多时候无需修改。
9797
还有其他参数,但都提供了默认初始化,无需手动设置。
9898

99-
注意到, `&applicationInfo` 传入指针,需要注意生命周期
99+
`&applicationInfo` 传入指针,需要注意生命周期
100100

101101
1. `CreateInfo`仅用于提供配置信息。
102102
2. `CreateInfo`在创建对应资源后就无用了。
@@ -168,7 +168,7 @@ Vulkan-Hpp 需要调用底层C接口,所以这些配置信息采用相同的
168168

169169
> 特征:err.code() 为 `vk::Result::eErrorIncompatibleDriver`
170170
171-
在使用最新 MoltenVK SDK 的 MacOS 上,可能抛出异常,因为 MacOS 在运行 Vulkan 时必须启用转换层扩展。
171+
在使用 MoltenVK SDK 的 MacOS 上,可能抛出异常,因为 MacOS 在运行 Vulkan 时必须启用转换层扩展。
172172

173173
**解决方案:**
174174

@@ -227,7 +227,7 @@ C风格接口必须手动调用相关 `Destroy` 函数释放 `VkInstance` 等特
227227

228228
当你不确定成员变量声明顺序时,可以参考每章最下方的样例代码。
229229

230-
> 实际上也可以使用 `m_xxx = nullptr` 显式清理资源,此时无需在意声明顺序。
230+
> 也可以使用 `m_xxx = nullptr` 显式清理资源,此时无需在意声明顺序。
231231
232232
---
233233

0 commit comments

Comments
 (0)