| WebGPU シェーディング言語 (WGSL) | |
|---|---|
| 最新バージョン | W3C 候補勧告(2025年現在) |
| 組織 | |
| 委員会 |
|
| ドメイン | |
WebGPUシェーディング言語(WGSL、インターネットメディアタイプ:)は、高水準シェーディング言語text/wgslであり、ウェブ上のWebGPU APIの規範的なシェーダ言語である。 [ 1 ] [ 2 ] WGSLの構文はRustの影響を受けており、強力な静的検証、明示的なリソースバインディング、およびブラウザでの安全な実行を念頭に置いて移植性を考慮して設計されている。[ 1 ]ウェブコンテキストでは、WebGPU実装はWGSLソースを受け入れ、プラットフォーム固有の中間形式(たとえば、ユーザーエージェント経由でSPIR-V、DXIL、またはMSL)へのコンパイルを実行するが、そのようなバックエンドはウェブコンテンツに公開されない。[ 2 ] [ 3 ]
歴史と背景
ウェブ上のグラフィックスでは、歴史的にWebGLが使用され、シェーダーはGLSL ESで記述されていました。アプリケーションがより現代的なGPU機能と、計算およびグラフィックスパイプラインのより細かい制御を求めるようになったため、W3CのGPU for the Webコミュニティグループとワーキンググループは、ウェブプラットフォームに適した安全で移植性の高いモデルを提供するために、WebGPUとその付属シェーディング言語であるWGSLを作成しました。[ 4 ] [ 2 ] WGSLは、人間が読める形式で、従来のシェーディング言語によくある未定義の動作を回避し、WebGPUのリソースおよび検証モデルと密接に連携するように開発されました。[ 1 ]
設計目標
WGSL の設計では次の点を重視しています。
- ウェブセキュリティ制約に適した安全性と決定論(広範な静的検証と明確に定義されたセマンティクス)。[ 1 ]
- WebGPUと共有される抽象リソースモデルを介して、多様なGPUバックエンド間での移植性。[ 2 ]
- 可読性と明示性(プリプロセッサなし、暗黙の変換が最小限、アドレス空間とバインディングが明示的)。[ 1 ]
- 使い慣れたC/Rust風の構文を維持しながら、最新のGPU機能(コンピューティング、ストレージバッファ、テクスチャ、アトミック)との整合性を実現。[ 1 ]
言語の概要
型と値
コアとなるスカラー型にはbool、、、、などがあります。浮動小数点要素型には、ベクトル(例:、、)と行列(最大4×4)が利用可能です。オプションi32(半精度)はWebGPU機能によって有効化できますが、その可用性は実装に依存します。[ 1 ] [ 2 ]アトミック型(、)は、修飾されたアドレス空間で限定されたアトミック操作をサポートします。[ 1 ]u32f32vec2vec3vec4f16atomic<i32>atomic<u32>
変数とアドレス空間
let変数は(不変)、var(可変)、またはconst(コンパイル時定数) で宣言されます。記憶域クラス (アドレス空間) には、、、、、およびfunctionがあり、必要に応じてまたはアクセスが可能です。 [ 1 ] WGSL は明示的なレイアウトと配置の規則を定義しています。 、、などの属性は、バッファの相互運用性のためにデータレイアウトを制御します。[ 1 ]privateworkgroupuniformstoragereadread_write@align@size@stride
関数と制御フロー
関数は明示的なパラメータと戻り値の型を使用します。制御フローにはif、、、、、および構文(/ を使用switch)が含まれます。再帰は許可されていません。エントリポイントの呼び出しグラフは非循環でなければなりません。[ 1 ]forwhileloopbreakcontinue
エントリポイントと属性
@vertexシェーダーは、、、@fragmentまたはを使用してステージエントリポイントを定義します@compute。属性は@group、、@binding(リソースバインディング)、@location(ユーザー定義I/O)、@builtin(ステージ組み込み関数やなどposition)global_invocation_id、、@interpolateおよびなどのバインディングとインターフェースに注釈を付けます@workgroup_size。[ 1 ]
リソース
WGSLはバッファ(uniform、storage)、テクスチャ(サンプリング、ストレージ、マルチサンプリングのバリエーション)、サンプラー(フィルタリング/非フィルタリング/比較)を公開しています。バインディングモデルは、グループとバインディングと呼ばれる記述子セットによって明示的に定義され、WebGPUのパイプラインレイアウトモデルと一致しています。[ 2 ] [ 1 ]
コンパイルと検証
ブラウザはWGSLをプラットフォームに適した表現とネイティブドライバ形式にコンパイルします。特定のコンパイルパイプラインはウェブコンテンツからは観察できません。[ 2 ] WGSLソースは厳密な解析と静的検証を受け、WebGPUは境界外メモリの危険を回避するために堅牢なリソースアクセスルールを適用し、実装間で予測可能な動作に貢献します。[ 2 ] [ 1 ]
シェーダーステージ
WGSLは、頂点、フラグメント、計算の3つのパイプラインステージをサポートしています。[ 1 ]
頂点シェーダー
頂点シェーダは頂点ごとの入力を変換し、組み込み関数に書き込まれたクリップ空間の位置を含むラスタライズ用の値を生成しますposition。[ 1 ]
例
/* MVP 行列によって位置を変換し、色を渡します。 */struct VertexInput { @location ( 0 ) position : vec3f , // vec3f は vec3<f32> の別名です@location ( 1 ) color : vec3f , };構造体VertexOutput { @builtin ( position ) clip_position : vec4f , @location ( 0 ) color : vec3f , };@group ( 0 ) @binding ( 0 ) var <uniform> mvp : mat4x4f ;@vertex fn main ( v_in : VertexInput ) -> VertexOutput { var v_out : VertexOutput ; v_out . clip_position = mvp * vec4f ( v_in . position , 1.0 ); v_out . color = v_in . color ; return v_out ; }フラグメントシェーダー
フラグメントシェーダーはフラグメントごとに実行され、カラーアタッチメントに書き込まれるカラー(およびオプションで深度)出力を計算します。[ 1 ]
例
/* 不透明なアルファを持つ補間色を書き込みます。 */@fragment fn main ( @location ( 0 ) color : vec3f ) -> @location ( 0 ) vec4f { return vec4f ( color , 1.0 ); }半精度 ( vec4h、 の省略形) が必要な場合は、コードの先頭にステートメントを記述する必要があります。 vec4<f16>enablef16;
計算シェーダー
コンピュートシェーダーはワークグループで実行され、汎用GPU計算に使用されます。[ 1 ]
例
/* 入力バッファの要素を出力バッファに 2 倍します。 */構造体パラメータ{要素数: u32 , };@group ( 0 ) @binding ( 0 ) var <ストレージ、読み取り> in_data :配列<f32> ; @group ( 0 ) @binding ( 1 ) var <ストレージ、読み取り書き込み> out_data :配列<f32> ; @group ( 0 ) @binding ( 2 ) var <ユニフォーム> params : Params ;@compute @workgroup_size ( 64 ) fn main ( @builtin ( global_invocation_id ) gid : vec3 < u32 > ) { let idx : u32 = gid . x ; if ( idx >= params . element_count ) { return ; } out_data [ idx ] = in_data [ idx ] * 2.0 ; }GLSLとHLSLの違い
従来のシェーディング言語と比較すると、WGSL は次のようになります。
- プリプロセッサを省略し、明示的な型と変換を必要とする。[ 1 ]
- WebGPUのモデルに準拠した明示的なアドレス空間とバインディングアノテーションを使用します。[ 2 ]
- 他のシェーディング言語でよくある未定義の動作を避けるために厳密な検証を強制します。[ 1 ]
- ポータブルでウェブに重点を置いた機能セットを定義します。16ビット型やその他の機能はオプトインであり、デバイスの機能に依存する場合があります。[ 2 ]
参照
その他のシェーディング言語
- GLSL、OpenGL のシェーディング言語
- HLSL、Microsoft の Direct3D 用シェーディング言語
- Metal シェーディング言語、Apple の Metal 用シェーディング言語
- Cg、NVIDIAのCベースのシェーディング言語
- Open Shading Language、オフラインレンダリングシェーディング言語
参考文献
外部リンク
- WebGPU シェーディング言語仕様– 公式 W3C 仕様
- WebGPU仕様– WebGPU API仕様
- GPU for the WebリポジトリのWGSL – WGSL仕様の開発ディレクトリ