迁移到 Direct3D 11

本节提供有关从早期版本的 Direct3D 迁移到 Direct3D 11 的信息。

Direct3D 9 到 Direct3D 11

Direct3D 11 API 基于 Direct3D 10 和 10.1 中所做的基础结构改进。 从 Direct3D 9 移植到 Direct3D 11 类似于从 Direct3D 9 迁移到 Direct3D 10。 以下是这项工作的主要挑战。

  • 删除所有固定函数管道的使用,以支持专门以 HLSL 创作的可编程着色器(通过 D3DCompiler 而不是 D3DX9 进行编译)。
  • 基于不可变对象而非单个状态切换的状态管理。
  • 更新以符合顶点缓冲区输入布局和着色器签名的严格链接要求。
  • 将着色器资源视图与所有纹理资源关联。
  • 将所有图像内容映射到 DXGI_FORMAT,包括删除所有 24 位颜色格式 (8/8/8),以及适用于大多数方案的严格 RGB 颜色排序。
  • 将全局常量状态的使用分入到几个小型、更高效的已更新常量缓冲区。

有关从 Direct3D 9 迁移到 Direct3D 10 的详细信息,请参阅 Direct3D 9 到 Direct3D 10 的注意事项

Direct3D 10 到 Direct3D 11

转换写入的程序来使用 Direct3D 10 或 10.1 API 是一个直接过程,因为 Direct3D 11 是现有 API 的扩展。 只有一个小异常(如下所述 - 单色文本筛选),Direct3D 10/10.1 中的所有方法和功能都可在 Direct3D 11 中使用。 以下概述描述了这两个 API 之间的差异,以帮助更新现有代码。 这里的主要区别包括:

  • 呈现操作(绘图、状态等)不再是设备接口的一部分,而是新 DeviceContext 接口以及资源映射/取消映射和设备查询方法的一部分。
  • Direct3D 11 包括 Direct3D 10.0 和 10.1 之间所做的所有增强和更改

枚举和定义

Direct3D 10 Direct3D 11
DXGI_FORMAT DXGI_FORMAT定义了多个新的 DXGI 格式。
D3D10_CREATE_DEVICE_SWITCH_TO_REF D3D11_CREATE_DEVICE_SWITCH_TO_REFDirect3D 11 不支持切换到参考功能。
D3D10_DRIVER_TYPE D3D_DRIVER_TYPE请注意,D3D_DRIVER_TYPE 中的枚举标识符是从 D3D10_DRIVER_TYPE 中的标识符重新定义的。 因此,应确保使用枚举标识符而不是文本数字。
D3D_DRIVER_TYPE 在 D3Dcommon.h 中定义。
D3D10_RESOURCE_MISC_FLAG D3D11_RESOURCE_MISC_FLAG请注意,其中许多标志已经重新定义,因此,请务必使用枚举标识符而不是文本数字。
D3D10_FILTER D3D11_FILTER请注意,已从 Direct3D 11 中删除了文本筛选 D3D10_FILTER_TEXT_1BIT。 请参阅 DirectWrite。
D3D10_COUNTER D3D11_COUNTER请注意,针对 Direct3D 11 删除了与供应商无关的计数器,因为很少支持这些计数器。
D3D10_x D3D11_x 许多枚举和定义是相同的、具有较大限制或具有其他值。

结构

Direct3D 10 Direct3D 11
D3D10_SO_DECLARATION_ENTRY D3D11_SO_DECLARATION_ENTRY添加流。
D3D10_BLEND_DESC D3D11_BLEND_DESC请注意,此结构从 10 到 10.1 变化很大,目的是提供每次渲染的目标混合状态
D3D10_BUFFER_DESC D3D11_BUFFER_DESC添加 StructureByteStride 以与计算着色器资源配合使用
D3D10_SHADER_RESOURCE_VIEW_DESC D3D11_SHADER_RESOURCE_VIEW_DESC请注意,此结构针对 10.1 添加了其他联合成员
D3D10_DEPTH_STENCIL_VIEW_DESC D3D11_DEPTH_STENCIL_VIEW_DESC具有新的 Flags 成员。
D3D10_QUERY_DATA_PIPELINE_STATISTICS D3D11_QUERY_DATA_PIPELINE_STATISTICS添加多个新的着色器阶段计数器。
D3D10_x D3D11_x 这两个 API 的许多结构是相同的。

接口

Direct3D 10 Direct3D 11
ID3D10Device ID3D11DeviceID3D11DeviceContext
设备接口已拆分为这两个部分。 若要快速移植,可以使用 ID3D11Device::GetImmediateContext
“ID3D10Device::GetTextFilterSize”和“SetTextFilerSize”方法不再存在。 请参阅 DirectWrite。
Create*Shader 为 ID3D11ClassLinkage 采用其他可选参数。
*SetShader 和 *GetShader 为 ID3D11ClassInstance 采用其他可选参数。
CreateGeometryShaderWithStreamOutput 对多个输出流步幅采用一个数组和计数。
CreateGeometryShaderWithStreamOutput 的 NumEntries 参数限制在 Direct3D 11 中已增加到 D3D11_SO_STREAM_COUNT * D3D11_SO_OUTPUT_COMPONENT_COUNT。
ID3D10Buffer ID3D11Buffer
ID3D10SwitchToRef Direct3D 11 不支持 ID3D11SwitchToRefSwitch-to-ref 功能。
ID3D10Texture1D ID3D11Texture1D
ID3D10Texture2D ID3D11Texture2D
ID3D10Texture3D ID3D11Texture3DMap 和 Unmap 方法已移动到 ID3D11DeviceContext,所有 Map 方法都使用 D3D11_MAPPED_SUBRESOURCE 而不是 void**。
ID3D10Asynchronous ID3D11AsynchronousBegin、End 和 GetData 已移动到 ID3D11DeviceContext
ID3D10x ID3D11x 这两个 API 的许多接口是相同的。
10/10.1 解决方案 11 解决方案
HLSL 编译器(D3D10Compile*、D3DX10Compile*)和着色器反射 API D3DCompiler(请参阅 D3DCompiler.h)注意:对于 Microsoft Store 应用,仅支持使用 D3DCompiler API 进行开发,而不是进行部署。
效果 10 效果 11 以联机共享源的形式提供。 注意:此解决方案不适合 Microsoft Store 应用,因为它在运行时(部署时)需要使用 D3DCompiler API
D3DX9/D3DX10 数学 DirectXMath
D3DX10 旧版 DirectX SDK DirectXTexDirectXTKDirectXMesh 中的 D3DX11 提供了旧版 D3DX10 和 D3DX11 库中许多技术的替代技术。
Direct2DDirectWrite 为呈现样式化线条和字体提供高质量的支持。

有关旧版 DirectX SDK 的信息,请参阅 DirectX SDK 在哪里?

Direct3D 10.1 到 Direct3D 11

Direct3D 10.1 是 Direct3D 10 接口的扩展,Direct3D 10.1 的所有功能均在 Direct3D 11 中提供。 从 10.1 到 11 的大部分移植工作已经在上面从 10 到 11 迁移过程中解决了。

枚举和定义

Direct3D 10.1 Direct3D 11
D3D10_FEATURE_LEVEL1 D3D_FEATURE_LEVEL相同,但在 D3DCommon.h 中定义,并且添加了适用于 11 类硬件的 D3D_FEATURE_LEVEL_11_0,以及适用于 10level9 的 D3D_FEATURE_LEVEL_9_1、D3D_FEATURE_LEVEL_9_2 和 D3D_FEATURE_LEVEL_9_3
(也为 10.1 到 d3d10_1.h 的迁移添加了 D3D10_FEATURE_LEVEL_9_1、D3D10_FEATURE_LEVEL_9_2 和 D3D10_FEATURE_LEVEL_9_3)

结构

Direct3D 10.1 Direct3D 11
D3D10_BLEND_DESC1 D3D11_BLEND_DESC11 版本与 10.1 相同。
D3D10_SHADER_RESOURCE_VIEW_DESC1 D3D11_SHADER_RESOURCE_VIEW_DESC11 版本与 10.1 相同。

接口

Direct3D 10.1 Direct3D 11
ID3D10Device1 ID3D11DeviceID3D11DeviceContext
设备接口已拆分为这两个部分。 若要快速移植,可以使用 ID3D11Device::GetImmediateContext
“ID3D10Device::GetTextFilterSize”和“SetTextFilerSize”方法不再存在。 请参阅 DirectWrite。
Create*Shader 为 ID3D11ClassLinkage 采用其他可选参数。
*SetShader 和 *GetShader 为 ID3D11ClassInstance 采用其他可选参数。
CreateGeometryShaderWithStreamOutput 对多个输出流步幅采用一个数组和计数。
CreateGeometryShaderWithStreamOutput 的 NumEntries 参数限制在 Direct3D 11 中已增加到 D3D11_SO_STREAM_COUNT * D3D11_SO_OUTPUT_COMPONENT_COUNT。
ID3D10BlendState1 ID3D11BlendState
ID3D10ShaderResourceView1 ID3D11ShaderResourceView

Direct3D 11 的新功能

为使用 Direct3D 11 API 而更新代码后,需要考虑许多新功能

  • 通过命令列表和多个上下文进行多线程呈现
  • 使用计算着色器实现高级算法(使用 4.0、4.1 或 5.0 着色器配置文件)
  • 新的 11 类硬件功能:
    • HLSL 着色器模型 5.0
    • 动态着色器链接
    • 通过外壳着色器和域着色器进行镶嵌
    • 新的块压缩格式:适用于 HDR 图像的 BC6H、适用于高保真标准图像的 BC7
  • 利用 10level9 技术,通过 DIrect3D 11 API 在许多着色器模型 2.0 和着色器模型 3.0 设备上呈现,以便在 Windows Vista 和 Windows 7 上实现低端视频硬件支持。
  • 利用 WARP 软件呈现设备。

DirectX 11.1 的新功能

Windows 8 包括实现 DirectX 图形代码时要考虑的其他 DirectX 图形增强功能,其中包括 Direct3D 11.1DXGI 1.2Windows 显示驱动程序模型 (WDDM) 1.2功能级别 11.1 硬件、Direct2D 设备上下文和其他改进。

在 Windows 7 上以及通过 Windows 7 平台更新可获得对 Direct3D 11.1 的部分支持(通过 Windows 7 平台更新获得)。

DirectX 11.2 的新功能

Windows 8.1 包括 Direct3D 11.2DXGI 1.3 和其他改进。

Direct3D 11 编程指南

效果 (Direct3D 11)