将 DirectX 9 功能映射到 DirectX 11 API
了解 Direct3D 9 游戏使用的功能如何转换为 Direct3D 11 和 通用 Windows 平台 (UWP)。
还可以参阅计划你的 DirectX 移植以及从 Direct3D 9 到 Direct3D 11 的重要更改。
将 Direct3D 9 映射到 DirectX 11 API
Direct3D 仍然是 DirectX 图形的基础,但自 DirectX 9 以来,API 已更改:
- Microsoft DirectX 图形基础结构(DXGI)用于设置图形适配器。 使用 DXGI 选择缓冲区格式、创建交换链、演示帧和创建共享资源。 请参阅 DXGI 概述。
- Direct3D 设备上下文用于设置管道状态并生成呈现命令。 我们的大多数示例使用即时上下文直接呈现到设备;Direct3D 11 还支持多线程呈现,在这种情况下使用延迟上下文。 请参阅 Direct3D 11 中的设备简介。
- 某些功能已弃用,尤其是固定函数管道。 请参阅 已弃用的功能。
有关 Direct3D 11 功能的完整列表,请参阅 Direct3D 11 功能和 Direct3D 11 功能。
从 Direct2D 9 移动到 Direct2D 11
Direct2D(Windows) 仍然是 DirectX 图形和 Windows 的重要组成部分。 你仍然可以使用 Direct2D 来绘制 2D 游戏,并在 Direct3D 顶部绘制覆盖层(HUD)。
Direct2D 在 Direct3D 上运行;可以使用任一 API 实现 2D 游戏。 例如,使用 Direct3D 实现的 2D 游戏可以使用正交投影、设置 Z 值来控制基元的绘制顺序,并使用像素着色器添加特殊效果。
由于 Direct2D 基于 Direct3D,因此它还使用 DXGI 和设备上下文。 请参阅 Direct2D API 概述。
DirectWrite API 添加了对使用 Direct2D 格式化文本的支持。 请参阅 DirectWrite 简介。
替换已弃用的帮助程序库
D3DX 和 DXUT 已弃用,不能由 UWP 游戏使用。 这些帮助程序库为纹理加载和网格加载等任务提供了资源。
- 从 Direct3D 9 到 UWP 的简单端口演练演示了如何设置窗口、初始化 Direct3D 并执行基本的 3D 呈现。
- 使用 DirectX 演练的简单 UWP 游戏演示了常见的游戏编程任务,包括图形、加载文件、UI、控件和声音。
- DirectX 工具包社区项目提供用于 Direct3D 11 和 UWP 应用的帮助程序类。
将着色器程序从 FX 移动到 HLSL
UWP 已弃用 D3DX 实用工具库(D3DX 9、D3DX 10 和 D3DX 11),包括效果。 UWP 的所有 DirectX 游戏都使用 HLSL (无效果)驱动图形管道。
Visual Studio 仍在后台使用 FXC 来编译着色器对象。 UWP 游戏着色器提前编译。 字节码在运行时加载,然后在适当的呈现传递期间,每个着色器资源绑定到图形管道。 着色器应移动到自己的单独着色器。应在C++代码中实现 HLSL 文件和呈现技术。
若要快速了解如何加载着色器资源,请参阅 从 Direct3D 9 到 UWP 的简单端口。
Direct3D 11 引入了着色器模型 5,它需要 Direct3D 功能级别 11_0(或更高功能级别)。 请参阅 Direct3D 11 的 HLSL 着色器模型 5 功能。
替换 XNAMath 和 D3DXMath
应将使用 XNAMath(或 D3DXMath)的代码迁移到 DirectXMath。 DirectXMath 包括跨 x86、x64 和 Arm 可移植的类型。 请参阅 从 XNA 数学库迁移代码。
请注意,DirectXMath 浮点类型便于与着色器一起使用。 例如,XMFLOAT4和XMFLOAT4X4方便对齐常量缓冲区的数据。
将 DirectSound 替换为 XAudio2 (和后台音频)
UWP 不支持 DirectSound:
- 使用 XAudio2 向游戏添加声音效果。
将 DirectInput 替换为 XInput 和 Windows 运行时 API
UWP 不支持 DirectInput:
- 将 CoreWindow 输入事件回调用于鼠标、键盘和触摸输入。
- 将 XInput 1.4 用于游戏控制器支持(和游戏控制器头戴显示设备支持)。 如果使用桌面和 UWP 的共享代码库,请参阅 XInput 版本 ,了解有关向后兼容性的信息。
- 如果你的游戏需要使用应用栏,请注册 EdgeGesture 事件。
使用 Microsoft Media Foundation 而不是 DirectShow
DirectShow 不再是 DirectX API(或 Windows API)的一部分。 Microsoft Media Foundation 使用共享图面向 Direct3D 提供视频内容。 请参阅 Direct3D 11 视频 API。
将 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)
- 使用 WebSocket 进行连接(使用 C#/VB/C++ 和 XAML 的 UWP 应用)(Windows)
- 连接到 Web 服务(使用 C#/VB/C++ 和 XAML 的 UWP 应用)(Windows)
- 网络基础知识
请注意,所有 UWP 应用(包括游戏)都使用特定类型的后台任务在应用暂停时保持连接。 如果你的游戏需要在暂停时保持连接状态,请参阅 网络基础知识。
函数映射
使用下表帮助将代码从 Direct3D 9 转换为 Direct3D 11。 这也有助于区分设备和设备上下文。
Direct3D9 | Direct3D 11 等效项 |
---|---|
图形管道阶段在图形管道中介绍。 |
|
调用 IDXGISwapChain1::P resent1 并设置DXGI_PRESENT_TEST标志。 |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
无直接等效项 |
|
使用标准游标 API。 |
|
LOST 设备和POOL_MANAGED不再存在。 IDXGISwapChain1::P resent1 可能会失败,并 返回DXGI_ERROR_DEVICE_REMOVED 值。 |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
已弃用固定函数管道。 |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
已将功能位替换为功能级别。 对于任何给定的功能级别,只有少数格式和功能用例是可选的。 可以使用 ID3D11Device::CheckFeatureSupport 和 ID3D11Device::CheckFormatSupport 进行检查。 |
Surface 格式映射
使用下表将 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 重排将红色复制到其他组件以获取 Direct3D 9 行为。
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
注意:使用着色器中的重排 .rrrg 复制红色并将绿色移动到 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 重排将红色复制到其他组件以获取 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
注意 需要功能级别 10.0 或更高版本
|
FourCC “ATI2” |
DXGI_FORMAT_BC5_UNORM
注意 需要功能级别 10.0 或更高版本
|
其他映射信息
- 将 IDirect3DDevice9::SetCursorPosition 替换为 SetCursorPos。
- 将 IDirect3DDevice9::SetCursorProperties 替换为 SetCursor。
- 将 IDirect3DDevice9::SetIndices 替换为 ID3D11DeviceContext::IASetIndexBuffer。
- 将 IDirect3DDevice9::SetRenderTarget 替换为 ID3D11DeviceContext::OMSetRenderTargets。
- 将 IDirect3DDevice9::SetScissorRect 替换为 ID3D11DeviceContext::RSSetScissorRects。
- 将 IDirect3DDevice9::SetStreamSource 替换为 ID3D11DeviceContext::IASetVertexBuffers。
- 将 IDirect3DDevice9::SetVertexDeclaration 替换为 ID3D11DeviceContext::IASetInputLayout。
- 将 IDirect3DDevice9::SetViewport 替换为 ID3D11DeviceContext::RSSetViewports。
- 将 IDirect3DDevice9::ShowCursor 替换为 ShowCursor。
通过 IDirect3DDevice9::SetGammaRamp 控制视频卡的硬件伽马校正变为由 IDXGIOutput::SetGammaControl 代替。 查看使用伽玛矫正。
将 IDirect3DDevice9::ProcessVertices 替换为几何着色器的流输出功能。 请参阅流输出阶段入门。
用于设置用户剪裁平面的方法 IDirect3DDevice9::SetClipPlane 已替换为 VS_4_0 及以上版本提供的 HLSL SV_ClipDistance 顶点着色器输出语义(请参阅语义),或替换为新的 HLSL 剪裁平面函数属性(请参阅功能级别 9 硬件上的用户剪裁平面)。
IDirect3DDevice9::SetPaletteEntries 和 IDirect3DDevice9::SetCurrentTexturePalette 已弃用。 请将这些替换为像素着色器,该着色器改为在 256x1 R8G8B8A8 纹理中查找颜色。
已弃用 DrawRectPatch、DrawTriPatch、SetNPatchMode 和 DeletePatch 等固定函数的曲面细分函数。 如果硬件支持曲面细分着色器,请将这些着色器替换为可编程管道 SM5.0 曲面细分着色器。
不再支持 IDirect3DDevice9::SetFVF 和 FVF 代码。 应在移植到 D3D11 输入布局之前,先从 D3D8/D3D9 FVF 代码移植到 D3D9 顶点声明。
在 VS_4_0 及更高版本着色器的开始处,只需使用少量位运算就可以相当高效地模拟不直接受支持的所有 D3DDECLTYPE 类型。