本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
こんにちは。今日は「WebGLのちょっと変わった活用法」ということで、お話ししていきたいと思います。
まず簡単に自己紹介です。doxasというハンドルネームでWebGLの普及活動を行ったり、最近はポッドキャストの配信もやっています。今日はよろしくお願いします。
今日話すこと、話さないこと
基本的に、WebGLの前提知識みたいな部分だったり、ライブラリを使った話は、今日は時間も限られていますので話さない予定です。
WebGL 2.0の機能や、Webの新しいAPIとして策定が進んでいるWebGPUなど、そういった話が出てきます。
今日は「ちょっと変わった活用法」というタイトルにしているのですが、具体的にはGPGPUの話ができたらいいかなと思っています。
GPGPU - グラフィクス処理以外にもGPUを!
GPGPUのWebGL 1.0世代の話から、まずは見ていきたいと思います。
近年では、GPUはグラフィックス処理だけではなく、さまざまな汎用計算に広く用いられるようになっています。具体的には機械学習やブロックチェーン技術などですね。高い演算能力を活用することで、GPUがそういった汎用計算に非常に役立つ場面というのが増えているのかなと思います。
こういったGPUを、グラフィックスの描画以外の用途で汎用計算に用いることを、一般にGPGPUと呼んでいます。
WebGLは、JavaScriptを介してGPUを使うことができます。そのため、GPGPUのような汎用計算も、ちょっと工夫してやるとできます。
ただWebGL 1.0世代では、GPUを用いるといっても、その計算した結果をCPUのJavaScriptの世界に直接返す方法がありません。そこで、一度グラフィクスとしてレンダリングして、そのピクセルを見ることで計算結果を取り出すといった、ちょっと裏技的なアプローチが必要でした。これが、WebGL 1.0世代のGPGPUの実装方法でした。
Transform feedback - WebGL 2.0世代のGPUコンピューティング
こうした方法でももちろん、GPGPUみたいなことができるのですが、WebGL 2.0世代になるとTransform feedbackというものが新しく登場してきたことによって、少し事情が変わりました。
テクスチャを使ってGPGPUする場合だと、どうしてもグラフィクスとして描画するという作業が発生します。実際にグラフィクスとしてどこかに表示して、目で見て楽しむわけではないのに、わざわざレンダリングをしないといけないため、無駄が発生していました。
それに対してWebGL 2.0では、Transform feedbackという機能が使えるようになりました。それによってレンダリングを省略でき、頂点バッファに直接値を書き込んでGPGPUを行うということができるようになりました。
Transform feedbackを使って頂点バッファの中身を書き換えたあとに、その書き換えた結果の値をそのまま別のプロセスに引き継ぐといったこともできます。そのため、CPUを介さずに、GPU内で完結して連続して演算を行っていくことができます。これがTransform feedbackの優れた点ですね。
グラフィクスの用途で言うと、パーティクルの座標を計算するときに、連続してパーティクルが動いていくところをGPUに計算させる、こういうことがTransform feedbackを使うとできるようになっています。
もちろん、この仕組みをうまく使えば汎用計算、いわゆるGPGPUに利用することもできます(参考)。
Compute shader - 高い演算能力でWebの世界をよりリッチに
最近、仕様策定が進んでいるWebGPU世代。今はまだ策定中で、正式に勧告はされていないのですが、WebGPU世代になるとCompute Shaderが使えるようになります。
Compute Shaderは、Transform feedbackと同じようにレンダリングを省略した、計算に特化した機構になっています。そのため、グラフィクス以外の用途で活用されることが、今から大きく期待される技術のひとつです。
機械学習のほかにも、たとえばPoseNetのように画像や動画をリアルタイムに解析して人間の姿勢を推定するような処理であったり、高い演算能力が役に立つ場面というのは、今後Webでも増えてくると考えられます。そういったことが、このCompute Shaderによって加速していく、そしてよりリッチで、わくわくするようなJavaScriptの世界線がやってくることに期待したいなと思っています。
ご清聴ありがとうございました。以上になります。