従来 CPU からのアクセスは、リソース内の範囲を指定して Lock()/Unlock() を
呼び出していました。D3D10 では Map()/Unmap() に変わっていて、特にアクセス
範囲の指定もありません。
CPU と GPU のそれぞれのリソースアクセス制限は、生成時の D3D10_USAGE に
よって区別します。
・D3D10_USAGE_DEFAULT
GPU が読み書きするリソース。CPU はアクセスできない。
・D3D10_USAGE_IMMUTABLE
一度作成したら書き換えできない。constant のようなリソース。
従来のゲームの作り方だと大半がこれに相当します。
・D3D10_USAGE_DYNAMIC
CPU から GPU へ一方通行転送が可能。これを使うことで動的なオブジェクトも
スムーズなやり取りができます。
・D3D10_USAGE_STAGING
CPU 側で読み込めます。つまり GPU → CPU の転送が可能です。
それぞれの読み書き制限をまとめると次のようになります。
GPU-R,GPU-W,CPU-R,CPU-W
○ ○ × × DEFAULT
○ × × × IMMUTABLE
○ × × ○ DYNAMIC
○ ○ ○ ○ STAGING
特筆すべき点は、CPU 書込み禁止のリソースは Map() すらできないことです。
それじゃどうやって初期データを書き込むのかというと、バッファ作成時に
一緒に初期化用データを渡すことができます。
初期化時の一度きりの転送と Map() による直接アクセスを明確に分離している
わけですね。
また DYNAMIC は GPU が読み込みのみで CPU は書き込み専用です。
これを使えばスムーズな同期転送ができそうなこともわかります。
この辺必要な機能が明確になってかなりわかりやすくなりました。