
Home
› Technology › 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 との違い
- モダン API:Vulkan / Metal / D3D12 を抽象化
- Compute Shader:GPGPU が標準で可能
- タイプセーフ & モジュール:WGSL 言語で GLSL の暗黙仕様を排除
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
- Feature Detection:
if (!navigator.gpu) fallbackWebGL()
- Lazy Pipeline Cache:複数デバイスで再コンパイルコストを削減
- ビルド:
vite-plugin-wgsl
で WGSL を import - Safari 対応:Metal Shader Code (msl) 互換の書き方に注意
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” を動かし、次世代フロントエンドの第一歩を踏み出しましょう!