あふれ出す光を生成する方法
ブルーム効果やグレア効果は、レンダリングしたフレーム中の高輝度部分を抽出して行うことになる。いわばペイントソフトでフォトレタッチをするような行為をピクセルシェーダで行うイメージだ。
疑似HDRレンダリングにしろ、リアルHDRレンダリングにしろ、高いダイナミックレンジの輝度情報が各画素に記録されているので、「どこからが高輝度なのか」を判断しないといけない。
例えば0.0~2.0までの輝度値を記録していたとして幅1.0の範囲を表示する場合を考える。そのフレームが1.0~2.0の分布だったとき、1.0は最暗部となるが、逆に0.0~1.0の分布だったとき1.0は最明部になる。HDRレンダリングしたそのフレームの平均輝度を求めてやり、どこからを「高輝度である」と判断できるかを決定してやる必要があるのだ。この処理については後述のトーンマッピングの解説のところで詳しく触れることにする。
そのフレームに対する「高輝度」と判断できる「輝度基準値」を得られたら、その値以上の輝度の画素を別バッファに抽出してやる。
こうして"精製"した高輝度抽出フレームを"種"にして、ブルーム効果やグレア効果のエフェクト画像を生成するのが、この「HDRブルーム/グレア効果」工程になる。
ブルーム効果は、この高輝度部分がじわっと"滲み出る"ような効果とすればよいので、この高輝度抽出フレームをぼやかす処理をしてやればよい、という方針を思いつく。
ここで、ポイントとなるのはそのボカシ方だ。
ボカしの際に使われるボカしフィルタとして定番なのは「ガウスフィルタ」(Gaussian Filter)だ。
これは簡単に言えば、あるピクセルに着目したときに、そのピクセルカラーを外に行けば行くほど淡く薄く、同心円状に散らすような処理系になる。
広範囲をぼかすためには、大規模なボカし処理を繰り返し行う必要があるので負荷が高い。
そこで、高輝度抽出フレームをダウンサンプルして低解像度版の高輝度抽出フレームを生成し、これに対して適当な規模のガウスフィルタを適用してやる代案がよく利用される。低解像度版の高輝度抽出フレームは解像度が1/2のものから1/4,1/8,1/16,1/32,1/64というように適当に複数を用意するのが一般的だ。
ブルーム自体にそれほどの高解像度情報が必要ないという場合は、最初に生成する高輝度抽出フレームを元フレーム解像度の1/4あたりにしておき、そこから始めて1/8,1/16,1/32,1/64などの低解像度版を用意する……といった手抜きも考えられる。
なお、ぼかす際には、低解像度版の高輝度抽出フレームほど暗くぼけるように、ガウスフィルタ適用時のピクセルカラーの減退率を下げる(ローパス化)しておく。
こうして出来たボケた解像度の全く異なる複数の高輝度抽出フレームを、バイリニアフィルタを適用して同一解像度に拡大し、これを合成してやると、遠くに行けば行くほど淡く大きくボケたブルーム効果のフレームが得られる。
「最初に高輝度抽出フレームを低解像度にしておき、合成時には元の解像度に拡大して戻す」……というテクニックは、本来ならば反復して散らさなければ実現できないような広範囲のボケを、1回だけのボカし処理で実現させるためのテクニックだったということがわかる。もちろん低解像度になったことで色と解像度の情報量は激減しているわけだが、外郭に行けば行くほど色を淡くぼかすことを望んでいたので、解像度もそれほど重要ではなくなる。実際、見た目の品質もそれほど悪くはない。
この手法は、前節で紹介した疑似HDRレンダリングの開祖的存在である「DOUBLE S.T.E.A.L」にて実装されて話題を呼んだテクニックで「縮小バッファへのガウスフィルタ」法と呼ばれ、現在では広く活用されている。なお、このテクニックの考案者の開発者の名前を付けて川瀬式MGF(Multiple Gaussian Filter)と呼ばれることもある。
なお、整数LDRバッファを使用して疑似HDRレンダリングを実装していた「DOUBLE S.T.E.A.L」では、HDR環境マップや高輝度テクスチャのα部を輝度情報格納用として利用し、この情報を効果的に活用することで、ブルーム/グレア効果の処理を効率よく行えるようにしていた。
シーンのレンダリング時にこうしたHDR環境マップや高輝度テクスチャを適用する局面では、それらのα部から輝度情報を取りだして、陰影計算をこの輝度情報に対しても行い、レンダリング結果のカラー共々出力するようにする。最終レンダリング結果のα部には、疑似HDRレンダリングながらも、陰影処理の結果として高輝度となった情報が残るので、ちゃんと二次反射以降の表現でもHDR表現を実現できる。そして、ブルーム/グレア効果の工程では、このα情報を利用すればよい。
グレア効果(光芒、スター効果)も、高輝度部の"あふれさせ方"が異なるだけで、原理としてはブルーム効果と全く同じだ。どういったあふれさせ方を実装するかはアーティスティックなセンスに委ねられる部分になる。
「スターオーシャン3」(トライエース,2003)では、高輝度抽出フレームを潰して回転させてボカし、これを合成時には回転を元に戻して解像度を合わせる形で拡大して合成する手法で、鋭い光芒のグレア効果のエフェクトを作り出していた。(続く)
(トライゼット西川善司)