このトピックでは、効果 10 と効果 11 の違いを示します。
デバイス コンテキスト、スレッド処理、および複製
ID3D10Device インターフェイスは、Direct3D 11 の 2 つのインターフェイス (ID3D11Device と ID3D11DeviceContext) に分割されています。 複数のスレッドでの同時実行を容易にするために、複数の ID3D11DeviceContext を作成できます。 効果 11 は、この概念を Effects フレームワークに拡張します。
Effects 11 ランタイムはシングル スレッドです。 このため、複数のスレッドを同時に使用する 1 つの ID3DX11Effect インスタンスを使用しないでください。
複数のインスタンスで Effects 11 ランタイムを使用するには、個別の ID3DX11Effect インスタンスを作成する必要があります。 ID3D11DeviceContext もシングル スレッドであるため、Apply の各エフェクト インスタンスに異なる ID3D11DeviceContext インスタンスを渡す必要があります。 これらの個別のデバイス コンテキストを使用してコマンド リストを作成し、レンダリング スレッドが即時のデバイス コンテキストに適用できるようにします。
複数のスレッドで使用するために、同じ機能をカプセル化する複数の効果を作成する最も簡単な方法は、1 つの効果を作成してから複製コピーを作成することです。 複製には、最初から複数のコピーを作成するよりも次の利点があります。
- 複製ルーチンは、作成ルーチンよりも高速です。
- 複製されたエフェクトは、作成されたシェーダー、状態ブロック、およびクラス インスタンスを共有します (再作成する必要はありません)。
- 複製された効果は、定数バッファーを共有できます。
- 複製された効果は、現在の効果に一致する状態で始まります (変数値が最適化されているかどうか)。
詳細については、「効果 の複製を する」を参照してください。
効果プールとグループ
Direct3D 10 の効果プールの最も一般的な用途は、マテリアルをグループ化することでした。 エフェクトプールはエフェクト11から削除され、グループが追加されました。これは、マテリアルをグループ化するより効率的な方法です。
効果グループは、単なる一連の手法です。 詳細については、「効果グループ構文 (Direct3D 11)」を参照してください。
4 つの子効果と 1 つの効果プールを持つ次の効果階層について考えてみましょう。
// Effect Pool
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
// Effect Child 1
#include "EffectPool.fx"
technique10 GrassMaterialLowSpec { ... }
// Effect Child 2
#include "EffectPool.fx"
technique10 GrassMaterialHighSpec { ... }
// Effect Child 3
#include "EffectPool.fx"
technique10 WaterMaterialLowSpec { ... }
// Effect Child 4
#include "EffectPool.fx"
technique10 WaterMaterialHighSpec { ... }
Effects 11 では、グループを使用して同じ機能を実現できます。
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
新しいシェーダー ステージ
Direct3D 11 には、ハル シェーダー、ドメイン シェーダー、コンピューティング シェーダーの 3 つの新しいシェーダー ステージがあります。 エフェクト 11 は、頂点シェーダー、ジオメトリ シェーダー、ピクセル シェーダーと同様の方法でこれらを処理します。
3 つの新しい変数型が Effects 11 に追加されました。
- HullShader
- DomainShader
- ComputeShader
これらのシェーダーを手法で使用する場合は、"technique10" ではなく、その手法に "technique11" というラベルを付ける必要があります。 計算シェーダーは、他のグラフィックス状態 (他のシェーダー、状態ブロック、またはレンダー ターゲット) と同じパスに設定することはできません。
新しいテクスチャの種類
Direct3D 11 では、次の種類のテクスチャがサポートされています。
- AppendStructuredBuffer の
- ByteAddressBuffer
- ConsumeStructuredBuffer の
- StructuredBuffer
順序指定されていないアクセス ビュー
効果 11 では、新しい順序なしアクセス ビューの種類の取得と設定がサポートされています。 これはテクスチャと同様の方法で動作します。
次の効果 HLSL の例を考えてみましょう。
RWTexture1D<float> myUAV;
この変数は、次のように C++ で設定できます。
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );
Direct3D 11 では、次の順序なしのアクセス ビューの種類がサポートされています。
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
インターフェイスとクラス インスタンス
インターフェイスとクラスの構文については、「インターフェイスとクラスの」を参照してください。
エフェクトでインターフェイスとクラスを使用する方法については、「エフェクト のインターフェイスとクラス」を参照してください。
アドレス指定可能ストリーム出力
Direct3D 10 では、ジオメトリ シェーダーはデータの 1 つのストリームをストリーム出力ユニットとラスタライザー ユニットに出力できます。 Direct3D11 では、ジオメトリ シェーダーは最大 4 つのデータ ストリームをストリーム出力ユニットに出力でき、それらのストリームの最大 1 つはラスタライザー ユニットに出力できます。 この新機能を反映するために、ConstructGSWithSO 組み込みが更新されました。
詳細については、「Stream Out 構文の」を参照してください。
デバイスの状態の設定と設定解除
Effects 10 では、ID3D10EffectConstantBuffer::SetConstantBuffer および SetTextureBuffer関数を使用して、定数バッファーとテクスチャ バッファーをユーザーが管理できます。 これらの関数を呼び出した後、Effects 10 ランタイムは定数バッファーまたはテクスチャ バッファーを管理しなくなり、ユーザーは ID3D10Device インターフェイスを使用してデータを入力する必要があります。
Effects 11 では、次の呼び出しを使用して、状態ブロック (ブレンド状態、ラスタライザー状態、深度ステンシル状態、サンプラー状態) をユーザー管理にすることもできます。
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
これらの関数を呼び出した後、Effects 11 ランタイムは状態ブロック変数を管理しなくなり、値は変更されません。 状態ブロックは不変であるため、ユーザーは新しい状態ブロックを設定して値を変更する必要があることに注意してください。
定数バッファー、テクスチャ バッファー、および状態ブロックをユーザー以外のマネージド状態に戻すこともできます。 これらの変数の設定を解除した場合、Effects 11 ランタイムは必要に応じて引き続き更新します。 次の呼び出しを使用して、ユーザー管理変数の設定を解除できます。
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
Effects Virtual Machine
関数の外部で複雑な式を評価したエフェクト仮想マシンが削除されました。
次の複合式の例はサポートされていません。
- SetPixelShader( myPSArray( i * 3 + j ) );
- SetPixelShader( myPSArray( (float)i );
- FILTER = i + 2;
次の非複合式の例がサポートされています。
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] );uIndex は uint 変数です
- FILTER = i;
- FILTER = 異方性;
これらの式は、状態ブロック式 (FILTER など) に表示され、式 (SetPixelShader など) を渡すことができます。
ソースの可用性と場所
効果10は、D3D10.dllで配布された。 エフェクト 11 はソースとして配布され、対応する Visual Studio ソリューションでコンパイルされます。 効果の種類のアプリケーションを作成する場合は、それらのアプリケーションに直接 Effects 11 ソースを含めうことをお勧めします。
Direct3D 11 Update のエフェクトからエフェクト 11 を取得できます。
関連トピック