ライトプリパスレンダリング Part2 光源計算&最適化

光源計算の処理と最適化を行います。点光源などの影響範囲が限定されている場合、計算が必要なピクセルを検出することで処理時間を短縮します。

左上:法線 右上:Specular 左下:最終結果 右下:Diffuse
左上:法線 右上:Specular 
左下:最終結果 右下:Diffuse


光源計算

ジオメトリバッファを使い、ピクセル毎の光源計算を行います。画面全体のピクセルに対して処理してしまうと時間がかかりるぎるため、光源の影響範囲のピクセルのみ処理します。点光源であれば球、スポットライトは円柱などを描画。
複数の光源計算は1つのシェーダで一括して行わずに、光源毎に球や円柱を加算合成で描画します。これで光源の数や種類に制限がなくなり、時間の許す限り何個でも追加可能(ディファード系レンダリングの特徴)。

シェーダコード 点光源

減衰モデル

距離の2乗に反比例する物理モデルだと減衰が急激過ぎて扱いにくいので、物理法則を無視した独自の方法を考えました。

光の減衰
光の減衰


光源計算の最適化

光源計算を行う際、処理ピクセル数を減らすために影響範囲の形状で描画を行いますが、それだけでは不十分です。奥と手前部分の影響範囲外のピクセルも処理してしまうため、計算が必要な部分をさらに限定して最適化を行います。

点光源の影響範囲
点光源の影響範囲 
緑:影響範囲 赤:範囲外(奥) 青:範囲外(手前)

ステンシルテストを使った最適化

ステンシルテストに失敗した場合、ピクセルシェーダが実行されないことを利用します。赤青の部分と緑の部分に異なるステンシル値を書き込み、ステンシルテストで緑の部分だけが合格するようにステート設定し描画します。

3回のレンダリング処理が必要、赤青検出のステンシル書き込み2回と光源計算。
ステンシル書き込み時間 < 最適化による時間短縮
でないと意味がない。

デプステストでの最適化

デプステストはピクセルシェーダ後に実行されるため意味がないように見えますが、GPUの早期Zカリングという機能が利用できればピクセルシェーダ前にキャンセル可能です。ただし明示的に利用できず、DirectXやドライバー任せなので機能が有効にならない場合があります。

早期Zカリングは事前に大まかな単位でデプステストを行い、ピクセルシェーダ実行前に不要なピクセルを検出、カリングする機能。
2回レンダリング、赤青のどちらかを光源処理時のデプステスト(早期Zカリング)で除去。


サンプルプログラム

“ライトプリパスPart2 光源計算&最適化” をダウンロード dx11LightPrePass2.zip – 48 回のダウンロード – 90 KB


リンクなど

スクリーンショットのモデルとモーション

キャラクターモデル

ままま式GUMIβ版 / 3xma

モーション

【第9回MMD杯Ex】星間飛行GUMI/ニコニコ動画

背景モデルデータ

ぴくちぃ式 背景パック 1.2 M5ミクちゃん部屋 / MshZ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.