ジオメトリシェーダを活用した新表現(3)~ジオメトリシェーダによるラインベースのブラー

前回の2.5Dブラーの技法には、1つ問題点がある。

それは、最終的には画像処理的にブラー処理をするので、速度の違う物が重なり合っているような場所で、不自然なブラーが出てしまうことだ。例えば、動いているものの手前に静止物があった場合、この静止物のピクセルが動いているもののブラーに入り込んで来てしまったりするのだ。

これについては、単純な工夫である程度対処できるとされている。

ベロシティマップ生成時には、前述の3Dモデルの引き伸ばしが行われるが、この処理が終ったときには、引き伸ばされた3Dモデルを含んだシーンの深度情報(Zバッファ)が完成しているはずだ。これを利用し、ブラー生成時のシーンテクスチャ読み出し時に、このZバッファを参照して、その参照先が奥行きとして参照元よりも手前であれば、これは残像生成の参照先としては不適合という判断を下すのだ。これにより不適切なブラーピクセルの流れ込みを回避できる。

「ロストプラネット」(カプコン)より。シーンテクスチャ

シーンテクスチャの深度情報

ベロシティマップ

なんの工夫もしないとこのように、ブラーにシーンの前後関係を無視したピクセルの侵入が起こってしまう

ベロシティマップの深度情報も求めて、これを吟味し、手前のオブジェクトのピクセルが後ろのブラーに影響しないように工夫してやると……

ピクセルの侵入を大幅に低減できる

なお、カプコンの「ロストプラネット」では、遠方の動きについては、この2.5Dブラー生成をしても目立ちにくいため、一様なカメラブラーで代用できるという近似概念を導入し、モーションブラー生成負荷の低減と均一化を図っている。

前述のセオリー通りのカメラブラーを導入してしまうと、画面全体が動きすぎてしまい、2.5Dブラーとの親和性が良くないため、カメラーブラーを2.5Dブラーの仕組みに統合する形を取る。

これにはシーンの深度情報を用いる。シーンの深度情報はシーンの各ピクセルの遠近情報が記録されているので、それぞれのピクセルに対し、この遠近情報とカメラの移動ベクトルの情報を利用して概算して、ベロシティマップ用の値を出力してしまうのだ。例えばカメラが横に移動した場合、近いピクセルはたくさん横移動し、遠いピクセルはちょっとだけ横移動する。こうした情報をベロシティマップに描き込んでしまうのだ。こうすることで、カメラブラーと2.5Dブラーを統合させることができる

ジオメトリシェーダによるラインベースのブラー

「ロストプラネット」のDirectX 10パッチ適用後は、前出の2.5Dブラーに、さらにジオメトリシェーダを効果的に活用したラインベースのモーションブラーを追加合成している。

ラインベースのモーションブラーでも、ベロシティマップを生成するところと、ブラー生成元となる通常レンダリングしたシーンテクスチャを用意するところまでは、2.5Dブラーと同じ。

そして、ベロシティマップを参照して、取り出した速度と向きに対応する線分(ライン)をジオメトリシェーダを使って生成する。

この線分の色は、用意しておいたシーンテクスチャから取り出した色を、線分の始点の色として、終点に向かって色を薄くして描画する。ラインが長ければ長いほど色が薄くなり、その薄くなる度合いをα値に入れていく。あとで、このα値は2.5Dブラーとの合成マスクとして利用する。

なお、ラインの描画は画面座標系で行われるが、ちゃんとシーンの深度値を吟味して行うので、シーンの遮蔽構造に配慮されてブラーが描画されることになる。

ラインブラーの概念図

この工程をベロシティマップの全てのテクセルに対して行うことになるが、さすがにこれをレンダリング解像度で行うと線分が多くなりすぎるので、線分生成用のベロシティマップは適当な低解像度なものとし、これと同じく、ラインブラーとして生成するバッファも適当な低解像度なものにする。

最終的には低解像度のラインブラー結果を拡大し、レンダリング解像度と同解像度の2.5Dブラーの結果と解像度を一致させて合成して完成となる。(続く)

「ロストプラネット」より。2.5Dブラーだけの場合。ブラーに面の境界のようなものが出てしまっている

2.5Dブラーにラインブラーを付加した場合。面の境界感は消え、動きの躍動感を強調するような劇画的な効果線に見える

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