Direct3D 11 のリソースの概要
リソースはシーンの構成要素です。 Direct3D がシーンの解釈とレンダリングに使用するほとんどのデータが含まれています。 リソースは、Direct3D パイプラインからアクセスできるメモリ内の領域です。 リソースには、ジオメトリ、テクスチャ、シェーダー データという種類のデータが含まれています。 このトピックでは、バッファーやテクスチャなどの Direct3D リソースについて説明します。
厳密に型指定されたリソースまたは型指定されていないリソースを作成できます。リソースに読み取りと書き込みの両方のアクセス許可があるかどうかを制御できます。リソースにアクセスできるのは、CPU、GPU、またはその両方のみです。 各パイプライン ステージでは最大 128 個のリソースをアクティブにできます。
Direct3D では、範囲外でアクセスされるすべてのリソースに対して 0 が返されることを保証します。
Direct3D リソースのライフサイクルは次のとおりです。
- ID3D11Device インターフェイスのいずれかの create メソッドを使用してリソースを作成します。
- コンテキストと ID3D11DeviceContext インターフェイスのいずれかの set メソッドを使用して、リソースをパイプラインにバインドします。
- リソース インターフェイスの Release メソッドを呼び出して、リソースの割り当てを解除します。
このセクションのトピックは次のとおりです。
厳密な入力と弱い入力
リソースのレイアウト (またはメモリ使用量) を完全に指定する方法は次の 2 つです。
- 型指定済み - リソースの作成時に型を完全に指定します。
- 型なし - リソースがパイプラインにバインドされるときに、型を完全に指定します。
完全に型指定されたリソースを作成すると、そのリソースの形式はそのリソースを作成したときの形式に制限されます。 これによりランタイムによるアクセスが最適化されます。特に、アプリケーションでマップできないことを示すフラグを使ってリソースを作成する場合は有効です。 特定の種類で作成されたリソースは、D3D10_DDI_BIND_PRESENT フラグを使用してリソースが作成されていない限り、ビュー メカニズムを使用して再解釈できません。 D3D10_DDI_BIND_PRESENTが設定されている場合は、元のリソースが完全に型指定された状態で作成された場合でも、適切なファミリの完全に型指定されたメンバーのいずれかを使用して、これらのリソースにレンダー ターゲットまたはシェーダー リソース ビューを作成できます。
型が少ないリソースでは、リソースが最初に作成されるときに、データ型は不明です。 アプリケーションでは、使用可能な型の小さい形式から選択する必要があります ( 「DXGI_FORMAT」を参照)。 また、割り当てるメモリのサイズと、ランタイムでミップマップのサブテクスチャを生成する必要があるかどうかも指定しなければなりません。 ただし、正確なデータ形式 (メモリが整数、浮動小数点値、符号なし整数などとして解釈されるかどうか) は、リソースが リソース ビューを使用してパイプラインにバインドされるまで決定されません。 テクスチャ形式はテクスチャがパイプラインにバインドされるまで柔軟性が維持されるため、このリソースは弱く型指定されたストレージと呼ばれます。 弱く型指定されたストレージには、コンポーネントの数と各コンポーネントのビット数が両方の形式で同じである限り、別の形式で再利用または再解釈できるという利点があります。
各パイプライン ステージに、それぞれの場所での形式を完全に修飾する一意のビューがある限り、1 つのリソースを複数のパイプライン ステージにバインドすることができます。 たとえば、DXGI_FORMAT_R32G32B32A32_TYPELESS形式で作成されたリソースは、パイプライン内の異なる場所にあるDXGI_FORMAT_R32G32B32A32_FLOATとDXGI_FORMAT_R32G32B32A32_UINTとして同時に使用できます。
リソース ビュー
リソースは、複数のパイプライン ステージで共有できるように、汎用メモリ形式で格納できます。 パイプライン ステージは、ビューを使用してリソース データを解釈します。 リソース ビューは、特定のコンテキストで使用できるようにリソース データをキャストするのと概念的に似ています。
ビューは、型指定なしのリソースと共に使用できます。 つまり、コンパイル時にリソースを作成し、リソースがパイプラインにバインドされるときにデータ型を宣言できます。 型なしのリソース用に作成されたビューは、常にコンポーネントごとに同じ数のビットを持ちます。データの解釈方法は、指定された形式によって異なります。 指定する形式は、リソースの作成時に使用される型指定なしの形式と同じファミリの形式である必要があります。 たとえば、R8G8B8A8_TYPELESS形式で作成されたリソースは、両方の形式がメモリ内で同じサイズであっても、R32_FLOAT リソースとして表示できません。
ビューには、シェーダーで深度/ステンシル サーフェスを読み取る機能、1 つのパスで動的キューブマップを生成する機能、ボリュームの複数のスライスに同時にレンダリングする機能など、他の機能も公開されています。
リソース インターフェイス | 説明 |
---|---|
ID3D11DepthStencilView | 深度ステンシル テスト中にテクスチャ リソースにアクセスします。 |
ID3D11RenderTargetView | レンダー ターゲットとして使用されるテクスチャ リソースにアクセスします。 |
ID3D11ShaderResourceView | 定数バッファー、テクスチャ バッファー、テクスチャ、サンプラーなどのシェーダー リソースにアクセスします。 |
ID3D11UnorderedAccessView | ピクセル シェーダーまたはコンピューティング シェーダーを使用して、順序付けられていないリソースにアクセスします。 |
バッファーの生のビュー
生バッファーは、 バイト アドレス バッファーとも呼ばれ、生アクセスを必要とするビットのバッグ、つまり、1 ~ 4 個の 32 ビット型レス アドレス値のチャンクを介して便利にアクセスできるバッファーと考えることができます。 バッファーへのビューを作成するために次のいずれかのメソッドを呼び出すときに、バッファー (またはバッファーの生ビュー) に生でアクセスすることを指定します。
- バッファーにシェーダー リソース ビュー (SRV) を作成するには、フラグ D3D11_BUFFEREX_SRV_FLAG_RAWで ID3D11Device::CreateShaderResourceView を呼び出します。 このフラグは、D3D11_BUFFEREX_SRV構造体の Flags メンバーで指定します。 id3D11Device::CreateShaderResourceView の pDesc パラメーターがポイントするD3D11_SHADER_RESOURCE_VIEW_DESC構造体の BufferEx メンバーで、D3D11_BUFFEREX_SRVを設定します。 また、D3D11_SHADER_RESOURCE_VIEW_DESC の ViewDimension メンバーにD3D11_SRV_DIMENSION_BUFFEREX値を設定して、SRV が未加工のビューであることを示します。
- バッファーに対して順序付けられていないアクセス ビュー (UAV) を作成するには、フラグをD3D11_BUFFER_UAV_FLAG_RAWして ID3D11Device::CreateUnorderedAccessView を呼び出します。 このフラグは、D3D11_BUFFER_UAV構造体の Flags メンバーで指定します。 id3D11Device::CreateUnorderedAccessView の pDesc パラメーターがポイントするD3D11_UNORDERED_ACCESS_VIEW_DESC構造体の Buffer メンバーで、D3D11_BUFFER_UAVを設定します。 また、 D3D11_UNORDERED_ACCESS_VIEW_DESC の ViewDimension メンバーに D3D11_UAV_DIMENSION_BUFFER 値を設定して、UAV が未加工のビューであることを示します。
生バッファーを操作する場合は、HLSL ByteAddressBuffer オブジェクト型と RWByteAddressBuffer オブジェクト型を使用できます。
バッファーに対して生のビューを作成するには、まず ID3D11Device::CreateBuffer を D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS フラグで呼び出して、基になるバッファー リソースを作成する必要があります。 このフラグは、ID3D11Device::CreateBuffer の pDesc パラメーターがポイントするD3D11_BUFFER_DESC構造体の MiscFlags メンバーで指定します。 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS フラグをD3D11_RESOURCE_MISC_BUFFER_STRUCTUREDと組み合わせることはできません。 また、D3D11_BUFFER_DESCの BindFlags でD3D11_BIND_CONSTANT_BUFFERを指定した場合は、MiscFlags でD3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWSを指定することもできません。 定数バッファーには他のビューと組み合わせることができない制約が既に存在するため、これは生のビューだけの制限ではありません。
上記の無効なケース以外に、 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWSを使用してバッファーを作成する場合、 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWSを設定するのではなく、機能に制限はありません。 つまり、Direct3D で可能な任意の数の方法で、生以外のアクセスにこのようなバッファーを使用できます。 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS フラグを指定した場合は、使用可能な機能のみを増やします。
関連トピック