用 C++ 从零手写 WebGPU 原生 3D 应用
Learn WebGPU for C++

想彻底搞懂每一行 GPU 代码?这套教程带你用 C++ 从零开始,基于 WebGPU API 在 Windows、Linux 和 macOS 上构建原生 3D 应用。内容涵盖从项目搭建、Hello Triangle 到光照控制、纹理映射等核心环节。你可以根据需求选择阅读完整的 C++ 风格代码,或者查看原始的 C WebGPU API 实现。教程还贴心地提供了构建指南,支持 wgpu-native 和 Dawn 两种后端,并指导如何将示例适配到 Web 环境运行。虽然部分高级功能仍在开发中,但现有章节已足够让你深入理解现代图形编程的底层逻辑。
你希望理解自己编写的每一行 GPU 代码吗?那就从零开始手写 WebGPU 代码吧!
HN 评论区
14- Animats
这篇读起来很有意思。我用的是 WGPU,不过是从 Rust 调用的,那边有个大致类似的库。[1]
用户应用和 GPU 之间有三层中间件(shim)——WGPU、Vulkan 库,以及针对 GPU 的 Vulkan 驱动。具体会因平台略有不同。
这些层其实没干多少活, mostly 只是在搬运数据。
在现代基础 3D 图形中,要绘制东西,应用会创建一个 mesh 对象,它由几个大数组组成:包含 X、Y、Z 坐标的顶点,定义三角形的顶点索引三元组,以及一些其他信息。你还会创建纹理对象,它们本质上就是内存中的 2D 图片。
每个对象都有一个变换矩阵(transform),这是一个 4x4 矩阵,用于将其转换到世界空间;最后还有一个相机变换,负责将场景投影到平面屏幕上。此外,你还需要提供一些在 GPU 上运行的着色器程序来处理这些数据。
所有这些数据通常原封不动地被移动到 GPU 上,或者在“集成显卡”系统中被放置到 GPU 可访问的位置。随后,GPU 的硬件和固件会接收这些数据并负责绘制。
那么 WGPU 和 Vulkan 各层在做什么呢?它们在管理内存、时间和安全性。它们负责分配 GPU 内存,防止在 GPU 处理数据时数据被修改(互斥),并通过阻止 GPU 访问其他进程的内存来防止跨进程内存访问。这更像操作系统的职责,而不是图形程序的工作。图形栈的这些层级并不……
- ChadNauseam
这个资源让我在几年前学会了 WebGPU,我强烈推荐它。这是我找到的最好的 WebGPU 教程。(那个 Rust 版本的也相当不错。)我用学到的知识做了这个小游戏:https://alexpop11.github.io/Spec-Hops/(按空格键扔炸弹),为此我要感谢 eliemichel!
- minraws
资源构建得很棒,虽然发现了一些小瑕疵,但作为入门起点相当不错。
不过我觉得,除非你需要专门针对 Web 或需要广泛的跨平台支持,否则对于更高级的框架/库来说,nvrhi 是更好的替代方案。尤其是对于 C++ 开发者而言。
另外,如果你是为了跨平台或 Web 开发,大概率是在用 Rust,或者自己在写游戏引擎/库。也许是我对生态系统的看法有些偏颇。