将 DirectX 9 功能映射到 DirectX 11 API
了解 Direct3D 9 游戏使用的功能如何转换到 Direct3D 11 和通用 Windows 平台 (UWP)。
还可以参阅计划你的 DirectX 移植以及从 Direct3D 9 到 Direct3D 11 的重要更改。
将 Direct3D 9 映射到 DirectX 11 API
Direct3D 仍然是 DirectX 图形的基础,但是 API 自从 DirectX 9 起发生了更改。
- 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 游戏着色器。 在运行时加载字节码,然后 在相应的呈现传递过程中将每个着色器资源绑定到图形管道。 应将着色器移动到它们自己的 .HLSL 文件中,且应采用 C++ 代码实现呈现技术。
若要快速浏览加载着色器资源,请参阅从 Direct3D 9 到 UWP 的简单移植。
Direct3D 11 引入了着色器模型 5,它需要 Direct3D 功能级别 11_0(或更高功能级别)。 请参阅 Direct3D 11 的 HLSL 着色器模型 5 功能。
替换 XNAMath 和 D3DXMath
应该将使用 XNAMath(或 D3DXMath)的代码迁移到 DirectXMath。 DirectXMath 包括跨 x86、x64 和 Arm 可移植的类型。 请参阅 XNA Math 库中的代码迁移。
请注意,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 媒体基础使用共享图面向 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)
- 使用 WebSockets 进行连接(使用 C#/VB/C++ 和 XAML 的 UWP 应用)(Windows)
- 连接到 Web 服务(使用 C#/VB/C++ 和 XAML 的 UWP 应用)(Windows)
- 网络基础知识
请注意,所有 UWP 应用(包括游戏)都使用特定类型的后台任务,以便在应用暂停时保持连接。 如果你的游戏需要在暂停时保持连接状态,请参阅网络基础知识。
功能映射
使用下表可帮助你将 Direct3D 9 中的代码转换到 Direct3D 11。 该表还有助于区分设备和设备上下文。
Direct3D9 | Direct3D 11 等效内容 |
---|---|
图形管道中描述了各个图形管道阶段。 |
|
调用设置了 DXGI_PRESENT_TEST 标志的 IDXGISwapChain1::Present1。 |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
无直接等效项 |
|
使用标准光标 API。 |
|
LOST 设备和 POOL_MANAGED 不再存在。 IDXGISwapChain1::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 重排将红色复制到其他组件以获取 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 类型。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈