Deferredレンダリングについて

では、複数のテクスチャーに情報を出力することにどのような用途があるでしょうか? その一つがDeferred(ディファード/遅延)レンダリングとよばれる手法です。通常のレンダリングでは一つのオブジェクトごとに影響するライトの計算(ライティング)を行い描画します。これを複数のオブジェクトに対して順番に行い、最終的に3D空間内のすべてのオブジェクトに対しオブジェクトとライティング結果を描画します。これをForward(フォワード/前方)レンダリングとよびます。


これに対し、Deferredレンダリングは最初に3D空間内の全オブジェクトをライティングなしでテクスチャーに描画します。その際にオブジェクトの描画色の他に、3D空間内での座標や法線など、ライティングに必要な情報をそれぞれ別のテクスチャーに出力しておきます。最後にそれらのテクスチャーの情報を元にライティングの計算を行います。




Forwardレンダリングでは、下記の理由などからあまり多くのライトを配置しません。

  • ライトの数が増えるとシェーダーが複雑化する
  • ドローコール時にオブジェクトごとに寄与する可能性のあるすべてのライトの情報を渡す必要がある
  • ピクセルに影響しないライトの計算まで行うことがあるため、ライト数の増加に対する負荷の増加が大きい

Deferredレンダリングにはこのような制約はないため、Forwardレンダリングと比べ多くのライトを使用できる特徴があります。

DeferredレンダリングにおけるMultiple Render Targets

Deferredレンダリングで最初にテクスチャーに描画する情報群はG-Buffer(ジーバッファー)とよばれ、実装によって異なりますがライティング前の描画色、座標、法線、深度などを格納します。今回のデモではG-Bufferのそれぞれの情報を可視化しています。


さて、このDeferredレンダリングのG-Bufferの出力に使われているのがMultiple Render Targetsです。Multiple Render Targetsを使わなくても座標、法線などのG-Bufferに格納する情報ごとにドローコールを行えばDeferredレンダリング自体は実現可能です。しかし、これらの情報は座標変換など共通の計算過程を経ているため、一度のドローコールで複数の情報を出力できるMultiple Render Targetsと相性がよく、ドローコールと共通計算を削減することで大きな高速化が見込めます。

今回のデモは最大100個の動的なライトを処理しています。Multiple Render Targetsは大量のライトをあつかえるDeferredレンダリング表現に欠かせない機能です。


終わりに

WebGL 2.0で使用できるMultiple Render Targetsについてイメージがつかめたでしょうか? 一度のドローコールで複数のテクスチャーに情報を出力できるこの機能は現代のコンシューマーゲーム機では標準で搭載されており、今回紹介したDeferredレンダリングはゲームシーンにおいて欠かせないものとなっています。WebGL 2.0の対応ブラウザが広がることでコンシューマーゲームと同等の表現がウェブで可能になるというのはなんだかワクワクしますよね。

連載の最後の記事はTransform Feedback(トランスフォーム・フィードバック)について詳しく紹介します。

※今回紹介した機能はWebGL 1.0でもブラウザによっては拡張機能として使用できます。

「サンプルで理解するWebGL 2.0」の連載記事一覧

  1. Geometry Instancingによる大量のオブジェクト表示
  2. Multiple Render Targetsによる動的なライティング表現
  3. Transform Feedbackによるパーティクル表現