
WebGPU 终于登陆 Web

我们激动地宣布,Evergine 现在可以在 Web 上使用 WebGPU 运行。
这个新的实验性模板允许开发者直接在现代浏览器中构建和运行 Evergine 应用程序,充分利用下一代 WebGPU API。借助.NET 8和Emscripten工具链,此版本首次为 Evergine 在 Web 上引入了 GPU 加速渲染和计算能力,实现了更高的性能、先进的视觉效果以及跨平台的统一工作流。
什么是 WebGPU?
WebGPU 是一种现代图形 API,为开发者提供对 GPU 的底层访问,从而实现高级渲染技术和计算能力。
与基于 OpenGL(该 API 现已弃用,转而采用 Vulkan 和 Metal 等更高效的替代方案)的 WebGL 不同,WebGPU 通过提供更精简、更高效的图形编程接口,解决了传统 API 的局限性。

WebGPU 相较于 WebGL 的一个关键优势是其对计算着色器的支持。此能力增强了重型应用程序的性能,并为创建复杂模拟开辟了新的可能性。WebGPU 的设计考虑了现代编程范式,使开发者能够编写既高性能又可维护的代码。
当前支持状态
WebGPU 的浏览器覆盖范围正在迅速扩大,有望成为 Web 上下一代图形和计算应用的关键标准。您可以在此处查看当前的浏览器支持和使用情况:caniuse.com – WebGPU。
- Chrome 和 Edge 自版本 113 起完全支持 WebGPU。
- Android Chrome 也在大多数现代设备上提供原生支持。
- Safari(macOS 和 iOS 17+)现已内置 WebGPU 支持。自 Safari 26.0 起,WebGPU 已默认启用。
- Firefox 提供部分支持,并正在积极努力实现全面实施。

当以浏览器市场份额为权重绘制图表时,可以清楚地看到,绝大多数用户已被 WebGPU 支持所覆盖:

此 Evergine 版本中的变化
此前我们专注于 WebGPU Native(桌面端)。现在,Evergine 通过 .NET 8 附带的 WASM/Emscripten 工具链,支持了 Web 端 的 WebGPU。实际上这意味着:
- Evergine 项目可以构建为 WebAssembly,并在浏览器中运行,同时调用 Emscripten 暴露的 WebGPU API。
- 更新了 WebGPU.NET(Evergine 的底层绑定),将 Emscripten 运行时提供的 WebGPU C API 暴露给托管 C#。
Evergine 中的集成基础
WebGPU.NET,WebGPU 的 C# 绑定
我们更新了专为 Evergine 集成 WebGPU 而打造的 C# 绑定库 WebGPU.NET,公开了由 Emscripten 提供的 API 头文件,从而提升了在 Web 浏览器中的兼容性。
使用 Naga 进行 HLSL 到 WGSL 的着色器转换
为保持着色器开发的一致性,我们正在利用 Naga 实现一个从 HLSL 到 WGSL 的转换层。在此版本中,我们已将库版本更新至 26.0.0,从而支持更复杂的着色器转换,这些转换在早期版本中曾导致错误。
旧版本(22.1.0)中使用的 Naga 版本在从 SPIR-V 转换时会产生多处不一致错误,导致在 WebGPU 中使用复杂着色器时不稳定。
当前实验阶段
尽管仍处于实验阶段,此集成已支持核心功能:标准网格和材质渲染、蒙皮、变形目标以及复杂的计算任务。这些功能使开发者能够构建动态、视觉效果丰富的应用程序,充分利用现代 GPU 的能力。
开始使用 WebGPU 实验模板
要开始使用实验性的 WebGPU 集成,您可以在 Evergine 中创建一个新的 vanilla 项目,并像往常一样添加 WebGPU 配置文件:

已知限制
使用实验性 WebGPU Web 模板时需要注意的一些重要事项:
- RGBA32Float HDR 纹理:大多数移动 GPU/浏览器(Chrome)不支持 32 位浮点 RGBA 纹理,因此许多手机和平板电脑上无法使用真正的 HDR 纹理。
- 深度裁剪控制/阴影伪影:.NET 8 附带的 Emscripten 工具链未暴露深度裁剪控制,这可能导致阴影贴图出现伪影(尤其是来自实际位于相机后方的物体的阴影)。
- GPU 粒子与后处理:高级后处理效果和 GPU 粒子系统目前在 WebGPU 中尚不支持,但我们希望在未来版本中提供支持。
