使用 HLSL 最小精度

从 Windows 8开始,图形驱动程序可以使用大于或等于其指定位精度的任何精度来实现最小精度HLSL标量数据类型。 当 HLSL 最小精度着色器代码用于实现 HLSL 最小精度的硬件上时,占用的内存带宽更少,因此也使用较少的系统电源。

可以通过使用 D3D11 FEATURE _ _ SHADER _ MIN PRECISION _ _ SUPPORT值调用 ID3D11Device::CheckFeatureSupport来查询图形驱动程序提供的最小精度支持。 有关详细信息,请参阅 HLSL 最小精度支持

声明具有最小精度数据类型的变量

若要在 HLSL 着色器代码中使用最小精度,请为矢量) 、min16int、min10float 等声明类型为 min16float (min16float4 的单个变量。 使用这些变量,着色器代码指示它不需要比变量指示的精度更高。 但硬件可以忽略最小精度指示器,以完全 32 位精度运行。 在利用最小精度的硬件上使用着色器代码时,使用的内存带宽较少,因此,只要着色器代码预期比它指定的精度更高,系统电源也更少。

无需创作多个着色器,这些着色器无需使用最小精度。 相反,创建具有最小精度的着色器,如果图形驱动程序报告它不支持任何最小精度,则最小精度变量的行为完全为 32 位精度。 HLSL 最小精度着色器在低于 Windows 8 的操作系统上不起作用,因此,如果计划以早期操作系统为目标,则需要创作多个着色器,有些着色器会使用,而其他着色器不使用最小精度。

备注

请勿在着色器内的不同精度级别之间进行数据切换,因为这些类型的转换是浪费的,会降低性能。 例外情况是着色器常量仍始终为 32 位,但供应商可以设计图形硬件,这些硬件可自由向下转换为 HLSL 指令读取可能使用的任何较低精度。

通过使用最小精度,可以在着色器代码的各个部分控制计算的精度。

HLSL 最小精度规则类似于 C/C++,其中表达式中的类型确定运算的精度,而不是最终写入的类型。

测试最小精度着色器代码

参考光栅器 (D3D _ DRIVER _ TYPE _ REFERENCE) 通过量化每个 HLSL 指令到指定精度,大致了解 HLSL 着色器代码中最小精度的行为方式。 这有助于发现可能意外依赖超过最小精度的代码。 当 HLSL 着色器代码使用最小精度时,引用光栅器不会更快地运行,但可以使用它来验证代码的正确性。 WARP (D3D _ DRIVER _ TYPE _ WARP) 不支持在 HLSL 着色器代码中使用最小精度;WARP 仅以完全 32 位精度运行。

HLSL 编程指南