Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!

log

2012.04.23 C++:シャドウマップことはじめ

ファイル 393-2.jpg

これまでは影の表現は頂点カラーによる位置によるモデルの明度調節と丸影で表現
させていましたが、セルフシャドウにも挑戦したいなと思ったのでシャドウマップを実装
してみることにしました。

シャドウマップはカラーバッファに深度値を格納するタイプが現在は一般的な感じ(?)
ですが、深度バッファをそのまま利用するハードウェアシャドウマップというのがあるので、
今回はそちらを実装してみました。ちなみになぜこちらを選んだかというと、カラーバッファ
を描画しなくて済む上に倍速深度レンダリングが期待できるので、前者よりも高速な描画
が期待できると思ったためだったりします。

ここで、「へぇ、こんな方法があるなら遅延レンダリングでも深度バッファを描画せずに
済むね」と思う方もいるでしょう。何せ自分がそうでしたから笑;結論からいうと遅延レン
ダリングで深度バッファを用いてサンプリングするのはDirectX9(というより昨今のGPU)
では不可能です。サンプリング自体は可能ですが、サンプリング時に0か1の値を返す
というよくわからない仕様になっているので遅延レンダリングには利用できない、という訳
です。まぁシャドウマップの場合はシャドウマップより深度が上(1)か下(0)かが分かれば
いいため、シャドウマップ用に設けられているんだろうなと思いました。

そして肝心の速度ですが。セルフシャドウの生成はエフェクトの中でもかなり重い部類
なので、古いPCだとさすがに処理落ちするだろうなと思っていましたが。なんと、古いXP
のPCでも800x600の解像度で30FPSが常時キープ出来たので期待以上の出来栄え
でした(まぁシャドウマップの生成はキャラだけで背景は描画してませんが;)。まだ影が
ガタガタしていて課題も残りますが、何より処理落ちしていないことが嬉しかったりします。