如果用户模式显示驱动程序支持每种着色器类型 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,功能受限。
驱动要求:
- 正确声明着色器版本支持。
- 处理纯设备降级和混合模式常量分配。
兼容性关键:确保固定功能流水线在现代化硬件上仍能高效运行。