ジオメトリシェーダを活用した新表現(2)~立体的なモーションブラーを画像処理で実現させる2.5Dブラー技法

前回のオブジェクト・モーション・ブラー(アクション・ブラー)とはよく似ているが、微妙に実装の異なる手法が2003年のゲーム開発者会議「GDC 2003」にてNVIDIAのSimon Green氏より発表された。それが「2.5Dブラー」と呼ばれる手法だ。これはカプコンの「ロストプラネット」やCRYTEKの「CRYSIS」が効果的に実装したことで、その有効性が広く知られることとなった。

基本方針は以下のような手順になる。

まず、シーンを通常通りにレンダリングし、これを後のレンダリングパスで参照するための素材とする。

ブラーを出したい対象3Dオブシェクトの頂点には前フレームの画面上の座標を保持しておき、頂点シェーダで、現在フレームの画面座標位置を計算して、保持しておいた前フレームの画面座標位置と差分を算出して速度と向きを計算して求め、これらの値をテクスチャへとレンダリングする。ポリゴンを色で描くのではなく、この速度と向き情報で描く……というイメージになる。この処理によって生成される、画面上の全ピクセルの速度情報をこの技法では特に「ベロシティマップ」(速度マップ)と呼んでいる。

最終レンダリングパスでは、このベロシティマップを参照して速度情報を取りだし、最初にレンダリングしたシーンテクスチャに対してこの速度情報分ずらしてサンプルする(読み出す)ことで最終フレームを生成する。

ベロシティマップの概念

ベロシティマップを参照してのブラー生成の原理

シーンテクスチャからのサンプルは1個だけでなく、現在位置から前フレーム位置までをN等分した各地点から合計N個読み出していくのが一般的だ。現在位置と前回位置の位置が大きく離れている場合は速度が早かったということであり、シーンテクスチャからサンプルしたテクセルは薄くブレンドするような重み付けをするのもよく用いられる。こうすることで現在地に近い残像が濃くみえ、遠いところの残像を薄くでき、より躍動感が際だつ。

この方法でポイントとなってくるのはベロシティマップの作成の部分だ。

ある点が別の位置に動いたときにはその前後の位置情報の差分だけで速さと向きが算出できるが、これがポリゴンと言うことになってくるとちょっとややこしい。あるポリゴンがある位置から別の位置に動いたときに、前の位置から現在の位置までのそのポリゴンの"面"としての軌跡とその向きを求めたいのだ。

これはイメージ的にいうと、動いているポリゴンに対し、前フレームの位置から現在位置まで"ビヨーン"と引き伸ばしたようなポリゴンに変形することで求められる。

この変形処理には米ブラウン大学のMatthias M. Wloka氏らが「Interactive Real-Time Motion Blur」(1995)にて発表した、動きに即したポリゴンの変形処理を応用する。

これは、各頂点に着目し、その向き(法線ベクトル)が、進行方向に近ければ近いほど現在の状態に近い頂点座標とし、違っていれば違っているほど過去の頂点座標とするように頂点を変位させる……という処理で実現される。

つまり、この処理では、もともと持っていた現在位置の頂点と、前回位置に新たに頂点を生成して新規にポリゴンを作り出す必要が出てくる。そう、ここでジオメトリシェーダが活躍するのだ。

移動ベクトルとポリゴンの法線ベクトルの関係性を見て、そのポリゴンの軌跡を生成。実際のベロシティマップはこのポリゴンの軌跡に対して行われることになる

なお、ジオメトリシェーダを持たないそのためDirectX 9世代SM3.0対応GPUで、この2.5Dブラー技法をやるには、前回位置に引き伸ばすための頂点を、3Dモデル側に仕込んでおく……といった工夫が必要であった。丁度ステンシルシャドウボリューム技法の影生成における、影領域生成のための引き伸ばし用頂点を仕込んでおくのとよく似ている。

カプコン「ロストプラネット」ではポリゴン軌跡生成のためのダミーポリゴン(縮退ポリゴン)が3Dモデルに仕込まれていた。ジオメトリシェーダが使用可能なGPUであればこの事前処理は不要だ。その意味では、この2.5Dブラー技法においては、ジオメトリシェーダのアクセラレーション的活用と言えなくもない。(続く)

左が縮退ポリゴンなしで12,392ポリゴン。右が縮退ポリゴンありで17,765ポリゴン。この差だけ、このモーションブラー生成のための無駄な頂点処理負荷となりうる

(トライゼット西川善司)