window 显示驱动开发-转换 Direct3D 固定函数状态(一)
如果用户模式显示驱动程序支持每种着色器类型 2.0 或更高版本,Microsoft Direct3D 运行时会将 Direct3D 固定函数状态转换为顶点或像素着色器版本 2.0。 但是,运行时不会转换着色器版本。 例如,如果应用程序使用顶点或像素着色器版本 1.1,则版本 1.1 将不转换传递给用户模式显示驱动程序,而不管驱动程序是否支持着色器版本 2.0 或更高版本。 灵活的顶点格式 (FVF) 代码用于固定函数处理。
DirectX 版本的转换器功能
固定函数顶点和像素着色器转换器的工作原理取决于所使用的 Microsoft DirectX 版本:
-
DirectX 9.0
固定函数顶点和像素着色器转换器可与 Windows Vista 显示驱动程序模型配合使用。
默认情况下,转换器处于启用状态。
使用固定函数顶点或像素着色器转换器时,将禁用纯设备。 当应用程序请求纯设备时,Direct3D 运行时会创建 HAL 设备。
运行时支持混合顶点处理。
软件顶点处理始终使用固定函数顶点着色器转换器。
当驱动程序支持顶点着色器 2.0 或更高版本时,硬件顶点处理使用固定函数顶点着色器转换器。
当驱动程序支持像素着色器版本 2.0 或更高版本时,硬件顶点处理使用固定函数像素着色器转换器。
在混合顶点处理模式下,当为硬件启用固定函数顶点着色器转换器时,浮点常量数将设置为硬件可以支持的内容。
-
DirectX 8.0 及更早版本
固定函数顶点和像素着色器转换器只能与 Windows Vista 显示驱动程序模型配合使用。
默认情况下,转换器处于启用状态。
软件顶点处理不支持固定函数顶点着色器转换器。
当驱动程序支持顶点着色器 2.0 或更高版本时,硬件顶点处理使用固定函数顶点着色器转换器。
当驱动程序支持像素着色器版本 2.0 或更高版本时,硬件顶点处理使用固定函数像素着色器转换器。
注意 对于 DirectX 8.0 之前的 DirectX 版本,固定函数到着色器映射代码是在Ddraw.dll中实现 的 。
1. 功能概述
固定功能(Fixed-Function)转换器是 Direct3D 运行时提供的兼容层,用于将传统的固定功能渲染指令(如光照、纹理混合)自动转换为等效的顶点/像素着色器代码。其行为因 DirectX 版本而异:
2. DirectX 9.0 的转换规则
(1) 基本特性
项目 | 说明 |
---|---|
支持模型 | 仅限 Windows Vista+ WDDM 驱动模型 |
默认状态 | 转换器启用 |
纯设备(Pure Device) | 转换器启用时强制降级为 HAL 设备 |
混合顶点处理 | 支持(部分操作硬件加速,部分软件模拟) |
(2) 顶点处理规则
处理模式 | 转换器使用条件 |
---|---|
软件顶点处理 | 强制使用固定功能→顶点着色器转换器 |
硬件顶点处理 | 需硬件支持 VS 2.0+ 时启用转换器 |
混合顶点处理 | 动态切换硬件/软件路径,浮点常量数适配硬件限制 |
(3) 像素处理规则
条件 | 行为 |
---|---|
硬件支持 PS 2.0+ | 启用固定功能→像素着色器转换器 |
硬件仅支持 PS 1.x | 回退到传统固定功能管线(无转换) |
3. DirectX 8.0 及更早版本的转换规则
(1) 关键差异
项目 | DirectX 9.0 | DirectX 8.0 及更早 |
---|---|---|
软件顶点处理 | 支持转换器 | 不支持转换器 |
实现位置 | Direct3D 运行时 | DirectDraw (Ddraw.dll) |
HAL 设备强制降级 | 是 | 否 |
(2) 硬件处理一致性
- 顶点着色器:需硬件支持 VS 2.0+ 才启用转换器。
- 像素着色器:需硬件支持 PS 2.0+ 才启用转换器。
4. 驱动开发注意事项
(1) 能力声明
通过 D3DCAPS9 或 D3DCAPS8 结构声明支持的着色器版本:
caps.VertexShaderVersion = D3DVS_VERSION(2, 0); // 声明支持 VS 2.0
caps.PixelShaderVersion = D3DPS_VERSION(2, 0); // 声明支持 PS 2.0
(2) 混合模式处理
在混合顶点处理模式下,驱动需动态分配常量寄存器:
if (IsMixedVertexProcessing()) {pDevice->SetVertexShaderConstantF(0, pConstants, AdjustedCount); // 适配硬件限制
}
(3) 纯设备兼容性
当应用请求纯设备时,运行时自动回退到 HAL 设备,驱动需处理可能的性能警告:
if (BehaviorFlags & D3DCREATE_PUREDEVICE) {DebugPrint("警告:纯设备请求被降级为 HAL 设备");
}
5. 转换器工作流程示例
6. 性能影响与优化
场景 | 优化建议 |
---|---|
高频状态切换 | 缓存转换后的着色器,避免重复生成。 |
混合模式开销 | 优先使用全硬件路径(通过 D3DCREATE_HARDWARE_VERTEXPROCESSING )。 |
常量寄存器限制 | 在 SetVertexShaderConstantF 中实现动态分区(部分硬件/部分软件)。 |
7. 调试与验证
工具:
- PIX on Windows:捕获转换后的着色器代码。
- DirectX Caps Viewer:检查驱动声明的着色器支持级别。
WHCK 测试项:
- Device.Graphics.Direct3D.FixedFunctionConverter:验证转换器功能正确性。
8. 总结
版本差异:
- DX9 转换器集成在运行时中,支持更灵活的混合模式。
- DX8 及更早版本依赖 DirectDraw,功能受限。
驱动要求:
- 正确声明着色器版本支持。
- 处理纯设备降级和混合模式常量分配。
兼容性关键:确保固定功能流水线在现代化硬件上仍能高效运行。