迁移到 Direct3D 11
本节提供有关从早期版本的 Direct3D 迁移到 Direct3D 11 的信息。
- Direct3D 9 到 Direct3D 11
- Direct3D 10 到 Direct3D 11
- Direct3D 10.1 到 Direct3D 11
- Direct3D 11 的新功能
- DirectX 11.1 的新功能
- DirectX 11.2 的新功能
- 相关主题
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 | ID3D11Device 和 ID3D11DeviceContext 设备接口已拆分为这两个部分。 若要快速移植,可以使用 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 DirectXTex、DirectXTK 和 DirectXMesh 中的 D3DX11 提供了旧版 D3DX10 和 D3DX11 库中许多技术的替代技术。 Direct2D 和 DirectWrite 为呈现样式化线条和字体提供高质量的支持。 |
有关旧版 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 | ID3D11Device 和 ID3D11DeviceContext 设备接口已拆分为这两个部分。 若要快速移植,可以使用 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.1、DXGI 1.2、Windows 显示驱动程序模型 (WDDM) 1.2、功能级别 11.1 硬件、Direct2D 设备上下文和其他改进。
在 Windows 7 上以及通过 Windows 7 平台更新可获得对 Direct3D 11.1 的部分支持(通过 Windows 7 平台更新获得)。
DirectX 11.2 的新功能
Windows 8.1 包括 Direct3D 11.2、DXGI 1.3 和其他改进。