Rootscope
HomeTechnology › WebGPU 完全入門 ― 2025 年版ブラウザ

WebGPU 完全入門 ― 2025 年版ブラウザ

2025.05.10 by

2025 Q2 ついに Chrome 124 / Firefox Nightly /
Edge 124 で WebGPU がデフォルト有効になりました。
WebGL 世代の “fixed-function” を卒業し、WGSL による
ネイティブライクなシェーダー記述・Compute Shader
GPGPU 処理をブラウザから直接叩けます。
本記事では 基本概念 → 三角形描画 → Compute ベンチ
の順に “砂場” を用意し、WebGPU の威力を体感しながら学べる構成にしました。

1. なぜ今 WebGPU?

1.1 WebGL との違い

1.2 ブラウザ対応状況 (2025-05-現在)

ブラウザ Version 状態
Chrome / Edge 124+ default-on ✅
Firefox Nightly dev-on
Safari 17 Tech Preview experimental

2. 開発環境セットアップ

2.1 npm テンプレート

# Vite + TypeScript
$ npm create vite@latest webgpu-demo -- --template vanilla-ts
$ cd webgpu-demo
$ npm i @webgpu/types vite-plugin-wasm
$ npm run dev

2.2 TypeScript + @webgpu/types

VS Code は tsconfig.json"types":["@webgpu/types"]
を追加すると API オートコンプリートが利きます。

3. “Hello, Triangle!” ― 最小レンダリング

まずは WebGPU パイプラインの全体像を把握しましょう。

// main.ts (抜粋)
const adapter  = await navigator.gpu.requestAdapter();
const device   = await adapter!.requestDevice();
const context  = canvas.getContext('webgpu');

context.configure({
  device,
  format: navigator.gpu.getPreferredCanvasFormat()
});

const shader = device.createShaderModule({ code: /* wgsl */`
@vertex fn vs(@builtin(vertex_index) i:u32)->@builtin(position) vec4f{
  var pos=array<vec2f,3>(
      vec2f( 0.0, 0.5),
      vec2f(-0.5,-0.5),
      vec2f( 0.5,-0.5)
  );
  return vec4f(pos[i],0.0,1.0);
}
@fragment fn fs()->@location(0) vec4f{
  return vec4f(0.2,0.6,1.0,1.0);
}`});

const pipeline = device.createRenderPipeline({
  layout:'auto',
  vertex:{ module:shader, entryPoint:'vs' },
  fragment:{ module:shader, entryPoint:'fs',
             targets:[{ format:context.getPreferredFormat(adapter!) }]},
  primitive:{ topology:'triangle-list' }
});

function frame(){
  const encoder=device.createCommandEncoder();
  const view=context.getCurrentTexture().createView();
  const pass=encoder.beginRenderPass({ colorAttachments:[{
    view,clearValue:{r:0,g:0,b:0,a:1},loadOp:'clear',storeOp:'store'
  }]});
  pass.setPipeline(pipeline);
  pass.draw(3);
  pass.end();
  device.queue.submit([encoder.finish()]);
  requestAnimationFrame(frame);
}
frame();

4. ⏱️ ベンチマーク:WebGL vs WebGPU

4.1 Ray Marching 1,000× サンプル

# M1 MacBook Air (Chrome 124)
WebGL2  : 24.6 fps
WebGPU  : 60.0 fps (vsync)
CPU 使用率 : 180% → 55%

Compute Shader で 2.4×~3× のフレームレート向上、CPU オフロードで省電力効果も。

5. Compute Shader 応用:リアルタイム画像フィルタ

WGSL で Sobel エッジ検出を 4 行で実装:

// sobel.wgsl (抜粋)
@group(0) @binding(0) var samp : sampler;
@group(0) @binding(1) var src  : texture_2d;
@group(0) @binding(2) var dst  : texture_storage_2d;
@compute @workgroup_size(16,16)
fn main(@builtin(global_invocation_id) gid:vec3u){
  let c = vec2f(textureDimensions(src));
  let uv = (vec2f(gid.xy)+0.5)/c;
  let Gx = array(/* … */);
  let Gy = array(/* … */);
  var sx:f32=0; var sy:f32=0;
  for(var i=0;i<9;i++){
    let col=textureSampleLevel(src,samp,uv+Gx[i]/c,0).r;
    sx+=col*Gx[i].x; sy+=col*Gy[i].y;
  }
  let g = sqrt(sx*sx+sy*sy);
  textureStore(dst,gid.xy,vec4f(g,g,g,1));
}

6. Production Tips

7. Pros / Cons まとめ

✔️ Pros

  • Compute Shader で JS から **GPGPU**
  • タイプセーフ WGSL → バグ減
  • マルチバックエンド (Vulkan/Metal/D3D12) 自動選択

❌ Cons

  • Safari は Tech Preview のみ
  • API 変更が 2025 年中はまだ頻発
  • デバッグエコシステムが発展途上

8. FAQ

Q. WebGL 資産は捨てるべき?
Three.js は WebGPU レンダラを experimental 提供中。既存シーンは
マテリアルを再マッピングすれば多くが移行可能です。
Q. モバイルでの動作は?
Android Chrome 124+ で Vulkan backend が有効。
iOS は Metal Wrapping 実装が今期ロードマップに載っています。

9. まとめ

WebGPU は **“ネイティブ GPU 性能をブラウザへ”** を合言葉に、
Web アプリの表現力と演算能力を一段引き上げます。
今こそ “Hello Triangle” を動かし、次世代フロントエンドの第一歩を踏み出しましょう!

関連記事