WASM 和对 GPU 的访问?

问题描述 投票:0回答:1

我一直在尝试使用 Blazor WASM 来访问大多数 GPU 支持的硬件加速功能,但运气不佳。

我搜索了 Stack Overflow,但没有找到太多特定于 WASM 的相关信息,更具体地说,像我们使用 DirectX(在 Windows 端)一样访问 GPU。我希望找到某种子集,但运气不太好。

我意识到 WASM 应该利用“通用硬件功能”,并且由于代码隔离的性质,WASM 的性能总是会受到一些影响(它永远不会像对 DX 的本机调用那么快) )。话虽如此,有人可以指导我如何通过 WASM 访问加速图形吗?

blazor-webassembly webassembly directx-12
1个回答
3
投票

您可以使用 wgpu-native 的 C# 绑定,如果主机平台运行时支持,它将允许您访问 GPU。

如果您的目标是 Web 浏览器,WebAssembly 二进制文件可以通过浏览器 API(例如 WebGPU 或 WebGL)使用 GPU(目前,您需要一些 Javascript 粘合代码,但计划支持从 WebAssembly 直接访问 Web API,无需 JS 中间人).

如果您的目标是 WASI 在 Web 浏览器之外运行,则需要选择支持 GPU 访问的运行时或开发自己的粘合剂。例如,使用 wasmiwgpu 库的简单 Rust 主机应用程序可以向您的 wasm 应用程序公开 GPU 接口。

顺便说一句,wgpu本身就是一个很棒的库,为 Firefox 的 WebGPU 实现提供支持,但它不仅限于 Web 环境;您可以用它部署本机软件。例如,Bevy 游戏引擎将其用作本机运行的游戏的 GPU 抽象层。

他们的网站上还有一些 WebAssembly 工作示例,通过 WebAssembly 编译的代码使用 WebGPU,并回退到 WebGL 2。

虽然 WebGPU 规范仅支持一种语言 WGSL,但 wgpu 库支持多种着色语言,因此您可以根据需要使用 HLSL 或 GLSL。该库将为主机平台选择最适合的语言,即用于 Windows 的 DirectX、用于 Mac/iOS 的 Metal、用于 Linux/Android 的 Vulkan 以及用于 Web 的 WebGPU/WebGL2。

关于评论中的问题:

WebGL 与 OpenGL ES 2.0 的功能大致对应,而 WebGPU 则以具有较低级别访问权限的现代 GPU 为目标,因此您可以访问计算着色器等现代功能。它是 DirectX12、Metal 和 Vulkan 的薄包装。

该规范仍在制定中,尚未成为标准,但它们已经相对稳定了一段时间,Chrome 今年早些时候推出了 WebGPU 支持。据我所知,网格着色器尚不受支持,但规范包括语言扩展的概念,因此它们最终可能会可用。

其他可能对您有用的链接:

这篇关于 WebGPU 的优秀文章包含一些有关使用 WebAssembly 与 WebGPU 交互的资源以及 C++ 和 Rust 中的示例实现。

WebAssembly 路线图:他们目前正在致力于实现垃圾收集,这将能够更好地与更高级别的垃圾收集语言(例如 C#)集成。

© www.soinside.com 2019 - 2024. All rights reserved.