WGSL でのクリップの距離
クリップ距離を使用すると、頂点ステージの出力でユーザー定義の半空間を使用して、プリミティブのクリップ ボリュームを制限できます。独自のクリッピング プレーンを定義すると、WebGPU シーンに表示される内容をより細かく制御できます。この手法は、可視化を正確に制御することが重要な CAD ソフトウェアなどのアプリケーションで特に便利です。
GPUAdapter で "clip-distances"
機能を使用できる場合は、この機能を搭載した GPUDevice をリクエストして WGSL でクリップ距離のサポートを取得し、enable clip_distances;
を使用して WGSL コードでこの拡張機能を明示的に有効にします。有効にすると、頂点シェーダーで clip_distances
組み込み配列を使用できるようになります。この配列には、ユーザー定義のクリップ プレーンまでの距離が保持されます。
- クリップ距離が 0 の場合、頂点は平面上にあります。
- 距離が正の場合、頂点はクリップの半空間(保持する側)内にあります。
- 距離が負の場合、頂点はクリップ半空間(破棄する側)の外側にあります。
次のスニペット、chromestatus のエントリ、問題 358408571 をご覧ください。
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
requiredFeatures: ["clip-distances"],
});
const vertexShaderModule = device.createShaderModule({ code: `
enable clip_distances;
struct VertexOut {
@builtin(clip_distances) my_clip_distances : array<f32, 1>,
@builtin(position) my_position : vec4f,
}
@vertex fn main() -> VertexOut {
var output : VertexOut;
output.my_clip_distances[0] = 1;
output.my_position = vec4f(0, 0, 0, 1);
return output;
}
`,
});
// Send the appropriate commands to the GPU...
GPUCanvasContext getConfiguration()
構成辞書を使用して GPUCanvasContext configure()
が呼び出されると、GPUCanvasContext getConfiguration()
メソッドを使用してキャンバス コンテキストの構成を確認できます。これには、device
、format
、usage
、viewFormats
、colorSpace
、toneMapping
、alphaMode
のメンバーが含まれます。これは、粒子(HDR)のサンプルに示すように、ブラウザが HDR キャンバスをサポートしているかどうかを確認するなどのタスクに役立ちます。次のスニペット、chromestatus のエントリ、問題 370109829 をご覧ください。
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
// Configure the canvas for HDR.
context.configure({
device,
format: "rgba16float",
toneMapping: { mode: "extended" },
});
const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
// The browser supports HDR canvas.
// Warning! The user still needs a HDR display to enjoy HDR content.
}
ポイント プリミティブとライン プリミティブに深度バイアスを設定しないでください
以前に発表されたとおり、WebGPU 仕様では、レンダリング パイプラインのトポロジが線または点のタイプである場合に、depthBias
、depthBiasSlopeScale
、depthBiasClamp
をゼロ以外の値に設定すると、検証エラーになります。問題 352567424 をご覧ください。
サブグループの包括的スキャンの組み込み関数
サブグループの試験運用の一環として、問題 361330160 で次のサブグループ組み込み関数が追加されました。
subgroupInclusiveAdd(value)
: サブグループ内のすべてのアクティブな呼び出しvalue
の包括的なスキャンの合計を返します。subgroupInclusiveMul(value)
: サブグループ内のすべてのアクティブな呼び出しvalue
の包括的なスキャン乗算を返します。
マルチドロー間接の試験運用版サポート
マルチ描画間接 GPU 機能を使用すると、1 つの GPU コマンドで複数の描画呼び出しを発行できます。これは、パーティクル システム、インスタンス化、大きなシーンなど、多数のオブジェクトをレンダリングする必要がある状況で特に便利です。drawIndirect()
メソッドと drawIndexedIndirect()
GPURenderPassEncoder メソッドでは、GPU バッファの特定の領域から一度に発行できるドローコールは 1 つだけです。
この試験運用版の機能が標準化されるまでは、Chrome で利用できるようにするには、chrome://flags/#enable-unsafe-webgpu
で「安全でない WebGPU のサポート」フラグを有効にしてください。
GPUAdapter で利用可能な "chromium-experimental-multi-draw-indirect"
非標準の GPU 機能を使用して、この機能を含む GPUDevice をリクエストします。次に、GPUBufferUsage.INDIRECT
の使用方法で GPUBuffer を作成し、ドローコールを格納します。後で新しい multiDrawIndirect()
メソッドと multiDrawIndexedIndirect()
GPURenderPassEncoder メソッドで使用して、レンダリング パス内でドロー呼び出しを発行できます。次のスニペットと 問題 356461286 をご覧ください。
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});
// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
3, 1, 0, 0, // First draw call
3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
size: drawData.byteLength,
usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);
// Create a render pipeline, a vertex buffer, and a render pass encoder...
// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();
シェーダー モジュールのコンパイル オプションの厳密な数学
シェーダー モジュールのコンパイル中に厳密な数学を有効または無効にできるように、GPUShaderModuleDescriptor にブール値 strictMath
開発者オプションが追加されました。これは、chrome://flags/#enable-webgpu-developer-features
で「WebGPU のデベロッパー向け機能」フラグの設定後で使用できます。つまり、開発時にのみ使用することを目的とする機能です。問題 42241455 をご覧ください。
現在、このオプションは Metal と Direct3D でサポートされています。厳密な演算が無効になっている場合、コンパイラは次のようにシェーダーを最適化することがあります。
- NaN 値と Infinity 値の可能性を無視します。
- -0 を +0 として扱う。
- 除算を、より高速な逆数による乗算に置き換えた。
- 結合法則と分配法則に基づく演算の並べ替え。
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const code = `
// Examines the bit pattern of the floating-point number to
// determine if it represents a NaN according to the IEEE 754 standard.
fn isNan(x : f32) -> bool {
bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
return ones_exp && non_zero_sig;
}
// ...
`;
// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });
GPUAdapter requestAdapterInfo() を削除
GPUAdapter info
属性を使用して GPUAdapterInfo を同期的に取得できるため、GPUAdapter requestAdapterInfo()
非同期メソッドは冗長です。そのため、非標準の GPUAdapter requestAdapterInfo()
メソッドが削除されました。削除の意向をご覧ください。
夜明けの最新情報
tint_benchmark
実行可能ファイルは、シェーダーを WGSL から各バックエンド言語に翻訳するコストを測定します。詳しくは、新しいドキュメントをご覧ください。
以下に、主なハイライトをいくつかご紹介します。コミットの一覧(すべて網羅)をご覧ください。
WebGPU の新機能
「WebGPU の新機能」シリーズに記載されている全内容のリスト。
Chrome 131
- WGSL で距離をクリップする
- GPUCanvasContext getConfiguration()
- ポイント プリミティブとライン プリミティブに深度バイアスを設定しないでください
- サブグループの包括的スキャンの組み込み関数
- マルチドロー間接の試験運用版サポート
- シェーダー モジュールのコンパイル オプションの厳密な数学
- GPUAdapter requestAdapterInfo() を削除する
- Dawn の最新情報
Chrome 130
Chrome 129
Chrome 128
- サブグループのテスト
- 線と点の深度バイアスの設定を非推奨とする
- 未キャプチャ エラーの DevTools の警告を PreventDefault で非表示にする
- WGSL はまずサンプリングを補間
- Dawn の最新情報
Chrome 127
Chrome 126
- maxTextureArrayLayers の上限を引き上げる
- Vulkan バックエンドのバッファ アップロードの最適化
- シェーダーのコンパイル時間の改善
- 送信されるコマンド バッファは一意である必要があります
- Dawn の最新情報
Chrome 125
Chrome 124
Chrome 123
- WGSL での DP4a 組み込み関数のサポート
- WGSL でのポインタ パラメータの制限なし
- WGSL でのコンポジットの参照解除の構文糖衣
- ステンシルと深度アスペクトの読み取り専用状態を分離
- Dawn の最新情報
Chrome 122
Chrome 121
- Android で WebGPU をサポート
- Windows でシェーダーのコンパイルに FXC ではなく DXC を使用する
- コンピューティング パスとレンダリング パスのタイムスタンプ クエリ
- シェーダー モジュールのデフォルトのエントリ ポイント
- GPUExternalTexture の色空間として display-p3 をサポート
- メモリヒープ情報
- Dawn の最新情報
Chrome 120
Chrome 119
Chrome 118
copyExternalImageToTexture()
での HTMLImageElement と ImageData のサポート- 読み取り / 書き込みストレージ テクスチャと読み取り専用ストレージ テクスチャの試験運用版サポート
- 夜明けの最新情報
Chrome 117
- 頂点バッファを設定解除する
- バインド グループの設定解除
- デバイスが失われた場合の非同期パイプライン作成のエラーをミュートする
- SPIR-V シェーダー モジュールの作成の更新
- デベロッパー エクスペリエンスの向上
- 自動生成されたレイアウトを使用したキャッシュ パイプライン
- Dawn の最新情報
Chrome 116
- WebCodecs の統合
- GPUAdapter
requestDevice()
によって返された紛失したデバイス importExternalTexture()
が呼び出された場合に動画の再生をスムーズにする- 仕様への準拠
- デベロッパー エクスペリエンスの向上
- Dawn の最新情報
Chrome 115
- サポートされている WGSL 言語拡張機能
- Direct3D 11 の試験運用版サポート
- AC 電源でデフォルトで個別の GPU を取得する
- デベロッパー エクスペリエンスの向上
- Dawn の最新情報
Chrome 114
- JavaScript を最適化する
- 未構成のキャンバスで getCurrentTexture() を呼び出すと InvalidStateError がスローされる
- WGSL の更新
- Dawn の最新情報