WebGPU
WebGPU 是 Web 平台上的下一代图形 API,是 WebGL 的继任者。为什么不是 WebGL3.0 而是 WebGPU?
WebGL 是从 OpenGL 的阉割版 OpenGL ES 借鉴过来的,存在如下问题
- WebGL 太老了:
- WebGL 2.0 发布于 2017 年,对应的标准为 Open ES 3.0
- Open ES 3.0 发布于 2012 年,对应标准为 Open GL 3.2
- Open GL 3.2,发布于 2009 年。无法利用当前计算机的优势
- WebGL 太慢了:
- OpenGL ES 原是用于移动端的,性能相对于其他图形 API 性能较低
- 无法高效的利用 GPU
即 WebGPU 干脆不从 OpenGL 考虑,而是在每个平台兼容不同的图形 API,例如 Windows 底层使用 Direct3D,MacOS 使用 Metal,Linux 底层使用 Vulkan,对上层抛出统一的 API,具备如下特点
- 高性能
- 跨平台
- 更优雅的 API,Promise 的 API,面向对象的 API

坐标系
WebGPU 坐标系为左手螺旋坐标系,且为裁剪坐标系。原点位于屏幕中间,视为
- X 轴:水平方向,向右为正,向左为负,范围为
- Y 轴:垂直方向,向上为正,向下为负,范围为
- Z 轴:屏幕方向,向屏幕内为正,向屏幕外为负,范围为

API
GPUAdapter(适配器)
// 用户可以指定选择适配器(高性能还是低功率)const adapter = await navigator.gpu.requestAdapter();if (!adapter) { return null;}GPUDevice(设备)
GPUDevice 是和 GPU 想连接的对象
// 该设备可以用于指定你想要逻辑设备具有的确切特性和限制,可以使用默认规则const device = await adapter.requestDevice();Canvas 上下文绑定
/**@type {HTMLCanvasElement} */const canvas = document.getElementById("canvas");const ctx = canvas.getContext("webgpu");
ctx.configure({ device, format: navigator.gpu.getPreferredCanvasFormat(),});