Direct3D 9 至 Direct3D 10 考慮 (Direct3D 10)

下列頁面提供 Direct3D 9 與 Direct3D 10 之間主要差異的基本大綱。 以下概述提供一些深入解析,可協助開發人員使用 Direct3D 9 體驗來探索 Direct3D 10 並與其產生關聯。

雖然本主題中的資訊會比較 Direct3D 9 與 Direct3D 10,因為 Direct3D 11 是以 Direct3D 10 和 10.1 所做的改進為基礎,因此您也需要此資訊從 Direct3D 9 移轉至 Direct3D 11。 如需將 Direct3D 10 移轉至 Direct3D 11 的相關信息,請參閱 移轉至 Direct3D 11

Direct3D 10 中重大結構變更的概觀

使用 Direct3D 10 裝置轉譯的程式在結構上類似於 Direct3D 9。

  • 設定頂點數據流來源
  • 在 Direct3D 10 中設定輸入設定(在 Direct3D 9 中設定頂點數據流宣告)
  • 宣告基本拓撲
  • 設定紋理
  • 設定狀態物件
  • 設定著色器
  • Draw

Draw 呼叫會將作業系結在一起;Draw 呼叫之前的呼叫順序是任意的。 Direct3D 10 API 設計的主要差異如下:

  • 拿掉固定函式
  • 拿掉 CAPS 位 - 保證 Direct3D 10 的基本功能集
  • 更嚴格的管理:資源存取、裝置狀態、著色器常數、著色器連結(階段之間的輸入和輸出)
  • API 進入點名稱變更會反映虛擬 GPU 記憶體 (Map() 而非 Lock()的使用方式。
  • 偵錯層可以在建立時新增至裝置
  • 基本拓撲現在是明確狀態(與 Draw 呼叫分開)
  • 明確著色器常數現在會儲存在常數緩衝區中
  • 著色器撰寫完全在 HLSL 中完成。 HLSL 編譯程式現在位於主要 Direct3D 10 DLL 中。
  • 新的可程式化階段 - 幾何著色器
  • 移除 BeginScene()/EndScene()
  • 在新的元件中實作的常見 2D、焦點和配接器管理功能:DXGI

拿掉固定函式

有時候,即使在完全利用可程式化管線的 Direct3D 9 引擎中,仍有一些區域相依於固定函式 (FF) 管線。 最常見的區域通常與UI的螢幕空間對齊轉譯有關。 基於這個理由,您可能需要建置 FF 模擬著色器或一組著色器,以提供必要的取代行為。

本檔包含一份白皮書,其中包含最常見的 FF 行為取代著色器來源(請參閱 固定函式 EMU 範例)。 某些固定函式像素行為,包括Alpha測試已移至著色器。

裝置物件建立時間驗證

Direct3D 10 管線已從硬體與軟體的頭開始重新設計,主要目的是降低 CPU 額外負荷(在繪製時間)。 為了降低成本,所有類型的裝置數據都已指派物件,並具有裝置本身所提供的明確建立方法。 這可在物件建立時間進行嚴格的數據驗證,而不是在 Draw 呼叫期間進行,就像 Direct3D 9 一樣。

引擎抽象概念/分離

想要同時支援 Direct3D 9 和 Direct3D 10 的應用程式必須讓轉譯層從程式碼基底的其餘部分抽象化。 有許多方法可以達成此目的,但其中所有方法的關鍵是較低層級 Direct3D 裝置的抽象層設計。 所有系統都應該透過一般層與硬體通訊,其設計目的是提供 GPU 資源和低階類型管理。

直接移除 Direct3D 9 相依性

移植大型且先前測試的程式代碼基底時,請務必將程式代碼變更的數量降到絕對必要,以保留先前在程式碼中測試的行為。 最佳做法包括清楚記錄專案使用批註變更的位置。 此工作的批註標準通常很有用,可快速瀏覽程式代碼基底。

以下是可用於這項工作的標準單行/開始區塊批注範例清單。

項目 說明
已移除 Direct3D 10
使用這個位置,移除程式代碼行/區塊
Direct3D 10 需要更新
它有助於將其他附註新增至 NEED UPDATE 批注,以建議稍後應該使用哪些工作/新的 API 來瀏覽程式代碼以進行行為轉換。 在發生 \\ Direct3D 10 NEEDS UPDATE 時,也應該大量使用 assert(false) 以確保您不知情地執行錯誤程序代碼
Direct3D 10 已變更
發生重大變更的區域應保留以供未來參考,但已加上批注
Direct3D 10 END
結束代碼區塊限定符

 

對於多行來源,您也應該使用 C 樣式 /* */ 批注,但在這些區域周圍新增相關的開始/結束批注。

快速解決應用程式建置問題的訣竅

覆寫 Direct3D 9 類型

插入包含 Direct3D 9 基底類型之類型定義/覆寫的高階頭檔可能很有用。Direct3D 10 標頭不再支持這些基底類型。 這可協助您將程式代碼和介面中的變更量降到最低,其中 Direct3D 9 類型與新定義的 Direct3D 10 類型有直接對應。 此方法也適用於將程式代碼行為保存在一個原始程序檔中。 在此情況下,最好定義版本中性/一般命名的類型,描述用於轉譯的常見建構,但跨越 Direct3D 9 和 Direct3D 10 API。 例如:

#if defined(D3D9)
typedef IDirect3DIndexBuffer9   IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9  IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer            IDirect3DIndexBuffer;
typedef ID3D10Buffer            IDirect3DVertexBuffer
#endif

其他 Direct3D 10 特定範例包括:

typedef ID3D10TextureCube   IDirect3DCubeTexture;
typedef ID3D10Texture3D     IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT      D3DVIEWPORT;
typedef ID3D10VertexShader  IDirect3DVertexShader;
typedef ID3D10PixelShader   IDirect3DPixelShader;

建議您使用最新版本的 Microsoft Visual Studio 來開發 Direct3D 10 和 Windows Vista 應用程式。 不過,您可以使用舊版 Visual Studio 來建置相依於 Direct3D 10 的 Windows Vista 應用程式。 Direct3D 10 是 Windows Vista 平台元件,其具有下列 lib 上的相依性(如同 Server 2003 SP1 平臺 SDK:BufferOverflowU.lib 需要解決任何buffer_security檢查鏈接器問題。

模擬裝置 CAP

許多應用程式都包含程式代碼區域,這些區域相依於可用的裝置 CAPS 數據。 藉由覆寫裝置列舉並強制裝置 CAPS 合理值來解決此問題。 規劃稍後重新流覽 CAPS 相依性的區域,以便盡可能完整移除 CAPS。

驅動 Direct3D 10 API

本節著重於 Direct3D 10 API 所造成的行為變更。

資源建立

Direct3D 10 API 已將資源設計為泛型緩衝區類型,這些資源具有根據計劃使用量的特定系結旗標。 為了在管線中轉譯至頂點緩衝區等案例,選擇此設計點以方便幾乎無處不在的資源存取,然後立即繪製結果,而不會中斷 CPU。 下列範例示範頂點緩衝區和索引緩衝區的配置,您可以在其中看到資源描述只與 GPU 資源系結旗標不同。

Direct3D 10 API 已提供紋理協助程式方法來明確建立紋理類型資源,但如您所想像,這些確實是協助程式函式。

  • CreateTexture2D()
  • CreateTextureCube()
  • CreateTexture3D()

以 Direct3D 10 為目標時,您可能會想要在資源建立期間配置比使用 Direct3D 9 更多的專案。 這在建立轉譯目標緩衝區和紋理時會變得最為明顯,您需要在其中也建立檢視以存取緩衝區,並在裝置上設定資源。

教學課程 1:Direct3D 10 基本概念

注意

Direct3D 10 和更新版本的 Direct3D 擴充 DDS 檔案格式,以支援新的 DXGI 格式、紋理數位和 Cube 對應數位。 如需 DDS 檔格式擴展名的詳細資訊,請參閱 DDS 的程式設計指南。

 

檢視

檢視是儲存在像素緩衝區中的數據特別具型別的介面。 資源可以同時配置數個檢視,這項功能會在此 SDK 中包含的單一傳遞轉譯至 Cubemap 範例中反白顯示。

資源存取上的程式設計人員指南頁面

CubeMap 範例

靜態與動態資源存取

為了獲得最佳效能,應用程式應該根據數據的靜態與動態本質來分割其數據使用方式。 Direct3D 10 的設計目的是利用這種方法,因此,資源存取規則已大幅收緊於 Direct3D 9。 針對靜態資源,您應該在建立期間以數據填入資源。 如果您的引擎是圍繞 Direct3D 9 的 Create、Lock、Fill、Unlock 設計點所設計,您可以使用暫存資源和資源介面上的 UpdateSubResource 方法,延遲從建立時間擴展。

Direct3D 10 效果

使用 Direct3D 10 效果系統超出本文的範圍。 系統已撰寫,以充分利用 Direct3D 10 所提供的架構優點。 如需其使用的詳細資訊,請參閱效果 (Direct3D 10) 一節。

沒有效果的 HLSL

Direct3D 10 著色器管線可能不受 Direct3D 10 效果系統的使用所驅動。 請注意,在此實例中,所有常數緩衝區、著色器、取樣器和紋理系結都必須由應用程式本身管理。 如需詳細資訊,請參閱本檔的範例連結和下列各節:

沒有效果的 HLSL 範例

著色器編譯

Direct3D 10 HLSL 編譯程式為 HLSL 語言定義帶來增強功能,因此能夠在 2 種模式中運作。 如需 Direct3D 9 樣式內建函式和語意的完整支援,應該使用相容性 MODE 旗標來叫用編譯,而此旗標可以根據每個編譯來指定。

您可以在 HLSL 找到著色器模型 4.0 特定的 HLSL 語言語意和 Direct3D 10 的內部函數。 Direct3D 9 HLSL 語法的重大變更,最注意的是紋理存取區域。 新的語法是編譯程式在相容性模式之外唯一支援的表單。

注意

Direct3D 10 編譯程式類型 API(D3D10CompileShader D3D10CompileEffectFromMemory)是由在 Windows Vista 和更新版本中執行的 Direct3D 10、10.1 和 11 運行時間所提供。 Direct3D 10 編譯程式類型 API 的功能與 DirectX SDK 中隨附的 HLSL 編譯程式功能相同(2006 年 12 月)。 此 HLSL 編譯程式不支援 Direct3D 10.1 配置檔(vs_4_1、ps_4_1、gs_4_1、fx_4_1),而且缺少許多優化和改善。 您可以從最新的舊版 DirectX SDK 取得支援 Direct3D 10.1 配置檔的 HLSL 編譯程式。 如需舊版 DirectX SDK 的相關信息,請參閱 DirectX SDK 的位置?。 您可以從 Windows SDK 取得最新的 HLSL Fxc.exe 命令行編譯程式和 D3DCompiler API。

 

建立著色器資源

不過,在 Direct3D 10 效果系統外部建立已編譯的著色器實例的方式與 Direct3D 9 非常類似,但在 Direct3D 10 中,請務必保留著色器輸入簽章,以供稍後使用。 簽章預設會當做著色器 Blob 的一部分傳回,但可能需要擷取以減少記憶體需求。 如需詳細資訊,請參閱 在 Direct3D 10 中使用著色器。

著色器 反思 層介面

著色器反射層是可取得著色器需求相關信息的介面。 建立輸入元件連結時,這特別有用(如下所示),您可能需要周遊著色器輸入需求,以確保您將正確的輸入結構提供給著色器。 您可以建立反映層介面的實例,同時建立已編譯著色器的實例。

著色器反射層會取代提供類似功能的 D3DX9 方法。 例如,IsParameterUsed 會由 GetDesc 方法取代。

輸入組合器版面配置 - 頂點著色器/輸入數據流連結

輸入組合器 (IA) 會取代 Direct3D 9 樣式的頂點數據流宣告,而且其描述結構的形式非常類似。 IA 帶來的主要差異在於所建立的 IA 配置對象必須直接對應至特定格式的著色器輸入簽章。 建立以將輸入數據流連結至著色器的對應物件,可用於著色器輸入簽章符合用來建立輸入配置之著色器的著色器數目。

為了最好使用靜態數據驅動管線,您應該考慮輸入數據流格式的排列方式,以可能的著色器輸入簽章,並儘快建立IA配置物件實例,並盡可能重複使用它們。

著色器無效程式代碼移除的影響

下一節詳述 Direct3D 9 與 Direct3D 10 之間可能需要仔細處理引擎程序代碼的重大差異。 包含條件表達式的著色器通常會在編譯程式中移除特定程式代碼路徑。 在 Direct3D 9 中,當未使用時,可能會移除兩種輸入(標示為移除):簽章輸入(如下列範例)和常數輸入。 如果常數緩衝區的結尾包含未使用的專案,著色器中的size宣告將會反映常數緩衝區的大小,而不會在結尾沒有未使用的專案。 這兩種輸入都會保留在簽章或常數緩衝區 Direct3D 10 中,在常數緩衝區結尾未使用的常數輸入時,會有特殊例外狀況。 處理大型著色器和建立輸入配置時,這可能會對引擎造成影響。 編譯程式中的無效程式代碼優化所移除的元素仍必須在輸入結構中宣告。 下列範例為其示範:

頂點著色器輸入結構範例

struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};

* Direct3D 9 無效程式代碼移除會移除著色器中的宣告,因為條件式無效程式代碼移除

float4x4  g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant

VS_INPUT main(VS_INPUT i) 
{
    VS_INPUT o;
    o.pos = mul( i.pos, g_WorldViewProjMtx);
    o.uv1 = i.uv1;
    if ( g_bLightMapped )
    {
        o.uv2 = i.uv2;
    }
    return o;
}

或者,您可以讓常數成為具有下列宣告的編譯時間常數更為明顯:

#define LIGHT_MAPPED false

在上述範例中,在 Direct3D 9 下,由於編譯程式中的無效程式代碼優化,所以會移除 uv2 元素。 在 Direct3D 10 下,仍然會移除無效程式代碼,但著色器輸入組合器配置需要定義輸入數據存在。 著色器反射層會以一般方式提供處理這種情況的方法,讓您能夠周遊著色器輸入需求,並確保提供對著色器簽章對應的輸入數據流完整描述。

以下是偵測函式簽章中語意名稱/索引是否存在的範例函式:

// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
    D3D10_SHADER_DESC               shaderDesc;
    D3D10_SIGNATURE_PARAMETER_DESC  paramDesc;

    Assert(pReflector);
    Assert(SemanticName);

    pReflector->GetDesc(&shaderDesc);

    for (UINT k=0; k<shaderDesc.InputParameters; k++)
    {
        pReflector->GetInputParameterDesc( k, &paramDesc);
        if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex) 
            return true;
    }

    return false;
}

狀態物件建立

移植引擎程式代碼時,它可能有助於一開始使用預設的狀態物件集,並停用所有 Direct3D 9 裝置轉譯狀態/紋理狀態設定。 這會導致轉譯成品,但這是啟動並執行專案的最快速方式。 您稍後可以建構狀態物件管理系統,其可以使用複合索引鍵來啟用使用狀態物件數目的最大值。

移植紋理

支援的檔案格式

建立或儲存圖形檔案的 D3DXxxCreateXXXD3DXxxSaveXXX 函式(例如 D3DX10CreateTextureFromFile)支援 Direct3D 10 中的一組不同的檔格式,而不是在 Direct3D 9 中:

檔案格式 Direct3D 9 Direct3D 10
.bmp x x
.jpg x x
.tga x
.png x x
.dds x x
。Ppm x
.dib x
。Hdr x
。烤 瓷 x
.tiff x
.gif x
.tif x

 

如需詳細資訊,請比較 Direct3D 9 D3DXIMAGE_FILEFORMAT 列舉與 Direct3D 10 D3DX10_IMAGE_FILE_FORMAT 列舉。

注意

D3DX (D3DX 9、D3DX 10 和 D3DX 11) 公用程序連結庫已被取代為 Windows 8。 針對紋理文件處理,建議您使用 DirectXTex

 

對應紋理格式

下表顯示從 Direct3D 9 到 Direct3D 10 的紋理格式對應。 DXGI 中未提供格式的任何內容都必須由公用程式例程轉換。

Direct3D 9 格式 Direct3D 10 格式
D3DFMT_UNKNOWN DXGI_FORMAT_UNKNOWN
D3DFMT_R8G8B8 無法使用
D3DFMT_A8R8G8B8 DXGI_FORMAT_B8G8R8A8_UNORM & DXGI_FORMAT_B8G8R8A8_UNORM_SRGB ー
D3DFMT_X8R8G8B8 DXGI_FORMAT_B8G8R8X8_UNORM & DXGI_FORMAT_B8G8R8X8_UNORM_SRGB ー
D3DFMT_R5G6B5 DXGI_FORMAT_B5G6R5_UNORM ー
D3DFMT_X1R5G5B5 無法使用
D3DFMT_A1R5G5B5 DXGI_FORMAT_B5G5R5A1_UNORM ー
D3DFMT_A4R4G4B4 DXGI_FORMAT_B4G4R4A4_UNORM!
D3DFMT_R3G3B2 無法使用
D3DFMT_A8 DXGI_FORMAT_A8_UNORM
D3DFMT_A8R3G3B2 無法使用
D3DFMT_X4R4G4B4 無法使用
D3DFMT_A2B10G10R10 DXGI_FORMAT_R10G10B10A2
D3DFMT_A8B8G8R8 DXGI_FORMAT_R8G8B8A8_UNORM 和 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
D3DFMT_X8B8G8R8 無法使用
D3DFMT_G16R16 DXGI_FORMAT_R16G16_UNORM
D3DFMT_A2R10G10B10 無法使用
D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_UNORM
D3DFMT_A8P8 無法使用
D3DFMT_P8 無法使用
D3DFMT_L8 DXGI_FORMAT_R8_UNORM注意:使用著色器中的 .r swizzle 將紅色複製到其他元件,以取得 D3D9 行為。
D3DFMT_A8L8 DXGI_FORMAT_R8G8_UNORM注意:使用著色器中的 swizzle .rrrg 來複製紅色,並將綠色移至 Alpha 元件以取得 D3D9 行為。
D3DFMT_A4L4 無法使用
D3DFMT_V8U8 DXGI_FORMAT_R8G8_SNORM
D3DFMT_L6V5U5 無法使用
D3DFMT_X8L8V8U8 無法使用
D3DFMT_Q8W8V8U8 DXGI_FORMAT_R8G8B8A8_SNORM
D3DFMT_V16U16 DXGI_FORMAT_R16G16_SNORM
D3DFMT_W11V11U10 無法使用
D3DFMT_A2W10V10U10 無法使用
D3DFMT_UYVY 無法使用
D3DFMT_R8G8_B8G8 DXGI_FORMAT_G8R8_G8B8_UNORM (在 DX9 中,數據已相應增加 255.0f,但可以在著色器程式代碼中處理)。
D3DFMT_YUY2 無法使用
D3DFMT_G8R8_G8B8 DXGI_FORMAT_R8G8_B8G8_UNORM (在 DX9 中,數據已相應增加 255.0f,但可以在著色器程式代碼中處理)。
D3DFMT_DXT1 DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB
D3DFMT_DXT2 DXGI_FORMAT_BC1_UNORM和DXGI_FORMAT_BC1_UNORM_SRGB注意:從 API/硬體的觀點來看,DXT1 和 DXT2 相同...唯一的差異是「預乘 Alpha」,可由應用程式追蹤,而且不需要個別的格式。
D3DFMT_DXT3 DXGI_FORMAT_BC2_UNORM和 DXGI_FORMAT_BC2_UNORM_SRGB
D3DFMT_DXT4 DXGI_FORMAT_BC2_UNORM和DXGI_FORMAT_BC2_UNORM_SRGB注意:從 API/硬體的觀點來看,DXT3 和 DXT4 相同...唯一的差異是「預乘 Alpha」,可由應用程式追蹤,而且不需要個別的格式。
D3DFMT_DXT5 DXGI_FORMAT_BC3_UNORM和 DXGI_FORMAT_BC3_UNORM_SRGB
D3DFMT_D16和 D3DFMT_D16_LOCKABLE DXGI_FORMAT_D16_UNORM
D3DFMT_D32 無法使用
D3DFMT_D15S1 無法使用
D3DFMT_D24S8 無法使用
D3DFMT_D24X8 無法使用
D3DFMT_D24X4S4 無法使用
D3DFMT_D16 DXGI_FORMAT_D16_UNORM
D3DFMT_D32F_LOCKABLE DXGI_FORMAT_D32_FLOAT
D3DFMT_D24FS8 無法使用
D3DFMT_S1D15 無法使用
D3DFMT_S8D24 DXGI_FORMAT_D24_UNORM_S8_UINT
D3DFMT_X8D24 無法使用
D3DFMT_X4S4D24 無法使用
D3DFMT_L16 DXGI_FORMAT_R16_UNORM注意:使用著色器中的 .r swizzle,將紅色複製到其他元件,以取得 D3D9 行為。
D3DFMT_INDEX16 DXGI_FORMAT_R16_UINT
D3DFMT_INDEX32 DXGI_FORMAT_R32_UINT
D3DFMT_Q16W16V16U16 DXGI_FORMAT_R16G16B16A16_SNORM
D3DFMT_MULTI2_ARGB8 無法使用
D3DFMT_R16F DXGI_FORMAT_R16_FLOAT
D3DFMT_G16R16F DXGI_FORMAT_R16G16_FLOAT
D3DFMT_A16B16G16R16F DXGI_FORMAT_R16G16B16A16_FLOAT
D3DFMT_R32F DXGI_FORMAT_R32_FLOAT
D3DFMT_G32R32F DXGI_FORMAT_R32G32_FLOAT
D3DFMT_A32B32G32R32F DXGI_FORMAT_R32G32B32A32_FLOAT
D3DFMT_CxV8U8 無法使用
D3DDECLTYPE_FLOAT1 DXGI_FORMAT_R32_FLOAT
D3DDECLTYPE_FLOAT2 DXGI_FORMAT_R32G32_FLOAT
D3DDECLTYPE_FLOAT3 DXGI_FORMAT_R32G32B32_FLOAT
D3DDECLTYPE_FLOAT4 DXGI_FORMAT_R32G32B32A32_FLOAT
D3DDECLTYPED3DCOLOR 無法使用
D3DDECLTYPE_UBYTE4 DXGI_FORMAT_R8G8B8A8_UINT注意:著色器會取得 UINT 值,但如果需要 Direct3D 9 樣式整數浮點數(0.0f、1.0f...255.f),UINT 只能在著色器中轉換成 float32。
D3DDECLTYPE_SHORT2 DXGI_FORMAT_R16G16_SINT注意:著色器會取得SINT值,但如果需要 Direct3D 9 樣式整數浮點數,SINT 就只能轉換成著色器中的 float32。
D3DDECLTYPE_SHORT4 DXGI_FORMAT_R16G16B16A16_SINT注意:著色器會取得 SINT 值,但如果需要 Direct3D 9 樣式整數浮點數,SINT 就只能轉換成著色器中的 float32。
D3DDECLTYPE_UBYTE4N DXGI_FORMAT_R8G8B8A8_UNORM
D3DDECLTYPE_SHORT2N DXGI_FORMAT_R16G16_SNORM
D3DDECLTYPE_SHORT4N DXGI_FORMAT_R16G16B16A16_SNORM
D3DDECLTYPE_USHORT2N DXGI_FORMAT_R16G16_UNORM
D3DDECLTYPE_USHORT4N DXGI_FORMAT_R16G16B16A16_UNORM
D3DDECLTYPE_UDEC3 無法使用
D3DDECLTYPE_DEC3N 無法使用
D3DDECLTYPE_FLOAT16_2 DXGI_FORMAT_R16G16_FLOAT
D3DDECLTYPE_FLOAT16_4 DXGI_FORMAT_R16G16B16A16_FLOAT
FourCC 'ATI1' DXGI_FORMAT_BC4_UNORM
FourCC 'ATI2' DXGI_FORMAT_BC5_UNORM

 

Direct3D 11 執行時間中包含的 DxGI 1.1 包含 BGRA 格式。 不過,對於 Direct3D 10 和 10.1 裝置,這些格式的支持是選擇性的,這些裝置的驅動程式會實作到適用於 Windows Vista 的 Windows Display Driver Model (WDDM)(WDDM 1.0)。 請考慮改用 DXGI_FORMAT_R8G8B8A8_UNORM。 或者,您可以使用 D3D10_CREATE_DEVICE_BGRA_SUPPORT 建立裝置,以確保您只支援已安裝 Direct3D 11.0 運行時間和 WDDM 1.1 驅動程式或更高版本的電腦。

2DXGI 1.0 定義 5:6:5 和 5:5:5:1 格式,但 Direct3D 10.x 或 Direct3D 11.0 運行時間不支援這些格式。 DirectX 11.1 運行時間中的 DXGI 1.2 選擇性地支援這些格式,這是功能層級 11.1 視訊適配卡和 WDDM 1.2(從 Windows 8 開始的顯示驅動程式模型)所需的格式,且已在 10level9 功能層級上支援。

2DXGI 1.2 引進了 4:4:4:4 格式。 DirectX 11.1 運行時間選擇性地支援此格式,這是功能層級 11.1 視訊適配卡和 WDDM 1.2 驅動程式的必要格式,且已在 10level9 功能層級上支援。

針對未壓縮的格式,DXGI 已限制任意圖元格式模式的支援;所有未壓縮的格式都必須是 RGBA 類型。 這可能需要模糊現有的資產圖元格式,建議您盡可能將它計算為離線前置程序傳遞。

移植著色器

Direct3D 10 著色器是在 HLSL 撰寫

Direct3D 10 只會將元件語言的使用限制為偵錯目的,因此 Direct3D 9 中使用的任何手寫元件著色器都必須轉換成 HLSL。

著色器簽章和連結

我們討論了本檔稍早與頂點著色器輸入簽章的輸入元件連結需求(請參閱上圖)。 請注意,Direct3D 10 運行時間也加強了著色器之間階段對階段連結的需求。 這項變更會影響著色器來源,其中階段之間的系結可能尚未在 Direct3D 9 下完整描述。 例如:

VS_OUTPUT                       PS_INPUT
float4   pos : SV_POSITION;     float4 pos : SV_POSITION;
float4   uv1 : TEXCOORD1;       float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4   Color : TEXCOORD6;     float4 color : TEXCOORD6;

* 中斷的 VS - PS 連結 - 即使圖元著色器可能對完整矩陣不感興趣,鏈接必須指定完整的 float4x3。

請注意,階段之間的連結語意必須完全相符,但目標階段輸入可能是輸出值前置詞。 在上述範例中,圖元著色器可以有 position 和 texcoord1 做為唯一的輸入,但是由於排序條件約束,它不能將位置和 texcoord2 作為唯一的輸入。

HLSL 著色器階段連結

著色器之間的連結可能會發生在管線中下列任何一點:

  • 頂點著色器的輸入組合器
  • 頂點著色器到像素著色器
  • 頂點著色器到幾何著色器
  • 串流輸出的頂點著色器
  • 幾何著色器到圖元著色器
  • 要串流輸出的幾何著色器

常數緩衝區

為了方便從 Direct3D 9 移植內容,在效果系統外部進行常數管理的初始方法,可能涉及建立包含所有必要常數的單一常數緩衝區。 效能務必依照預期的更新頻率將常數排序為緩衝區。 此組織會將備援常數集的數量縮減為最小值。

功能層級 9 和更高層級 HLSL 中的使用者裁剪平面

從 Windows 8 開始,您可以在 HLSL 函式宣告中使用剪輯平面函式屬性,而不是SV_ClipDistance,讓您的著色器在功能層級9_x以及功能層級 10 和更新版本上運作。 如需詳細資訊,請參閱 功能層級 9 硬體上的使用者剪輯平面。

要監看的其他 Direct3D 10 差異

整數做為輸入

在 Direct3D 9 中,整數數據類型沒有真正的硬體支援,不過 Direct3D 10 硬體支持明確的整數類型。 如果您的頂點緩衝區中有浮點數據,則必須有浮點輸入。 否則整數類型會是浮點值的位模式表示法。 除非值標示為無插補點,否則圖元著色器輸入不允許使用整數類型(請參閱 插補修飾詞)。

滑鼠游標

在舊版 Windows 上,標準 GDI 滑鼠游標例程無法在所有全螢幕專用裝置上正確運作。 已新增 SetCursorPropertiesShowCursorSetCursorPosition API 來處理這些案例。 由於 Windows Vista 的 GDI 版本完全瞭解 DXGI 介面,因此不需要此特製化的滑鼠游標 API,因此沒有 Direct3D 10 對等專案。 Direct3D 10 應用程式應該改用標準 GDI 滑鼠游標例程 來進行滑鼠游標。

將材質對應至 Direct3D 10 中的圖元

在 Direct3D 9 中,紋素中心和圖元中心相距半單位(請參閱直接將紋素對應到圖元(Direct3D 9))。 在 Direct3D 10 中,紋素中心已位於半單位,因此完全不需要移動頂點座標。

使用 Direct3D 10 轉譯全螢幕四邊形更直接。 全螢幕四邊形應定義在剪輯空間 (-1,1) 中,並直接通過頂點著色器,且沒有任何變更。 如此一來,每次螢幕解析度變更時,都不需要重載頂點緩衝區,而且圖元著色器中不需要額外工作來操作紋理座標。

參考計數行為變更

不同於先前的 Direct3D 版本,各種 Set 函式不會儲存裝置對象的參考。 這表示應用程式必須確定它會保存物件上的參考,只要希望該對象系結至管線即可。 當物件的 ref 計數下降到零時,物件將會從管線中解除系結,因為它被終結。 這種參考保留樣式也稱為弱式參考保留,因此 Device 物件上的每個系結位置都會保存介面/物件的弱式參考。 除非另有明確提及,否則應該針對所有 Set 方法假設此行為。 每當物件的解構導致系結點設為 NULL 輸出時,偵錯層就會發出警告。 請注意,呼叫裝置 Get 方法,例如 OMGetRenderTargets 會增加所傳回對象的參考計數。

測試合作層級

Direct3D 9 API TestCooperativeLevel 的功能類似於在呼叫 Present 時設定DXGI_PRESENT_TEST。

StretchRect

Direct3D 10 和 10.1 中無法使用類似 Direct3D 9 IDirect3DDevice9::StretchRect 方法的函式。 若要複製資源介面,請使用ID3D10Device::CopySubresourceRegion 若要調整作業大小,請使用紋理篩選轉譯為紋理。 若要將 MSAA 表面轉換成非 MSAA 表面,請使用 ID3D10Device::ResolveSubresource

其他 Direct3D 10.1 差異

Windows Vista With Service Pack 1 (SP1) 包含 Direct3D 10 和 Direct3D 10.1 的次要更新,其中公開了下列額外的硬體功能:

  • MSAA 個別取樣著色器
  • MSAA 深度回讀
  • 每個轉譯目標的獨立混合模式
  • Cube 地圖陣列
  • 轉譯為區塊壓縮格式 (BC) 格式

Direct3D 10.1 更新新增了下列新介面的支持,這些介面衍生自現有的介面:

Direct3D 10.1 更新也包含下列其他結構:

Direct3D 10.1 API 包含名為功能層級的新概念。 此概念表示您可以使用 Direct3D 10.1 API 來驅動 Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) 或 Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1) 硬體。 由於 Direct3D 10.1 API 衍生自 Direct3D 10 介面,因此應用程式可以建立 Direct3D 10.1 裝置,然後使用它作為 Direct3D 10.0 裝置,除非需要新的 10.1 特定功能(前提是 D3D10_FEATURE_LEVEL_10_1 功能層級存在並支持這些功能)。

注意

Direct3D 10.1 裝置可以使用現有的 10.0 HLSL 著色器配置檔(vs_4_0、ps_4_0、gs_4_0)和新的 10.1 配置檔(vs_4_1、ps_4_1、gs_4_1)搭配額外的 HLSL 指示和功能。

 

Windows 7 包含 Direct3D 10.1 API 的次要更新,包含在 Direct3D 11 運行時間中。 此更新新增對下列功能層級的支援:

Windows 7 也新增了適用於 Windows 進階點陣化平臺 (WARP)Direct3D 10.1 支援。 您可以使用 D3D10_DRIVER_TYPE_WARP 來指定 WARP 驅動程式

如需 Direct3D 10.1 的詳細資訊,請參閱 Direct3D 10.1 功能和D3D10_FEATURE_LEVEL1列舉。

Direct3D 10 的程序設計指南