效果 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:
- 赫爾沙德
- 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 運行時間就不會再管理狀態區塊變數,而且會有值保持不變。 請注意,因為狀態區塊是不可變的,所以用戶必須設定新的狀態區塊來變更值。
您也可以將常數緩衝區、紋理緩衝區和狀態區塊還原為非使用者管理狀態。 如果您取消設定這些變數,效果 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 = ANISOTROPIC;
這些表達式可以出現在狀態區塊表達式中(例如 FILTER)和傳遞表示式(例如 SetPixelShader)。
來源可用性和位置
效果 10 分散於 D3D10.dll中。 效果 11 會以來源的形式散發,並搭配對應的 Visual Studio 解決方案進行編譯。 當您建立效果類型應用程式時,建議您直接將這些應用程式中包含 Effects 11 來源。
您可以從 Direct3D 11 Update 的效果取得效果 11。
相關主題