将 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 浮点类型便于与着色器一起使用。 例如,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 Media Foundation 使用共享图面向 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::P resent

IDXGISwapChain1::Present1

IDirect3DDevice9::TestCooperativeLevel

调用 IDXGISwapChain1::P resent1 并设置DXGI_PRESENT_TEST标志。

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::D rawIndexedPrimitive

IDirect3DDevice9::D rawPrimitive

ID3D11DeviceContext::Draw

ID3D11DeviceContext::DrawIndexed

ID3D11DeviceContext::DrawIndexedInstanced

ID3D11DeviceContext::DrawInstanced

ID3D11DeviceContext::IASetPrimitiveTopology

ID3D11DeviceContext::DrawAuto

IDirect3DDevice9::BeginScene

IDirect3DDevice9::EndScene

IDirect3DDevice9::D rawPrimitiveUP

IDirect3DDevice9::D rawIndexedPrimitiveUP

无直接等效项

IDirect3DDevice9::ShowCursor

IDirect3DDevice9::SetCursorPosition

IDirect3DDevice9::SetCursorProperties

使用标准游标 API。

IDirect3DDevice9::Reset

LOST 设备和POOL_MANAGED不再存在。 IDXGISwapChain1::P resent1 可能会失败,并 返回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::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::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 类型