WebGPUは、ウェブ上で動作する新世代のグラフィックスAPIです。従来のWebGLに代わるものとして設計されており、より低レベルで効率的にGPUへアクセスできるようになっています。たとえば記事『WebGPUがついに利用可能に』で紹介したように、WebGLより高いパフォーマンスが期待できます。
Three.jsはウェブで3D表現を作るためのJavaScriptライブラリです。2010年代のWebGL黎明期からThree.jsが多くのウェブサイトで使われており、3Dの代表的なライブラリとも言えます。
Three.jsでは、WebGPU対応が進んでいます。WebGPU対応のレンダラー「WebGPURenderer
」が存在し、従来のWebGLRenderer
とほぼ同じ使い勝手で利用できます。Three.js利用者は低レベルコードを書くことなく、WebGPUの利点を活かせるようになっています。WebGPURenderer
は現在はwip(Work in Progress)扱いです。
Three.jsでWebGPUを使うメリットはその将来性です。この記事では、Three.jsのWebGPURenderer
の最新動向や導入ポイントについて解説します。
Three.jsでWebGPU向けに移植してみた
WebGPU版のThree.jsは簡単に利用できます。後述しますが、WebGL向けに作っているコンテンツは、レンダラーを切り替えただけで動作するようになります。ICS MEDIAではいままで数々のオリジナルの作例を掲載してきましたが、WebGPU版に切り替えたので紹介します。
他にも次の作例もWebGPUへ移植しています。
たくさんのコンテンツを従来のWebGLRenderer
からWebGPURenderer
へ移植しましたが、あまりにも簡単に動作し驚きました。開発時の気付きをお伝えします。
- Three.jsのビルトインの機能だけで作成している場合は、レンダラーの切替だけで移植可能(本当に簡単!)
- 互換性のないコードが存在した場合は、個別に修正が必要(粒子表現、線など)。
- シェーダーは互換性がないため、後述のGLSLからTSLへ移植。
Three.jsはWebGL専用ライブラリではなく、かつてはSVGやCanvas 2Dを使って3D表現するレンダラーも用意されていました。WebGLからWebGPUへの変遷のように基盤技術が変化しても、利用者は気にすることは少ないです。Three.jsが3D技術を高度に抽象化できているからこそ、でしょう。
導入方法
Three.jsでWebGPUを利用する手順を紹介します。かつてThree.jsを利用したことがある方(WebGLRenderer
の利用者)を前提とした説明となっています。
- Three.jsのインポート:
- WebGPU対応ビルドを読み込みます。
- CDNの場合は、
three.module.js
ではなくthree.webgpu.js
を読み込みます。 - Viteなどの場合は、とくに設定は不要です。
- CDNの場合は、
- コードではES Moduleの読み込みとして
import { WebGPURenderer } from "three/webgpu"
と記載します。
- WebGPU対応ビルドを読み込みます。
- レンダラーの作成:
new WebGPURenderer()
でレンダラーを生成します。- 引数のオプションは
WebGLRenderer
と同じ形式で指定できます。
- 初期化:
await renderer.init();
メソッドを呼び、初期化します。- 同期ではなく、
await
で非同期になっていることがポイントです。
- シーン描画:
- 通常のThree.jsと同様に、
Scene
やCamera
を作成してrenderer.render(scene, camera)
を呼びます。
- 通常のThree.jsと同様に、
通常のWebGLRenderer
とWebGPURenderer
で実装した場合の差分は次の通りです。ほとんど違いがないことがわかります。
詳細な導入手順はICS MEDIA内の『Three.js入門サイト』をご覧ください。
WebGPU非対応ブラウザのフォールバック
WebGLとWebGPUは異なる技術です。WebGLはすべてのブラウザがサポートしているため、WebGLのほうが広範囲な動作環境をサポートできます。それに対して、WebGPUは現時点(2025年5月現在)ではChrome・Edgeのみがサポートしており、SafariやFirefoxの正式版では利用できません(試験的機能では提供されています)。
▼WebGLの技術レイヤー
▼WebGPUの技術レイヤー
では、Three.jsのWebGPURenderer
を使うと、SafariやFirefoxでは表示できないのでしょうか?
Three.jsのWebGPURenderer
の特徴として、WebGPU非対応環境ではWebGL 2.0へのフォールバックがおこなわれます。開発者が特別な対応をしなくても、ユーザー環境に応じて最適な技術が選択されるため、幅広い環境をカバーできます。
つまり、新しいWebGPURenderer
を使っておけば、新しい環境ではWebGPUの恩恵が得られ、古い環境では従来どおりWebGL 2.0で表示できます。
いまはWebGLRendererのほうが高速
Three.jsのr176時点(2025年5月)では、WebGPURenderer
に比べてWebGLRenderer
のほうが高速に動作することがあるようです。ベンチマークとして、大量のMeshを配置し検証しました。
60FPSをキープできる直方体の数をスコアとしました。個別のメッシュでは、4倍ほどのWebGLのほうが性能が高い結果になっています。
メッシュ種別 | レンダラー | 直方体の数 |
---|---|---|
個別 Mesh | WebGLRenderer |
2,562 |
個別 Mesh | WebGPURenderer |
682 |
インスタンス化 Mesh | WebGLRenderer |
62,751 |
インスタンス化 Mesh | WebGPURenderer |
31,248 |
※検証マシン:Windows 10 / Core i5-1135G7 @ 2.40GHz / Intel IRIS Xe Graphics /メモリー16GB
本来的にはWebGPUのほうが新しいモダンなAPIを利用でき、高速な結果が得られるはずです。記事『WebGPUがついに利用可能に』の検証では、ネイティブ実装であれば、WebGPUのほうが高い性能を記録できています。
1万回のドローコールを行うと、WebGLのデモでは30FPSにまで落ちているのに対し、WebGPUのデモでは50FPS近い値がでています
筆者の願望もありますが、やがてThree.jsもWebGPU版のほうが高速になっていくことでしょう。
2025年5月現在、性能向上にむけた取り組みには以下のようなプルリクエストがあります。
React Three FiberでWebGPURendererは利用可能
記事『React Three Fiber入門』で紹介した、JSX構文でThree.jsが扱えるReact Three Fiberも、WebGPURenderer
が利用できます。詳しくは次のドキュメントをご覧ください。
TSLと GLSL / WGSL
TSL(Three.js Shading Language)は、Three.jsにおける新しいシェーダー記述方法です。
従来、Three.jsでリッチな視覚表現を行うにはGLSL(OpenGL Shading Language)を記述する必要がありました。WebGPUのネイティブではWGSL(WebGPU Shading Language)を利用しますが、Three.jsのWebGPURendererではTSLを使います。
TSLではJavaScriptでシェーダー定義を作成します。最終的にWebGPU用のWGSLコードと、WebGL用のGLSLコードに自動で変換されます。単一の記述で両環境をカバーでき、シェーダー言語の差異を意識せずに開発が可能です。
公式サイトのwebgpu_tsl_editorで確認できるので、試してみるといいでしょう。
TSLの詳細は次のリンクで学べます。TSLはノードベースでシェーダー処理を定義することが特徴です。
TSLの簡単な例
TSLの簡単なコードを紹介します。
次のコードは、時間経過に合わせて頂点を波打たせるシンプルな例です。TSLノードで頂点を動的にオフセットし、法線も再計算することで滑らかな陰影が表現されています。
import { WebGPURenderer, MeshStandardNodeMaterial } from "three/webgpu";
import { positionLocal, normalLocal, sin, time, float } from "three/tsl";
const material = new MeshStandardNodeMaterial();
const wave = sin(positionLocal.x.add(time));
material.positionNode = positionLocal.add(normalLocal.mul(wave).mul(float(5)));
▼WebGPURendererとTSLを用いて平面ジオメトリに波形変形を与えた例
Three.js作者のmrdoob氏の発表『Embracing WebGPU and WebXR With Three.js – Mr.doob, JSNation 2024』によると、TSLはビルドにおいてツリーシェイキングができることや、直感的に記述できることが利点と紹介されています。
ポストエフェクトをTSLで作成してみた
チルトシフト効果をTSLで作成しました。Y座標の上下でブラーを適用するエフェクトです。手前と奥側がボケているような効果が得られます。
公式のアドオンにさまざまなTSLノードが用意されているため、組み合わせていくだけでおもしろい効果を作れます。
公式デモ
公式デモでGLSLとTSLの文法の違いを確認してみましょう。デモはドットシェーダーを題材にしてみます。
以下は該当コードのピックアップしたものです。GLSLとTSL(JavaScript)の文法の違いはありますが、ほとんど同じ処理が記載されていることが確認できます。入力画像の輝度を取り出し、格子状のサイン波パターンを重ね、濃淡を強調したドットスクリーン(網点)風の色を生成しています。
コラム: シェーダー言語と対応する技術
ウェブで利用可能なシェーダー言語はGLSL ES 1.00とGLSL ES 3.00とWGSLの3種類があります。関係性をまとめてみます。
技術 | 対応するシェーダー言語 |
---|---|
WebGL 1.0 | GLSL ES 1.00 |
WebGL 2.0 | GLSL ES 1.00とGLSL ES 3.00 |
WebGPU | WGSL |
- WebGL 2.0ではGLSL ES 3.00を利用しますが、GLSL ES 1.00とも互換性があります。
- GLSL ES 1.00で記載しておけば、WebGL 1.0とWebGL 2.0の両方で利用できます。
- ただし、WebGL 2.0の機能をフルに利用するにはGLSL ES 3.00を使う必要があります。
- WebGPUではGLSLは利用できず、WGSLを使う必要があります。
- TSLは高級言語で、自動的にWGSLやGLSL ES 3.00に変換して動作します。
まとめ
Three.jsのWebGPURenderer
は開発が進んでいます。TSLの導入により、シェーダー開発も直感的に記述できるようになったと思います。
ただし対応ブラウザが限定的で、最適化も進行中のため、本番導入前に検証が必要です。まずは小規模なプロトタイプで試し、WebGPUならではの表現力と将来性を体感してみるといいでしょう。
今後のアップデートにも注目しながら、WebGPU時代の到来に備えましょう。