WebGPU 在设计的时候,其愿景确实是为 Web 平台提供一套现代的 GPU 接口,从而替代古老而陈旧的 WebGL(WebGL 就是 OpenGL ES 在 Web 上的实现)。 但是,既然是一套规范,那么其实使用什么编程语言,就是次要的了。
对于浏览器厂商来说,他们进行 WebGPU 的开发工作的时候,自然而然会使用贴近原生的语言进行开发工作, 比如使用 C/C++ 或者使用 Rust 来进行实现,然后在此基础上,开放一套 Javascript 的接口给 Web 开发人员。
所以,在 WebGPU 的开发过程中,C/C++ 接口和 Rust 接口的 WebGPU 就变成了顺理成章的"副产物"。而这个"副产物",却能为很多开发者解决问题。
如果你要开发的程序需要拥有极致的性能(比如本人正在开发的视频创作工具),那么 Web 这样的方案,很大程序上无法做到极致的体验的,你只能开发一个原生平台的原生应用。 而此时,你又想调用 GPU 的能力,你该怎么办呢?
在 Windows 上面,你就需要去调用 Direct3D(或者 Vulkan),在 Mac 上,你就需要调用 Metal,在 Linux 上面,你就需要调用 Vulkan。 如果你开发的软件恰好是一个跨平台的软件,那么光是这一层,就够你受的了。
{#fig:example width="80%"}
所以,在 2024 年,Vulkan,Direct3D,Metal 都已经发布了差不多 10 年的时间节点上,仍然有大量的项目,还在使用 OpenGL,甚至一些新发起的项目也在使用,就是为了 OpenGL 的跨平台能力。
市面上也出现过一些所谓的兼容层。例如乌克兰小伙 bkaradzic 开发的 bgfx,有很多开源的引擎,游戏,都用到了这个项目。 这个项目非常好,但是,bgfx 仍然没有放弃 OpenGL(客观上也不允许放弃),这就导致 bgfx 残留着大量 OpenGL 的"影子"。 而且 bgfx 毕竟算是一个个人项目,支持特性也不是很完善。
而 WebGPU 则改变了这一现状,尤其是 WebGPU 的 C/C++ 和 Rust 接口,这就让 WebGPU 在 Web 之外的地方得以发光发热。 你完全可以在原生平台上(包括 GLFW,Qt)上使用 WebGPU,在不抛弃极致性能的前提下,实现对 GPU 的"跨平台调用"。
而我认为,OpenGL 唯一的跨平台优势在 WebGPU 面前将不复存在,WebGPU 将终结 OpenGL,彻底淘汰 OpenGL。
{#fig:example width="80%"}
我们前面说了,WebGPU 在演进过程中,诞生了 C/C++ 和 Rust 两套原生接口。那为什么会有两套呢?
WebGPU 标准是由 Apple,Google,Mozilla 等一众企业起草的。但是有了标准,还是需要各家按照这个标准进行实现。 Apple 的 Safari 自不必多说,这玩意压根不开源,和我们没有关系。
而 Google 的 Chromium 却是开源的,于是 Google 新建了一个叫做 Dawn 的开源项目,用于为 Chromium 提供 WebGPU 的支持。 而 Dawn 是使用 C/C++ 进行开发的,所以 WebGPU 的 C/C++ 接口,就来源于 Dawn。
而 Mozilla 也为 Firefox 的 WebGPU 发起了一个开源项目,叫做 wgpu,这个项目是使用 rust 进行编写的。所以 WebGPU 的 Rust 接口,就来源于 wgpu。
我们这个学习指南,使用 Dawn 的 C/C++ 来进行。