共用方式為


效果 10 和效果 11 之間的差異

本主題顯示效果 10 與效果 11 之間的差異。

裝置內容、線程和複製

ID3D10Device 介面已分割成 Direct3D 11 中的兩個介面:ID3D11Device 和 ID3D11DeviceContext。 您可以建立多個 ID3D11DeviceContexts,以促進多個線程上的並行執行。 效果 11 會將這個概念延伸至 Effects 架構。

Effects 11 運行時間是單個線程。 基於這個理由,您不應該同時使用單一 ID3DX11Effect 實例與多個線程。

若要在多個實例上使用 Effects 11 運行時間,您必須建立個別的 ID3DX11Effect 實例。 由於ID3D11DeviceContext 也是單個線程,因此您應該將不同的ID3D11DeviceContext實例傳遞至Apply上的每個效果實例。 您可以使用這些個別的裝置內容來建立命令清單,讓轉譯線程可以在立即的裝置內容上套用它們。

若要建立多個效果,封裝相同功能,以用於多個線程,最簡單的方式是建立一個效果,然後製作複製的複本。 複製在從頭建立多個復本具有下列優點:

  1. 複製例程比建立例程快。
  2. 複製的效果會共用建立的著色器、狀態區塊和類別實例(因此不需要重新建立它們)。
  3. 複製的效果可以共用常數緩衝區。
  4. 複製的效果會以符合目前效果的狀態開始(不論其是否已優化變數值)。

如需詳細資訊,請參閱 複製效果

效果集區和群組

到目前為止,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::SetConstantBufferSetTextureBuffer 函式,讓使用者管理常數緩衝區和紋理緩衝區。 呼叫這些函式之後,Effects 10 運行時間就不會再管理常數緩衝區或紋理緩衝區,而且用戶必須使用ID3D10Device介面填滿數據。

在 Effects 11 中,您也可以使用下列呼叫,將狀態區塊(混合狀態、轉譯器狀態、深度樣板狀態和取樣器狀態)設為使用者管理:

呼叫這些函式之後,Effects 11 運行時間就不會再管理狀態區塊變數,而且會有值保持不變。 請注意,因為狀態區塊是不可變的,所以用戶必須設定新的狀態區塊來變更值。

您也可以將常數緩衝區、紋理緩衝區和狀態區塊還原為非使用者管理狀態。 如果您取消設定這些變數,效果 11 運行時間會在必要時繼續更新它們。 您可以使用下列呼叫來取消設定使用者受控變數:

效果虛擬機

已移除評估函式外部複雜表達式的效果虛擬機。

不支援下列複雜表示式範例:

  1. SetPixelShader( myPSArray( i * 3 + j ) ;
  2. SetPixelShader( myPSArray( (float)i ] :
  3. FILTER = i + 2;

支援下列非複雜表示式範例:

  1. SetPixelShader(myPS ):
  2. SetPixelShader(myPS[i] ] ;
  3. SetPixelShader(myPS[ uIndex ] ] ;uIndex 是 uint 變數
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

這些表達式可以出現在狀態區塊表達式中(例如 FILTER)和傳遞表示式(例如 SetPixelShader)。

來源可用性和位置

效果 10 分散於 D3D10.dll中。 效果 11 會以來源的形式散發,並搭配對應的 Visual Studio 解決方案進行編譯。 當您建立效果類型應用程式時,建議您直接將這些應用程式中包含 Effects 11 來源。

您可以從 Direct3D 11 Update 效果取得效果 11。

效果 (Direct3D 11)