效果 10 與效果 11 之間的差異
本主題顯示效果 10 與效果 11 之間的差異。
裝置內容、執行緒和複製
ID3D10Device 介面已分割成 Direct3D 11 中的兩個介面:ID3D11Device 和 ID3D11DeviceCoNtext。 您可以建立多個 ID3D11DeviceCoNtexts,以協助在多個執行緒上並存執行。 效果 11 會將這個概念延伸到 Effects 架構。
Effects 11 執行時間是單一執行緒。 基於這個理由,您不應該同時使用具有多個執行緒的單一 ID3DX11Effect 實例。
若要在多個實例上使用 Effects 11 執行時間,您必須建立個別的 ID3DX11Effect 實例。 因為 ID3D11DeviceCoNtext 也是單一執行緒,所以您應該將不同的 ID3D11DeviceCoNtext 實例傳遞給 Apply 上的每個效果實例。 您可以使用這些個別的裝置內容來建立命令清單,讓轉譯執行緒可以在立即的裝置內容上套用它們。
建立多個效果以封裝相同功能的最簡單方式,用於多個執行緒,就是建立一個效果,然後製作複製的複本。 複製具有下列優點,優於從頭建立多個複本:
- 複製常式比建立常式更快。
- 複製的效果會共用建立的著色器、狀態欄塊和類別實例 (,因此不需要重新建立) 。
- 複製的效果可以共用常數緩衝區。
- 複製的效果會從符合目前效果 (變數值的狀態開始,不論它是否已優化) 。
如需詳細資訊 ,請參閱複製效果 。
效果集區和群組
到目前為止,Direct3D 10 中最普遍的效果集區用法是用於分組材質。 效果集區已從效果 11 中移除,且已新增群組,這是更有效率的群組材質方法。
效果群組只是一組技術。 如需詳細資訊 ,請參閱效果群組語法 (Direct3D 11) 。
請考慮具有四個子效果和一個效果集區的下列效果階層:
// 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 中有三個新的著色器階段:殼層著色器、網域著色器和計算著色器。 效果 11 會以類似頂點著色器、幾何著色器和圖元著色器的方式來處理這些著色器。
已將三個新的變數類型新增至 Effects 11:
- HullShader
- DomainShader
- ComputeShader
如果您在技術中使用這些著色器,則必須將這項技術標記為 「technique11」,而不是 「technique10」。 計算著色器無法設定與其他圖形狀態相同的傳遞, (其他著色器、狀態欄塊或轉譯目標) 。
新的紋理類型
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 中,幾何著色器可以將一個資料流程輸出至資料流程輸出單位和點陣化單位。 在 Direct3D11 中,幾何著色器最多可以將四個數據流輸出至資料流程輸出單位,以及最多其中一個資料流程輸出到點陣化單位。 ConstructGSWithSO內建函式已更新,以反映這項新功能。
如需詳細資訊 ,請參閱串流輸出語法 。
設定和取消設定裝置狀態
在 Effects 10 中,您可以使用 ID3D10EffectConstantBuffer::SetConstantBuffer 和 SetTextureBuffer 函式來管理常數緩衝區和紋理緩衝區。 呼叫這些函式之後,Effects 10 執行時間就不會再管理常數緩衝區或紋理緩衝區,而且使用者必須使用 ID3D10Device 介面填滿資料。
在 Effects 11 中,您也可以使用下列呼叫,讓狀態欄塊 (混合狀態、點陣化狀態、深度樣板狀態,以及取樣器狀態) 使用者管理:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
呼叫這些函式之後,Effects 11 執行時間就不會再管理狀態欄塊變數,而且會有值保持不變。 請注意,因為狀態欄塊是不可變的,所以使用者必須設定新的狀態欄塊來變更值。
您也可以將常數緩衝區、紋理緩衝區和狀態欄塊還原為非使用者管理狀態。 如果您取消設定這些變數,Effects 11 執行時間會視需要繼續更新這些變數。 您可以使用下列呼叫來取消設定使用者 Managed 變數:
- 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 = ANISOTROPIC;
這些運算式可能會出現在狀態欄塊運算式 (,例如 FILTER) ,並將運算式傳遞 (,例如 SetPixelShader) 。
來源可用性和位置
效果 10 分散在D3D10.dll中。 效果 11 會以來源的形式散發,並搭配對應的 Visual Studio 解決方案進行編譯。 當您建立效果類型應用程式時,建議您直接將這些應用程式中包含 Effects 11 來源。
您可以從 Direct3D 11 Update 的 Effects 取得 Effects 11。
相關主題