Web 向けの3D の GPU 描画コンテキストお取り扱いライブラリーの2020-07時点のメモ: ES 系, Unity, Unreal Engine, Rust 系
note: 2D 系(eg. phaser, ggez, etc. )は今回のメモでは含めていません。
Lang | Library | License | WebGPU | WebGL | native | ES & wasm |
---|---|---|---|---|---|---|
ES | babylon.js | Apache-2.0 | Ready | 2 %a | n/a | pure ES |
ES | three.js (+A-Frame) | MIT(+MIT) | (unknown†1) | 1 + (2) | n/a | pure ES |
ES | playcanvas | MIT | (unknown†2) | 2 %b | n/a | pure ES |
C++ | Unreal Engine | *1 | (unknown) | 1 %c | D3D12, Metal, OpenGL | wasm(Emscripten) |
C# | Unity | *2 | (unknown) | 2 %d | D3D12, Metal, OpenGL | wasm(Emscripten) |
Rust | unrust | Apache-2.0 | (unknown) | 2 | OpenGL | wasm |
Rust | Amethyst(≈rendy≈gfx-hal) | Apache-2.0 or MIT | (unknown; potentially maybe) | (2;potentially) | Vulkan, Metal, OpenGL | wasm(; experimental) |
Rust | harmony | Zlib | (unknown†4; potentially yes) | (2;potentially) | Vulkan, Metal | wasm(; help wanted) |
Rust | oxidator | MIT | (potentially yes) | n/a | Vulkan, D3D12 | wasm(; not yet) |
Rust | piston | MIT | (unknown) | n/a | n/a | n/a |
おまけ: 所感
- pure-ES 系で特に WebGPU を見据える場合は babylon.js で書くのが良さそう
- リッチなエンジン系は…
- Unreal Engine で HTML5 出力は現実的に考えない方がいいです(UE5移行へWebGPUと併せて期待したいけど、期待しないでおいた方がいいかも)
- 豊富なエコシステムやコミュニティーもあるので Unity で WebGL2 バックエンドにするのが現時点だけを見るなら現実的で良いかもしれません
- Web 親和性の点では playcanvas もよいかもしれません
- Rust 系は...
- unrust は現時点で Web へきっちり出力できるたぶん唯一の3D-GPU描画系です
- Amethyst は wasm+GL サポートを開発途中ですが、このメモの作成時点では全ての要素技術にかなり強い技師でも辛うじてバギーながらChromeで動くような動かないような微妙な出力に辿り着ける程度の状態です
- harmony は描画バックエンドのポテンシャル的には WebGPU 対応、 OpenGL 対応により Web 出力できますが、採用する ECS バックエンドやマルチスレッドに最適化しまくっている事から WebWorker の制限と性能の懸念などもあり今の所 Author は Web 出力にそれほど積極的ではないようです。(Webよりエンジンとしての機能実装を進めたい状況でもあります)
- oxidator は RTS ゲームエンジンに特化していますが、 Author も WebGPU での Web 出力は視野にあるようです。いまのところは WebGPU や rust と wasm 処理系の進化、ウェブブラウザーの進化待ちのようです
- piston は Web に興味無さそうです
少なくとも、 Web 向けアプリの 3D-GPU 描画系に現時点で Rust を採用するのはわりとしんどいです。3年後に WebGPU と Rust/wasm 処理系が最高の選択肢になっている可能性はわりと高いとは思いますが、いまはまだしんどいです。 Rust を採用したい場合も、恐らく 3D-GPU 描画系はうまく機能分離し、できるだけ疎結合に近い設計にしつつ、ビジネスロジック部分は Rust で書いて wasm-unknown-unknown ターゲットで wasm を wasm-bindgen で library としてフロントエンドから叩く感じで作っておき、フロントエンドとして GUI系、 3D-GPU 描画系は pure-Web 系またはそれに近い要素技術でカバーするのが現時点では合理的かもしれません。
例えばフロントエンドは React あるいは yew と HTML と ES のライブラリーで GUI を作り、 3D-GPU 描画系は babylon.js を babylon.rs で取り込み、アプリ本体の処理、状態やリソースの管理、Entity-Component-System、などなどは pure-Rust または wasm 対応が面倒ではない範囲の Rust のエコシステムを用いて作り、 wasm-bindgen で .wasm に固めるとか。