ここからは、HDRレンダリングは、具体的にどういったプロセスで実現されるのかを解説していきたいと思う。
最初に全体的な流れを示し、その要所要所において、実装に必要な各種技術を紹介していくことにしたい。なお、各ポイントでは、長らく主流となってきた「疑似HDRレンダリング技法」と、これからの主流となるであろう「リアルHDRレンダリング技法」の両方に言及することにしたい。
HDRレンダリングのプロセス
HDRレンダリングは、レンダリングをHDR次元で行うことが基本コンセプトとなる。
前回までで従来のαRGB各8ビットのint8-32ビットの整数バッファで擬似的なHDRレンダリングを行う疑似HDRレンダリングと、αRGB各FP16ビットのFP16-64ビットの浮動小数点バッファで行うリアルHDRレンダリングがあることは述べた。また、後半にはVALVEが「Half-Life2:EPISODE TWO」で実装した妥協案的なリアルHDRレンダリングについても紹介した。 ここまでに紹介した様々なアプローチのHDRレンダリングのスタイルはともかくとして、理論を理想通りに実装したHDRレンダリングは図1のような流れになる。
この図を解説しよう。
左端下、「HDRレンダーターゲット」……すなわちHDRレンダリングに用いるバッファは、FP16-64ビットバッファが標準的な存在となる。先代DirectX 9世代SM2.0/SM3.0対応GPUで完璧ではなかったFP16-64ビットバッファのレンダーターゲットに対するマルチ・サンプル・アンチエイリアシング(MSAA)処理が、DirectX 10世代/SM4.0対応GPUでは動作保証がなされているため、ビデオメモリ占有量増加、メモリバス消費を除けば使い勝手はほとんどint8-32ビット整数バッファと変わらないレベルへと引き上げられた。HDR記録のために必要なダイナミックレンジも、リアルタイム3Dグラフィックス用としては必要十分だ。
左端中央、「HDR光源」……はHDRレンダリングに用いるための光源で、int8-32ビットに制限されない高輝度な光源を取り扱う必要が出てくる。
左端上、「HDRテクスチャ」は、HDRレンダリングの際に3Dモデル等に適用するテクスチャもHDRフォーマットに対応すること……を言っている。
3Dモデルに貼り付けるような画像テクスチャ(デカールテクスチャ)は、通常のint8-32ビットのLDRテクスチャでもよいが、周囲の映り込み情景を表した環境マップや、テクスチャ自体を発光物として取り扱うような「自己発光テクスチャ」についてはHDRテクスチャの使用が望ましい。具体的にはこの場合もFP16-64ビットのテクスチャが理想になる。
ただし、FP16-64ビットのHDRテクスチャはそのままでは圧縮が出来ないため取り扱いが難しい。また、FP16-64ビットのHDRテクスチャ読み出しの頻発はパフォーマンスに大きな影響を与えるので、3Dゲームなどの場合はよほどビジュアル品質に影響が大きいと判断されるテクスチャ以外は、int8-32ビットのLDRテクスチャにHDR情報を盛り込む、いわば疑似HDRテクスチャを利用するケースが多いようだ。この実装方法については後述する。
こうして、「HDRテクスチャ」や「HDR光源」を用いて、HDRレンダリングを行って「HDRレンダーターゲット」にHDRフレームが生成されることになる。完成したフレームが「HDRフレームバッファ」だ。
この後、このHDRフレームを検証して、HDRフレーム中のある一定の輝度以上の高輝度部分を抽出し、これからブルーム効果やグレア効果のエフェクトフレームを生成する。これが「HDRブルーム/グレア」の処理系だ。
「HDRトーンマッピング」はHDRフレームを一般的なディスプレイ機器に表示するための処理を行うところだ。簡単に言えば減色処理のようなものだが、前節で述べたようにここでそのフレームの平均輝度などを算出して(≒ヒストグラムを求める)、そのフレームに適した輝度バランスに調整することで、目やカメラの自動露出補正効果を演出できる。
ここからは、この図1に示した、HDRレンダリングパイプラインの各工程についてのポイントを解説していくことにする。(続く)
(トライゼット西川善司)