将 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 游戏使用。 这些帮助程序库为诸如纹理加载和网格加载之类的任务提供了资源。

将 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 浮点类型便于与着色器配合使用。 例如,XMFLOAT4XMFLOAT4X4 便于对齐常量缓冲区的数据。

将 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 应用(包括游戏)都使用特定类型的后台任务,以便在应用暂停时保持连接。 如果你的游戏需要在暂停时保持连接状态,请参阅网络基础知识

功能映射

使用下表可帮助你将 Direct3D 9 中的代码转换到 Direct3D 11。 该表还有助于区分设备和设备上下文。

Direct3D9 Direct3D 11 等效内容

IDirect3DDevice9

ID3D11Device2

ID3D11DeviceContext2

图形管道中描述了各个图形管道阶段。

IDirect3D9

IDXGIFactory2

IDXGIAdapter2

IDXGIDevice3

IDirect3DDevice9::Present

IDXGISwapChain1::Present1

IDirect3DDevice9::TestCooperativeLevel

调用设置了 DXGI_PRESENT_TEST 标志的 IDXGISwapChain1::Present1

IDirect3DBaseTexture9

IDirect3DTexture9

IDirect3DCubeTexture9

IDirect3DVolumeTexture9

IDirect3DIndexBuffer9

IDirect3DVertexBuffer9

ID3D11Buffer

ID3D11Texture1D

ID3D11Texture2D

ID3D11Texture3D

ID3D11ShaderResourceView

ID3D11RenderTargetView

ID3D11DepthStencilView

IDirect3DVertexShader9

IDirect3DPixelShader9

ID3D11VertexShader

ID3D11PixelShader

IDirect3DVertexDeclaration9

ID3D11InputLayout

IDirect3DDevice9::SetRenderState

IDirect3DDevice9::SetSamplerState

ID3D11BlendState1

ID3D11DepthStencilState

ID3D11RasterizerState1

ID3D11SamplerState

IDirect3DDevice9::DrawIndexedPrimitive

IDirect3DDevice9::DrawPrimitive

ID3D11DeviceContext::Draw

ID3D11DeviceContext::DrawIndexed

ID3D11DeviceContext::DrawIndexedInstanced

ID3D11DeviceContext::DrawInstanced

ID3D11DeviceContext::IASetPrimitiveTopology

ID3D11DeviceContext::DrawAuto

IDirect3DDevice9::BeginScene

IDirect3DDevice9::EndScene

IDirect3DDevice9::DrawPrimitiveUP

IDirect3DDevice9::DrawIndexedPrimitiveUP

无直接等效项

IDirect3DDevice9::ShowCursor

IDirect3DDevice9::SetCursorPosition

IDirect3DDevice9::SetCursorProperties

使用标准光标 API。

IDirect3DDevice9::Reset

LOST 设备和 POOL_MANAGED 不再存在。 IDXGISwapChain1::Present1 可能失败,并带有 DXGI_ERROR_DEVICE_REMOVED 返回值。

IDirect3DDevice9:DrawRectPatch

IDirect3DDevice9:DrawTriPatch

IDirect3DDevice9:LightEnable

IDirect3DDevice9:MultiplyTransform

IDirect3DDevice9:SetLight

IDirect3DDevice9:SetMaterial

IDirect3DDevice9:SetNPatchMode

IDirect3DDevice9:SetTransform

IDirect3DDevice9:SetFVF

IDirect3DDevice9:SetTextureStageState

固定函数管道已被弃用。

IDirect3DDevice9:CheckDepthStencilMatch

IDirect3DDevice9:CheckDeviceFormat

IDirect3DDevice9:GetDeviceCaps

IDirect3DDevice9:ValidateDevice

已将功能位替换为功能级别。 对于任何给定的功能级别,只有几个格式和功能用例是可选的。 这些可以使用 ID3D11Device::CheckFeatureSupportID3D11Device::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::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 类型。