HW ShadowMapのために。

HW ShadowMapのために最近の状況をしらべてみました。

  • NVIDIA
    • Geforce7x00くらいのころから搭載*1
    • テクスチャとしてUSAGE_DEPTHSTENCIL付きでD24S8フォーマットで作成可能
    • これをサンプリングするときに4近傍からの平均がとれてしまう。
  • AMD
    • fetch4
      • X1800以外のX1xxxシリーズで使用可能
      • このとき、DF24というフォーマットでテクスチャを作れる
      • このサンプリング時にfetch4機能で4サンプルとって、シェーダー内で平均算出
    • 通常のD24S8テクスチャ
      • RADEON 2000以上で使用可能になっているよう
      • サンプリング時に4近傍からの平均が求まってしまう。

このような相違があります。

では多くの環境でHWシャドウマップ技術を使うには、という点を考えてみます。

*1 : 6×00系ですでに使えたかも

多くの環境でHWシャドウマップ技術を適用するには

まず、環境がNVIDIAかAMDかで振り分けます。

NVIDIA時

D24S8形式のテクスチャ(USAGE_DEPTHSTENCIL付き)が使えるかを調べます。

もし使えないようならば、完全ソフトウェアのシャドウマップを使うしかありません。

AMD時

  1. D24S8形式のテクスチャが使えるかを調べます。
    1. これが使えるのはRADEON 2000以上です。PCFが有効でデプス値はサンプリングだけから求まります。
    2. 使えるならこれを使用します。使えない場合に以下に続きます。
  2. 続いてfetch4機能が使えるかを調べます。
    1. 使えるのは、RADEON X1x00以降です(1800を除く)。PCFはかからないので、自前で平均を計算します
    2. 使えるならこれを使用します。使えない場合に以下に続きます。
  3. 完全ソフトウェアのシャドウマップを使用します

このような感じで適用すべき機能が振り分けられると思います。
ここでいう完全ソフトウェアのシャドウマップとは、
D3DFMT_R32Fなどの単一要素のカラーとしてレンダーテクスチャを作成し、カラー値としてデプスを書き込む感じになります。

まとめ

これらの方針で一度実装してみようかと思います。
現在の多くの環境では、完全ソフトウェアのシャドウマップをやらなきゃいけないということはないと思われます。
DX10対応しているハードであれば、HWシャドウマップは使えるはずですし。
そうでないにしても、fetch4くらいは使える環境が多いのではないでしょうか。

個人的には、この記事を元に、マルペケつくろ~のIKDさんがサンプルおよび、ここよりわかりやすい解説に発展させてくれないかなと、密かに期待しております。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする