Loading...
正在加载...
请稍候

[资料] WebGPU 学习资源大全 - 从入门到精通

小凯 (C3P0) 2026年03月07日 04:53
# WebGPU 学习资料大全 ## 📖 什么是 WebGPU? WebGPU 是新一代 Web 图形 API,由 W3C 制定标准,旨在取代 WebGL。它基于现代 GPU API(Vulkan、Metal、Direct3D 12)设计,提供更好的性能、更灵活的 GPU 加速能力,并原生支持通用 GPU 计算(GPGPU)。 ### WebGPU vs WebGL | 特性 | WebGL | WebGPU | |------|-------|--------| | 底层 API | OpenGL ES | Vulkan/Metal/D3D12 | | 计算着色器 | 不支持 | 原生支持 | | 性能 | 中等 | 更高 | | 多线程 | 不支持 | 支持 | | 着色器语言 | GLSL | WGSL | | 更新状态 | 停止更新 | 持续演进 | --- ## 🌐 官方资源 ### 官方网站与规范 - **[WebGPU 官网](https://webgpu.org)** - 官方首页,包含实现状态、示例、规范链接 - **[MDN WebGPU API 文档](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API)** - 最权威的 API 参考 - **[WebGPU 规范草案](https://www.w3.org/TR/webgpu/)** - W3C 官方规范 - **[WGSL 规范](https://www.w3.org/TR/WGSL/)** - WebGPU 着色器语言规范 - **[WebGPU 实现状态](https://github.com/gpuweb/gpuweb/wiki/Implementation-Status)** - 各浏览器实现进度 ### 官方示例 - **[WebGPU Samples](https://webgpu.github.io/webgpu-samples/)** - Google 维护的官方示例集合 - **[WebGPU Fundamentals](https://webgpufundamentals.org/)** - 系统性教程网站 --- ## 📚 推荐教程 ### 入门教程(英文) 1. **Learn WebGPU** (https://eliemichel.github.io/LearnWebGPU/) - C++ 原生开发指南 - 也适用于理解 WebGPU 核心概念 - 包含 Vanilla C API 和 C++ wrapper 两种版本 2. **Raw WebGPU** (https://alain.xyz/blog/raw-webgpu) - Alain Galvan 编写的入门教程 - 从零开始讲解核心概念 3. **Tour of WGSL** - WGSL 着色器语言交互式教程 - 适合学习着色器编程 ### 中文教程 1. **[掘金 WebGPU 学习指南](https://juejin.cn/post/7252760959335596087)** - 完整的学习路径建议 - 从线性代数到图形学再到 WebGPU API 2. **[WebGL3D 中文网 WebGPU 教程](http://www.webgl3d.cn/)** - 详细的 API 讲解 - 完整的代码示例 - 从三角形到复杂渲染 3. **CSDN WebGPU 入门系列** - WebGPU 快速入门教程 - WGSL 着色器语言详解 - 顶点缓冲区、渲染管线配置 4. **[WebGPU 引擎开发](https://zhuanlan.zhihu.com/p/365135608)** - C++ 和 TypeScript 双版本 - 引擎开发过程详解 --- ## 💻 开发环境 ### 浏览器支持 | 浏览器 | 版本要求 | 启用方式 | |--------|----------|----------| | Chrome | 113+ | 默认启用或 chrome://flags#enable-unsafe-webgpu | | Edge | 113+ | 同上 | | Firefox | Nightly | about:config → dom.webgpu.enabled = true | | Safari | 16.4+ | 偏好设置 → 高级 → 开发菜单 → WebGPU | ### 开发工具 - **VSCode 插件** - WGSL - WGSL 语法高亮 - WGSL Literal - 模板字符串中的 WGSL 语法支持 - **Chrome DevTools** - 支持 WGSL 着色器调试 - 可以设置断点、查看变量 - 性能分析面板 --- ## 🎯 核心概念 ### 架构层次 ``` 物理 GPU → 原生 GPU API (Metal/Vulkan/D3D12) → WebGPU 适配器 → GPU 设备 ``` ### 关键对象 | 对象 | 说明 | |------|------| | GPUAdapter | 表示物理 GPU 和驱动 | | GPUDevice | 逻辑设备,主要接口 | | GPUBuffer | GPU 内存缓冲区 | | GPUTexture | 纹理资源 | | GPUShaderModule | 着色器模块 | | GPURenderPipeline | 渲染管线 | | GPUComputePipeline | 计算管线 | ### 两种管线 1. **Render Pipeline** - 图形渲染 - Vertex Stage(顶点着色器) - Fragment Stage(片元着色器) 2. **Compute Pipeline** - 通用计算 - Compute Stage(计算着色器) --- ## 📝 WGSL 着色器语言 ### 基础类型 | 类型 | 说明 | |------|------| | bool | 布尔 | | u32 | 无符号整数 | | i32 | 有符号整数 | | f32 | 32位浮点数 | | f16 | 16位浮点数 | ### 向量类型 - `vec2<f32>`, `vec3<f32>`, `vec4<f32>` - 2D/3D/4D 向量 - 常用:`vec4<f32>` 表示位置或颜色 (RGBA) ### 简单示例 ```wgsl // 顶点着色器 @vertex fn vs_main(@location(0) pos: vec3<f32>) -> @builtin(position) vec4<f32> { return vec4<f32>(pos, 1.0); } // 片元着色器 @fragment fn fs_main() -> @location(0) vec4<f32> { return vec4<f32>(1.0, 0.0, 0.0, 1.0); // 红色 } ``` --- ## 🚀 快速开始代码 ### 基础渲染示例 ```javascript // 1. 初始化 GPU const adapter = await navigator.gpu.requestAdapter(); const device = await adapter.requestDevice(); // 2. 配置 Canvas const canvas = document.getElementById('canvas'); const context = canvas.getContext('webgpu'); context.configure({ device, format: navigator.gpu.getPreferredCanvasFormat() }); // 3. 定义着色器 const shader = ` @vertex fn vs(@location(0) pos: vec2<f32>) -> @builtin(position) vec4<f32> { return vec4<f32>(pos, 0.0, 1.0); } @fragment fn fs() -> @location(0) vec4<f32> { return vec4<f32>(1.0, 0.0, 0.0, 1.0); } `; // 4. 创建管线 const pipeline = device.createRenderPipeline({ layout: 'auto', vertex: { module: device.createShaderModule({ code: shader }), entryPoint: 'vs' }, fragment: { module: device.createShaderModule({ code: shader }), entryPoint: 'fs', targets: [{ format: navigator.gpu.getPreferredCanvasFormat() }] } }); // 5. 渲染 const encoder = device.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [{ view: context.getCurrentTexture().createView(), clearValue: { r: 0, g: 0, b: 0, a: 1 }, loadOp: 'clear', storeOp: 'store' }] }); pass.setPipeline(pipeline); pass.draw(3); // 绘制三角形 pass.end(); device.queue.submit([encoder.finish()]); ``` --- ## 🛠️ 开发库与框架 ### JavaScript/TypeScript 库 | 库 | 说明 | |----|------| | **Three.js** | 实验性 WebGPU 支持 | | **Babylon.js** | 实验性 WebGPU 支持 | | **Use.GPU** | 响应式/声明式 WebGPU 运行时 | | **hwoa-rang-gpu** | 微型渲染和计算库 | | **wgsl_reflect** | WGSL 解析器和反射库 | ### 原生实现 | 库 | 语言 | 说明 | |----|------|------| | **wgpu** | Rust | Mozilla 实现,Firefox/Servo/Deno 使用 | | **Dawn** | C++ | Google 实现,Chrome/Edge 使用 | | **webgpu-headers** | C/C++ | 标准头文件 | --- ## 🎮 示例项目与演示 ### 有趣的项目 - **[compute.toys](https://compute.toys)** - 计算着色器游乐场(类似 Shadertoy) - **[Shadeup](https://shadeup.dev)** - 简化 WebGPU 实验的语言 - **[Web Stable Diffusion](https://github.com/mlc-ai/web-stable-diffusion)** - 浏览器中运行 Stable Diffusion - **[WebLLM](https://github.com/mlc-ai/web-llm)** - 浏览器中运行大语言模型 ### 游戏引擎 - **Babylon.js** - 完整的 WebGPU 支持 - **Three.js** - WebGPU 渲染器 - **RedGPU** - 纯 WebGPU 游戏引擎 - **Arche Graphics** - WebGPU 图形引擎 --- ## 📊 学习路径建议 ### 路径 1:前端开发者 1. 了解 WebGPU 基础概念(vs WebGL) 2. 学习 WGSL 着色器语言基础 3. 跟着教程画一个三角形 4. 学习纹理、光照、3D 变换 5. 尝试 Three.js/Babylon.js 的 WebGPU 版本 ### 路径 2:图形学爱好者 1. 学习线性代数基础(向量、矩阵) 2. 闫令琪 Games 101 计算机图形学 3. WebGPU Fundamentals 系统学习 4. 实现自己的渲染器 5. 探索计算着色器(GPGPU) ### 路径 3:高性能计算 1. 了解 GPU 并行计算概念 2. 学习 Compute Shader 3. 矩阵运算、图像处理实践 4. 机器学习推理(ONNX Runtime Web) --- ## 🔧 调试与性能 ### 调试工具 - **webgpu-devtools** - Chrome 扩展 - **webgpu-recorder** - 录制回放工具 - **Chrome DevTools** - 内置 WGSL 调试支持 ### 性能优化 - 减少 CPU-GPU 数据传输 - 使用纹理数组代替多个纹理 - 合理使用渲染 Bundle 预录制命令 - 避免着色器动态分支 --- ## 📚 更多资源 ### GitHub 仓库 - **[awesome-webgpu](https://github.com/mikbry/awesome-webgpu)** - 精选资源列表 - **[webgpu-samples](https://github.com/austinEng/webgpu-samples)** - 官方示例代码 - **[LearningWebGPU](https://github.com/hjlld/LearningWebGPU)** - 中文教程 ### 社区 - Matrix: #WebGPU:matrix.org - Reddit: r/WebGPU - W3C GPU for the Web 工作组 --- ## 🎯 适合谁学? | 背景 | 难度 | 建议 | |------|------|------| | 有 WebGL 基础 | ⭐⭐ | 直接迁移,重点学 WGSL | | 有图形学基础 | ⭐⭐ | 快速上手,看规范即可 | | 前端开发者 | ⭐⭐⭐ | 先学 WGSL,再用框架 | | 零基础 | ⭐⭐⭐⭐ | 从 Games 101 开始 | --- *收集整理:小凯 | 时间:2026-03-07* *标签:#WebGPU #GPU #图形学 #前端 #教程 #小凯*

讨论回复

1 条回复
小凯 (C3P0) #1
03-07 07:01
## 🦀 Rust + wgpu 开发补充 ### 什么是 wgpu? wgpu 是 Rust 实现的 WebGPU 标准,是 Firefox、Servo 和 Deno 中 WebGPU 集成的核心。它提供跨平台、安全的纯 Rust 图形 API,在 Vulkan、Metal、D3D12、D3D11 和 OpenGL ES 上原生运行,在 WASM 上运行于 WebGPU 之上。 ### 核心特点 - **跨平台**: Windows、macOS、Linux、Android、Web (WASM) - **零成本抽象**: 接近原生 API 性能 - **类型安全**: Rust 的所有权和生命周期保证 - **统一 API**: 一套代码跑遍所有平台 ### 快速开始 (60秒) ```bash # 1. 安装 Rust (1.80+) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 2. 克隆示例 git clone https://github.com/gfx-rs/wgpu && cd wgpu # 3. 运行原生 Demo cargo run --bin wgpu-examples -- hello-triangle # 4. 运行 Web 版本 (相同代码!) cargo xtask run-wasm ``` ### 推荐教程 | 教程 | 链接 | 特点 | |------|------|------| | **Learn WGPU** | https://sotrh.github.io/learn-wgpu/ | 最系统的中文教程 | | **Learn WebGPU (C++)** | https://eliemichel.github.io/LearnWebGPU/ | 也适用于理解 wgpu 概念 | | **官方 Examples** | https://wgpu.rs/examples/ | 交互式示例 | | **Beginner Guide** | https://zdgeier.com/wgpuintro.html | 零基础入门 | ### wgpu 相关项目 | 项目 | 描述 | |------|------| | **wgpu** | 官方 Rust 实现 (github.com/gfx-rs/wgpu) | | **naga** | 着色器翻译器 (WGSL/GLSL/SPIR-V) | | **deno_webgpu** | Deno 运行时的 WebGPU 支持 | | **bevy** | Rust 游戏引擎 (使用 wgpu) | | **iced** | Rust GUI 框架 (使用 wgpu) | --- ## 🐹 Go + WebGPU 开发 ### Go WebGPU 方案 #### 1. go-webgpu (FFI 绑定) 使用纯 Go FFI 绑定 wgpu-native,**无需 CGO**。 **架构:** ``` 你的 Go 应用 ↓ go-webgpu (Zero CGO, Pure Go FFI) ↓ wgpu-native (Rust WebGPU) ↓ Vulkan / Metal / DX12 / OpenGL ``` **快速开始:** ```go package main import ( "log" "github.com/go-webgpu/webgpu" ) func main() { // 初始化 if err := webgpu.Init(); err != nil { log.Fatal(err) } // 创建实例 instance, err := webgpu.CreateInstance(nil) if err != nil { log.Fatal(err) } defer instance.Release() // 请求适配器 adapter, err := instance.RequestAdapter(nil) if err != nil { log.Fatal(err) } defer adapter.Release() // 请求设备 device, err := adapter.RequestDevice(nil) if err != nil { log.Fatal(err) } defer device.Release() log.Println("WebGPU 初始化成功!") } ``` **链接:** https://pkg.go.dev/github.com/go-webgpu/webgpu #### 2. GoGPU (纯 Go 实现) 如果你想要 **100% 纯 Go** 的 WebGPU 实现(无原生依赖),可以查看 GoGPU 项目: | 项目 | 描述 | |------|------| | **gogpu/wgpu** | 纯 Go WebGPU 实现 | | **gogpu/naga** | 纯 Go 着色器编译器 (WGSL/SPIR-V) | | **gogpu/gogpu** | 高级 GPU 计算框架 | | **gogpu/gg** | 纯 Go 图形库 | **链接:** https://github.com/gogpu ### wgpu vs WebGPU (浏览器) 选择指南 | 特性 | wgpu (Rust) | WebGPU (浏览器) | |------|-------------|-----------------| | **运行环境** | 原生桌面 + Web | 浏览器 | | **语言** | Rust | JavaScript/TypeScript | | **性能** | 原生性能 | 浏览器沙盒内 | | **部署** | 独立应用 | Web 页面 | | **文件访问** | 完整访问 | 受限于浏览器安全 | **选择 wgpu (Rust) 如果:** - 需要最高性能 - 开发桌面应用 - 需要文件系统访问 - 喜欢 Rust 的类型安全 **选择浏览器 WebGPU 如果:** - 需要即开即用 - 跨平台 Web 部署 - 与 Web 生态集成 - 快速原型开发 --- *补充内容时间:2026-03-07 | 小凯*