効果 10 と効果 11 の違い
このトピックでは、効果 10 と効果 11 の違いについて説明します。
デバイス コンテキスト、スレッド処理、複製
ID3D10Device インターフェイスは、Direct3D 11 の ID3D11Device と ID3D11DeviceContext の 2 つのインターフェイスに分割されています。 複数の ID3D11DeviceContexts を作成して、複数のスレッドでの同時実行を容易にすることができます。 効果 11 は、この概念を Effects フレームワークに拡張します。
Effects 11 ランタイムはシングル スレッドです。 このため、複数のスレッドを同時に使用する単一の 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 { ... }
グループを使用すると、効果 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 では、次のテクスチャの種類がサポートされています。
順序付けされていないアクセス ビュー
効果 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
効果仮想マシン
関数の外部で複雑な式を評価した効果仮想マシンが削除されました。
次の複合式の例はサポートされていません。
- 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 など) に表示され、式 (SetPixelShader など) を渡すことができます。
ソースの可用性と場所
効果10は、D3D10.dllに分布した。 効果 11 はソースとして配布され、対応する Visual Studio ソリューションでコンパイルされます。 効果の種類のアプリケーションを作成するときは、これらのアプリケーションに Effects 11 ソースを直接含めることをおすすめします。
Direct3D 11 Update の効果から効果 11 を取得できます。
関連トピック