將 DirectX 9 功能對應到 DirectX 11 API
瞭解您的 Direct3D 9 遊戲功能如何轉換成 Direct3D 11 和通用 Windows 平台 (UWP)。
另請參閱 規劃您的 DirectX 連線埠,以及從 Direct3D 9 到 Direct3D 11 的重要變更。
將 Direct3D 9 對應至 DirectX 11 API
Direct3D (Direct3D) 仍然是 DirectX 圖形的基礎,但 API 自 DirectX 9 以來已經改變:
- Microsoft DirectX Graphics Infrastructure (DXGI) 用於設定圖形介面卡。 使用 DXGI,可選取緩衝區格式、建立交換鏈、顯示影格,以及建立共用資源。 請參閱 DXGI Overview。
- Direct3D 裝置內容用來設定流程狀態並產生轉譯命令。 我們的大多數範例使用即時前後關聯直接呈現至裝置;Direct3D 11 也支援多執行緒呈現,在此情況下,會使用延緩前後關聯。 請參閱Introduction to a Device in Direct3D 11。
- 有些功能已被取代,最著名的就是固定函式流程。 請參閱 Deprecated Features。
如需 Direct3D 11 功能的完整清單,請參閱 Direct3D 11 Features 和 Direct3D 11 Features。
從 Direct2D 9 移至 Direct2D 11
Direct2D (Windows),仍然是 DirectX 圖形和 Windows 的重要組成部分。 您仍然可以使用 Direct2D 來繪製 2D 遊戲,並在 Direct3D 上繪製疊加 (HUD)。
Direct2D 運行於 Direct3D 之上;2D 遊戲可以使用任一 API 實現。 例如,使用 Direct3D 實現的 2D 遊戲可以使用正交投影,設定 Z 值來控制圖元繪製順序,並使用畫素著色器新增特殊效果。
由於 Direct2D 是以 Direct3D 為基礎的,因此它也使用 DXGI 和裝置背景內容。 請參閱 Direct2D API Overview。
DirectWrite API 增加對使用 Direct2D 的格式化文本的支援。 請參閱 Introducing DirectWrite。
取代已停用的協助程式庫
D3DX 和 DXUT 已被取代,不能用於 UWP 遊戲。 這些協助程式庫為紋理載入和網格載入等作業提供資源。
- 從 Direct3D 9到 UWP Walkthrough的 Simple 連線埠示範如何設定視窗、初始化 Direct3D 及執行基本的 3D 轉譯。
- DirectX Walkthrough 的簡單 UWP 遊戲示範常見的遊戲程式設計任務,包括圖形、載入檔案、UI、控制元件和聲音。
- DirectX Tool Kit 社區專案提供協助程式類別,可搭配 Direct3D 11 和 UWP 應用程式使用。
將著色器程式從 FX 移至 HLSL
D3DX 公用程式庫 (D3DX 9、D3DX 10 和 D3DX 11)(包括 Effects) 已被 UWP 取代。 所有 UWP 的 DirectX 遊戲都使用 HLSL without Effects 驅動圖形管道。
Visual Studio 仍然使用引擎蓋下的 FXC 來編譯著色器物件。 UWP 遊戲著色器提前編譯。 在執行階段載入位元碼,然後在適當的轉譯路徑期間,將每個著色器資源繫結至圖形配管。 著色器應該移動到它們各自獨立的 .HLSL 檔案,並且著色技術應該在 C++ 程式碼中實現。
如需快速瞭解載入著色器資源,請參閱 Direct3D 9 到 UWP 的 Simple port。
Direct3D 11 引入 Shader Model 5,它需要 Direct3D 特徵層級 11_0 (或更高)。 請參閱 Direct3D 11 的 HLSL Shader Model 5 功能。
取代 XNAMath 和 D3DXMath
使用 XNAMath (或 D3DXMath) 的程式碼應該移轉至 DirectX Math。 DirectX Math 包括可跨 x86、x64 和 Arm 移植的型別。 請參閱 XNA Math Library 中的 Code Migration。
請備註,DirectX Math 浮點型別便於與著色器一起使用。 例如:XMFLOAT4、XMFLOAT4X4,可以方便地對齊常數緩衝區的資料。
以 XAudio2 (和背景音訊) 取代 DirectSound
UWP 不支援 DirectSound:
- 使用 XAudio2 將音效新增至您的遊戲。
以 XInput 和 Windows 執行階段 API 取代 DirectInput
UWP 不支援 DirectInput:
- 使用 CoreWindow input 事件回呼進行滑鼠、鍵盤和觸控輸入。
- 使用 XInput 1.4 支援遊戲控制器 (和遊戲控制器耳機支援)。 如果您使用桌面和 UWP 的共用程式碼庫,請參閱 XInput 版本,以取得關於向後相容性的資訊。
- 如果您的遊戲需要使用應用程式列,請註冊 EdgeGesture。
使用 Microsoft Media Foundation 而非 DirectShow
DirectShow 不再是 DirectX API (或 Windows API) 的一部分。 Microsoft Media Foundation Direct3D 使用共用曲面提供視訊內容。 請參閱 Direct3D 11 Video APIs。
以網路程式碼取代 DirectPlay
Microsoft DirectPlay 已被取代。 如果您的遊戲使用網路服務,您需要提供符合 UWP 要求的網路程式碼。 使用下列 API:
- UWP 應用程式的 Win32 和 COM (網路) (Windows)
- Windows.Networking 名稱空間 (Windows)
- Windows.Networking.Sockets 名稱空間 (Windows)
- Windows.Networking.Connectivity 名稱空間 (Windows)
- Windows.ApplicationModel.Background 名稱空間 (Windows)
下列文章可協助您在應用程式的套件資訊清單中新增網路功能並宣告支援網路。
- 連線至插槽 (使用 C#/VB/C++ 和 XAML 的 UWP 應用程式) (Windows)
- 使用 WebSockets (使用 C#/VB/C++ 和 XAML 的 UWP 應用程式) (Windows)
- 連線至 Web 服務 (使用 C#/VB/C++ 和 XAML 的 UWP 應用程式) (Windows)
- 網路功能基本知識
請備註,所有 UWP 應用程式 (包括遊戲)都會使用特定型別的背景工作來維持應用程式暫停時的連線。 如果您的遊戲在暫停期間需要保持連線狀態,請參閱網絡基礎。
函式對應
使用下表幫助將程式碼從 Direct3D 9 轉換為 Direct3D 11。 這也有助於區分裝置和裝置背景內容。
Direct3D9 | Direct3D 11 Equivalent |
---|---|
圖形流程階段在 圖形流程中描述。 |
|
呼叫 IDXGISwapChain1::Present1,並設定 DXGI _PRESENT_TEST 旗標。 |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
無直接對等 |
|
使用標準游標 API。 |
|
LOST 裝置和 POOL_MANAGED 已不存在。 IDXGI SwapChain1::Present1,可能會失敗,並傳回 DXGI _ERROR_DEVICE_REMOVED 值。 |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
固定函式流程已被取代。 |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
功能位由特徵層級取代。 對於任何指定的功能層級,只有少數格式和功能使用案例是可選的。 可以使用 ID3D11Device::CheckFeatureSupport 和 ID3D11Device::CheckFormatSupport 檢查這些專案。 |
曲面格式對映
使用下表將 Direct3D 9 格式轉換為 DXGI 格式。
Direct3D 9 格式 | Direct3D 11 格式 |
---|---|
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 將紅色複製到其他元件,以取得 Direct3D 9 行為。
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
備註:在著色器中使用 swizzle .rrg 複製紅色並將綠色移至 alpha 元件以取得 Direct3D 9 行為。
|
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
備註:在 Direct3D 9 中,資料已擴充至 255.0f,但可以在著色器中處理。
|
D3DFMT_YUY2 |
無法使用 |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
備註:在 Direct3D 9 中,資料已擴充至 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
備註:需要 Feature Level 10.0 或更新版本
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
備註:需要 Feature Level 10.0 或更新版本
|
其他對應資訊
- IDirect3D Device9::SetCursorPosition 已由 SetCursorPos 取代。
- IDirect3D Device9::SetCursorProperties 已由 SetCursor 取代。
- IDirect3D Device9::SetIndices 已由 ID3D11DeviceContext::IASetIndexBuffer 取代。
- IDirect3D Device9::SetRenderTarget 已由 ID3D11DeviceContext::OMSetRenderTargets 取代。
- IDirect3D Device9::SetScissorRect 已由 ID3D11DeviceContext::RSSetScissorRect 取代。
- IDirect3D Device9::SetStreamSource 已由 ID3D11DeviceContext::IASetVertexBuffers 取代。
- IDirect3D Device9::SetVertexDeclaration 已由 ID3D11DeviceContext::IASetInputLayout 取代。
- IDirect3D Device9::SetViewport 已由 ID3D11DeviceContext::RSSetViewports 取代。
- IDirect3D Device9::ShowCursor 已由 ShowCursor 取代。
透過 IDirect3D Device9::SetGammaRamp,視訊卡硬體 gammaRamp 的控制由 IDXGI Output::SetGammaControl 取代。 請參閱 Using gamma correction。
IDirect3D Device9::ProcessVertices,會由幾何著色器的串流輸出功能所取代。 請參閱 Getting started with the Stream-Output Stage。
IDirect3DDevice9::SetClipPlane 的方法已被 VS_4_0 及更高版本中可用的 HLSL SV_ClipDistance vertex 著色器輸出語義 (請參閱語義) 或新的 HLSL clipplanes 函式屬性 (請參閱功能層級 9 硬體上的使用者剪輯平面) 所取代。
IDirect3DDevice9::SetPaletteEntries 和 IDirect3DDevice9::SetCurrentTexturePalette 已過時。 取代這些選項,使用畫素著色器來尋找 256x1 R8G8B8A8 紋理中的顏色。
固定函式鑲嵌函式,如 DrawRectPatch、DrawTriPatch、SetNPatchMode,和 DeletePatch,已被取代。 以程式化流程 SM5.0 鑲嵌著色器取代它們 (如果硬體支援鑲嵌著色器)。
不再支援 IDirect3DDevice9::SetFVF,以及 FVF 程式碼。 您應該先從 D3D8/D3D9 FVF 程式碼連線至 D3D9 頂點宣告,再連線至 D3D11 輸入配置。
在 VS_4_0 及更高版本中,所有不直接支援的 D3DDECLTYPE,只要在頂點著色器開頭處執行少量的位元運算,就可以相當有效地模擬。