D3D11_MAP
CPU による読み取りおよび書き込みとしてアクセスされるリソースを識別します。アプリケーションはこれらのフラグを組み合わせることができます。
typedef enum D3D11_MAP
{
D3D11_MAP_READ = 1,
D3D11_MAP_WRITE = 2,
D3D11_MAP_READ_WRITE = 3,
D3D11_MAP_WRITE_DISCARD = 4,
D3D11_MAP_WRITE_NO_OVERWRITE = 5,
} D3D11_MAP;
定数
- D3D11_MAP_READ
リソースは読み取り用にマップされます。リソースは、読み取りアクセス許可付きで作成しておく必要があります (「D3D11_CPU_ACCESS_READ」を参照してください)。 - D3D11_MAP_WRITE
リソースは書き込み用にマップされます。リソースは、書き込みアクセス許可付きで作成しておく必要があります (「D3D11_CPU_ACCESS_WRITE」を参照してください)。 - D3D11_MAP_READ_WRITE
リソースは読み取りおよび書き込み用にマップされます。リソースは、読み取りと書き込みのアクセス許可付きで作成しておく必要があります (「D3D11_CPU_ACCESS_READ および D3D11_CPU_ACCESS_WRITE」を参照してください)。 - D3D11_MAP_WRITE_DISCARD
リソースは書き込み用にマップされます。リソースの以前の内容は未定義になります。リソースは、書き込みアクセス許可付きおよび動的使用で作成しておく必要があります (「D3D11_CPU_ACCESS_WRITE」および「D3D11_USAGE_DYNAMIC」を参照してください)。 - D3D11_MAP_WRITE_NO_OVERWRITE
リソースは書き込み用にマップされます。リソースの既存の内容を上書きすることはできません (「解説」を参照してください)。このフラグは、頂点バッファーとインデックス バッファーのみで有効です。リソースは、書き込みアクセス許可付きで作成しておく必要があります (「D3D11_CPU_ACCESS_WRITE」を参照してください)。D3D11_BIND_CONSTANT_BUFFER フラグを使用して作成したリソースでは使用できません。
解説
この列挙型は、ID3D11DeviceContext::Map で使用します。
これらの解説は、次のトピックに分かれています。
- D3D11_MAP_WRITE_NO_OVERWRITE の意味
- D3D11_MAP_WRITE_DISCARD と D3D11_MAP_WRITE_NO_OVERWRITE を組み合わせて使用する一般的な方法
D3D11_MAP_WRITE_NO_OVERWRITE の意味
D3D11_MAP_WRITE_NO_OVERWRITE は、入力アセンブラー (IA) ステージが使用しているデータに対してアプリケーションが書き込みを行わないことを示します。代わりに GPU は、同じバッファーの他の部分に書き込むことをアプリケーションに対して許可します。アプリケーションは、IA ステージで使用中のデータには絶対に上書きしないようにする必要があります。
たとえば、図 1 に示すバッファーについて考えてみます。頂点 4 ~ 6 を使用する Draw 呼び出しが発行された場合、このバッファーに対する Map を呼び出すアプリケーションは、Draw 呼び出しのレンダリング中にアクセスされる頂点には絶対に書き込まないようにする必要があります。
図形 1. さまざまな使用ステージにおける頂点データ
ただし、GPU は、現在処理中のフレームに関連して CPU の背後で多数のフレームを抱えていることが多いため、これを徹底することは容易ではありません。2 ~ 5 フレーム前の呼び出しによって現在使用されているリソースもあることから、リソースの現在使用中のセクションを追跡するのは困難であり、エラーが生じやすくなります。このため、D3D11_MAP_WRITE_NO_OVERWRITE を使用するときには、リソースの初期化されていない部分のみにアプリケーションで書き込むことをお勧めします。
D3D11_MAP_WRITE_DISCARD と D3D11_MAP_WRITE_NO_OVERWRITE を組み合わせて使用する一般的な方法
D3D11_MAP_WRITE_DISCARD および D3D11_MAP_WRITE_NO_OVERWRITE は通常、動的インデックス/頂点バッファーと組み合わせて使用されます。ただし、動的テクスチャーと併用することもできます。
この 2 つのフラグの一般的な使用方法として、カメラの現在の位置から見えるジオメトリを動的インデックス/頂点バッファーに書き込むというものがあります。あるフレーム上のバッファーに初めてデータを入力すると、D3D11_MAP_WRITE_DISCARD が設定された Map が呼び出されます。これによって、バッファーの以前の内容は無効になります。その後で、使用可能なすべてのデータがバッファーに書き込まれます。
同じフレーム内のバッファーに対する以降の書き込みでは、D3D11_MAP_WRITE_NO_OVERWRITE を使用する必要があります。これにより、前述の制約が守られている限り、GPU で使用されている可能性のあるリソースに CPU がアクセスできるようになります。
要件
ヘッダー: D3D11.h 宣言
ライブラリ: D3D11.lib 内容