« タマネギスライス美味い | メイン | 豆腐のイタリアングラタン »

2005年08月07日

影描画方法メモ

ゲームで使われる影の描画方法はいろいろあるのだけど、その名前と処理内容をイマイチ把握しきれていなかった。
同居人が買ってきたグランディア3を見て影の話になったので、良い機会だと思い、改めて調べてまとめてみた。

■プロジェクションシャドウ(投影テクスチャマッピング)
光源方向から影を落とすオブジェクトを描画し影絵の影のようなテクスチャを作る。
影が落とされるオブジェクトに対して、その影テクスチャを光源方向から投影するようにテクスチャマッピングする。

影が落とされるオブジェクトを、落とす影の分だけ描画する必要があるので、複雑な形状のオブジェクトに対して影を落とすのは負荷が高い。
セルフシャドウ表現は不可能。(だと思う)

PS2でも可能でよく使われる。
グランディア3は多分これ。負荷軽減のため、影が落とされるオブジェクトは、実際の描画用のモデルと影投影用の簡易モデルと2種類用意しているようだ。階段状の地形なのに斜面のように影が落ちているところがあった。


■ステンシルシャドウボリューム
影を落とすオブジェクトの光源方向からみた輪郭辺を計算で抽出し、輪郭辺を光源と逆方向に引き伸ばしたポリゴンメッシュをシャドウボリュームと呼ぶ。シャドウボリュームの中は影になる空間である。
Zテストとステンシルバッファを使って影のステンシルを作る。
影が落とされるオブジェクトを描画した後、ZテストON,Zバッファ更新なしでシャドウボリュームの表と裏をステンシルバッファに描画する。表を描画するときにはステンシルに+1、裏をかくときにはステンシルに-1する。影が落ちるピクセルはZテストにより表しか描画されないので、影になるピクセルはステンシル値が1となる。(この記事に図解がある)

プロジェクションシャドウと異なり複雑な形状のオブジェクトに対しても一定のGPU負荷で影が落とせるが、影を落とすオブジェクトが複雑だと輪郭抽出のCPU負荷が高い。(最近はGPUでも輪郭抽出できるようだ)
セルフシャドウ表現も可能。

PS2には純粋な意味でのステンシルバッファがないが、簡易的にそれっぽいことは可能。
「ジャック×ダグスター」は地面に沢山生えている細かい草のポリゴンにも影が落ちていることから、ステンシルシャドウボリュームを使っているのではないかと思う。


■シャドウマッピング
光源方向から見たシーンを描画して光源方向から見た深度テクスチャを作り、通常カメラからのシーン描画時に「光源方向からのピクセルの深度値(A)」と「そのピクセルに投影される深度テクスチャの深度値(B)」を比較して、A>Bなら影とみなす。(この文章だけではわからないだろうな…)
セルフシャドウ表現が可能。

普通にやろうとするとピクセルシェーダーが必要(だと思う)なのでPS2では難しい。
が、トリッキーなことをすればPS2でもできるという話もある。


参考
3Dゲームファンのための「3DMark 05」講座
DOOM3の影生成について考察する

投稿者 sike : 2005年08月07日 21:18