WebGPU の新機能(Chrome 142)

François Beaufort
François Beaufort

公開日: 2025 年 10 月 22 日

テクスチャ形式のサポート機能を拡張

新しい 「texture-formats-tier1」 GPU 機能により、デベロッパーは既存のコンテンツを WebGPU の低機能に合わせて書き直すことなく、Web に移植できます。レンダリング アタッチメント、ブレンド可能、マルチサンプリング機能、"read-only" または "write-only" ストレージ テクスチャ アクセスを備えた新しい "r16unorm""r16snorm""rg16unorm""rg16snorm""rgba16unorm""rgba16snorm" テクスチャ形式をサポートしています。また、レンダリング アタッチメント、ブレンド可能、マルチサンプリング、解決機能を持つ既存の "r8snorm""rg8snorm""rgba8snorm" テクスチャ形式も許可します。"read-only" または "write-only" ストレージ テクスチャ アクセスでは、より多くのテクスチャ形式を使用することもできます。

新しい 「texture-formats-tier2」 GPU 機能により、特定の形式で "read-write" ストレージ テクスチャにアクセスできるようになりました。これは、Unreal Engine をウェブに移植するなどのプロジェクトで重要な機能です。デバイスの作成時に "texture-formats-tier2" を有効にすると、"texture-formats-tier1" も自動的に有効になります。

次のスニペットと chromestatus エントリをご覧ください。

const adapter = await navigator.gpu.requestAdapter();

const requiredFeatures = [];
if (adapter.features.has("texture-format-tier1")) {
  requiredFeatures.push("texture-format-tier1");
}
if (adapter.features.has("texture-format-tier2")) {
  requiredFeatures.push("texture-format-tier2");
}
const device = await adapter.requestDevice({ requiredFeatures });

// Later on, when dealing with "r8unorm" texture formats for example...
if (device.features.has("texture-format-tier2")) {
  // Use "read-write" storage texture access...
} else if (device.features.has("texture-format-tier1")) {
  // Use "read-only" or "write-only" storage texture access...
} else {
  // Fallback: Use another texture format...
}

Intel の皆様、ご協力ありがとうございました。

WGSL のプリミティブ インデックス

primitive_index は、フラグメント シェーダーで処理されている現在のプリミティブ(点、線、三角形など)を一意に識別する組み込みの WGSL 値です。0 から始まり、プリミティブが処理されるたびに 1 ずつ増加し、インスタンスが描画されるたびに 0 にリセットされます。

"primitive-index" 機能が GPUAdapter で利用可能な場合は、この機能を持つ GPUDevice をリクエストして WGSL でプリミティブ インデックスのサポートを取得し、enable primitive_index; を使用して WGSL コードでこの拡張機能を明示的に有効にします。有効にすると、フラグメント シェーダーで primitive_index 組み込み整数値を使用して、プリミティブごとのデータにアクセスしたり、レンダリングされる個別の幾何学的形状ごとに異なるロジックを実行したりできます。

次のコード スニペットは、2 番目のプリミティブを赤で、他のすべてのプリミティブを青でレンダリングするフラグメント シェーダーを示しています。

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("primitive-index")) {
  throw new Error("Primitive index support is not available");
}
// Explicitly request primitive index support.
const device = await adapter.requestDevice({
  requiredFeatures: ["primitive-index"],
});

const fragmentShaderModule = device.createShaderModule({ code: `
  enable primitive_index;

  @fragment
  fn main(@builtin(primitive_index) i : u32) -> @location(0) vec4f {
    if (i == 1) {
      return vec4f(1, 0, 0, 1);
    }
    return vec4f(0, 1, 0, 1);
  }`,
});
// Send the appropriate commands to the GPU...

詳しくは、プリミティブ選択のサンプルchromestatus エントリをご覧ください。

3D ティーポット モデルの三角形は、プリミティブ インデックス値に基づいて色分けされています。
「プリミティブ インデックス」モードの Primitive Picking サンプル。

Dawn のアップデート

ビルドするモノリシック ライブラリのタイプを処理するために使用される DAWN_BUILD_MONOLITHIC_LIBRARY CMake 変数のデフォルト値が OFF から STATIC に変更され、デフォルトで libwebgpu* ファイルが生成されるようになりました。

Dawn で、wgpu::Surface の構成時に wgpu::PresentMode::Undefined のデフォルトが適切に処理されるようになりました。問題 441410668 をご覧ください。

ここでは、主なハイライトの一部のみを取り上げます。コミットの一覧をご覧ください。

WebGPU の新機能

WebGPU の新機能シリーズで取り上げたすべての内容のリスト。

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113