使用 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 编程指南