wgpuはRustで書かれたクロスプラットフォームなグラフィックスAPIです。VulkanやMetal、Direct3D12、OpenGLといったネイティブAPIの上で動作し、WebAssembly上ではWebGPUやWebGL2もサポートしています。WebGPU標準に基づいており、Firefox、Servo、DenoといったプロジェクトでのWebGPU実装の中核として利用されています。
本日 (2025-04-11)、wgpu v25.0.0がリリースされました。wgpuメンテナーのSirflankalotさんがRedditでAMA(Ask Me Anything)として質問に答えていましたので紹介します。
リリースの主な変更点
まずは、v25.0.0での主な変更点を簡単に紹介します。
1. HashMapがAPIから削除
PipelineCompilationOptions::constants
とShaderSource::Glsl::defines
が、HashMapの代わりにキーと値のペアのスライスを受け取るようになりました。これはno_std
サポートを準備し、どのhashmap hasherを使うかなどを実装の詳細として保持できるようにするため、とのことです。
let fragment = wgpu::FragmentState {
compilation_options: wgpu::PipelineCompilationOptions {
constants: &[("some_factor".to_owned(), 0.1234)].into(),
..Default::default()
},
// ...
};
2. すべてのバックエンドが機能フラグ化
vulkan
とgles
のバックエンドが無効化可能になりました。default-features = false
を使用している場合は、明示的に必要なバックエンドを指定する必要があります:
# 変更後
wgpu = { version = "25", default-features = false, features = ["metal", "wgsl", "webgl", "vulkan", "gles"] }
3. device.poll
APIの改良
poll
APIが改良され、ポーリングが内部タイムアウト制限に達したときにエラーを返せるようになりました。Maintain
がPollType
に名前変更され、より詳細な情報が提供されるそうです。
// 変更後
device.poll(wgpu::PollType::Poll).unwrap();
4. デュアルソースブレンディング機能の改良
WebGPU仕様の拡張機能として追加されたデュアルソースブレンディングに対応し、シェーダー構文が更新されました:
struct FragmentOutput{
@location(0) @blend_src(0) source0: vec4<f32>,
@location(0) @blend_src(1) source1: vec4<f32>,
}
5. Noopバックエンドの追加
GPUが利用できない環境でも、ダミーのwgpu
デバイスを作成できるようになりました。これはグラフィックスリソースを管理するコードのテストに役立ちます。
チェンジログに載っていない隠れた変更
「今回のリリースで最もクールな機能は何か」との質問に、メンテナーのSirflankalotさんは次のように回答しています:
実はチェンジログに書き忘れてしまったのですが、nagaでの
f16
型(wgsl、spirv、glslシェーダー)のサポートです🤦
今後の展望
次の1年で期待される機能について、Sirflankalotさんは以下のように述べています:
舞台裏では多くの素晴らしい作業が進行中です。自分自身はbindlessサポートの改善に取り組んでいますし、VecVecさんはレイトレーシングサポートを向上させ、SupaMaggieさんはメッシュシェーダーのフレームワークを構築しています。やるべきことはたくさんありますが、wgpuの未来は明るいです。
GPUプログラミングの学習リソース
初心者がwgpuを使ってグラフィックスプログラミングを学ぶべきかという質問に対して、以下のリソースが推奨されました:
- webgpufundamentals.org - JavaScriptでWebGPU APIを学ぶサイト
- learn-wgpu - wgpuを直接学ぶためのリソース
- learnopengl.com - グラフィックス理論を学ぶのに役立つサイト
JavaScriptのチュートリアルを読んでから、Rustに適用することが推奨されています。
私も学び直そうと思います
非ゲーム用途でのGPU活用
大規模な行列演算にGPUを利用できるかという質問に対して、Burnというクレートが推奨されました。Burnはニューラルネットワーク機能に限らず、テンソルライブラリとしても使用でき、wgpu、CUDA、ROCm、さらにはndarrayでも動作します。
no_stdサポートと組み込み応用
wgpuが組み込みアプリケーションで使用可能になるかという質問に対して、Sirflankalotさんは以下のように回答しました:
いくつか大きな注意点はありますが、可能になります。最初はglesバックエンドのみ、その後おそらくvulkanバックエンドがno_stdサポートされる予定です。それには、それらのグラフィックスAPIが存在するプラットフォームが必要です。現在のno_stdサポート推進の主な理由は、
wasm32-unknown-unknown
とは異なり、no_stdであるwasm32v1-none
ターゲットをサポートすることです。
テスト機能の紹介
AMAsの中で、Sirflankalotさん自身が誇りに思っているwgpuのテスト機能についての言及もありました:
私たちのプロセスで興味深いのはテストスイートです。通常のテストに加えて、カスタムテストハーネスを使用するGPUテストフレームワークがあり、各
wgpu
ベースのテストをシステム内の各GPUで自動的に実行します。これにより、複数のベンダーからのGPUを持つマシンでも、すべてのGPUで動作することを簡単に確認できます。これは私自身が書いたもので、誇りに思っています。
まとめ
wgpu v25.0.0では、APIの簡素化、バックエンドの柔軟化、パフォーマンスの改善、バグ修正など多岐にわたる変更が行われました。さらなる改善が進行中であり、bindlessサポート、レイトレーシング、メッシュシェーダーなどで今後の発展が期待されます。
ゲーム開発だけでなく、大規模な行列演算や機械学習などの分野でも活用の可能性があり、今後のno_stdサポートにより組み込み環境での応用も期待されています。
参考リンク
- wgpu公式リポジトリ
- v25.0.0リリースノート
- RedditでのAMAスレッド
- webgpufundamentals.org
- learn-wgpu
- Burn - wgpuを活用できるテンソルライブラリ