标量数据类型

HLSL 支持多种标量数据类型:

  • bool - true 或 false。
  • int - 32 位带符号整数。
  • uint - 32 位无符号整数。
  • dword - 32 位无符号整数。
  • - 16 位浮点值。 此数据类型仅用于语言兼容性。 Direct3D 10 着色器目标将所有半数据类型映射到 float 数据类型。 半数据类型不能用于统一全局变量 (如果需要该功能,请使用 /Gec 标志) 。
  • float - 32 位浮点值。
  • double - 64 位浮点值。 不能将双精度值用作流的输入和输出。 若要在着色器之间传递双精度值,请将每个 双精度 值声明为一对 uint 数据类型。 然后,使用 asuint 函数将每个 双精度 值打包到 uints 对中,使用 asdouble 函数将 uint对解压回 双精度

从 Windows 8 开始,HLSL 还支持最小精度标量数据类型。 图形驱动程序可以使用大于或等于其指定位精度的任何精度来实现最小精度标量数据类型。 建议不要依赖于依赖于特定基础精度的固定或包装行为。 例如,图形驱动程序可能会以全 32 位精度对 min16float 值执行算术。

  • min16float - 最小 16 位浮点值。
  • min10float - 最小 10 位浮点值。
  • min16int - 最小 16 位有符号整数。
  • min12int - 最小 12 位带符号整数。
  • min16uint - 最小 16 位无符号整数。

有关标量文本的详细信息,请参阅 语法

HLSL 着色器模型 6.0 (中引入了以下标量,Windows 10版本 1607) :

  • uint64_t - 64 位无符号整数。
  • int64_t - 64 位有符号整数。

以下标量是在 Windows 10 版本 1803) 中的 HLSL 着色器模型 6.2 (中引入的,如果使用 -enable-16bit-types ,则可以使用:

  • float16_t - 始终是 16 位浮点值 (,而其他 16 位浮点值可能是 16 位浮点值,也可能不是 16 位) 。
  • uint16_t - 16 位无符号整数。
  • int16_t - 16 位带符号整数。

有关 16 位类型的详细信息,请参阅 16 位标量类型。 这些需要图灵或更高版本支持的硬件中的 16 位支持。

Direct3D 9 与 Direct3D 10 之间的差异:

在 Direct3D 10 中,以下类型是浮点类型的修饰符:

  • snorm float - IEEE 32 位有符号规范化浮点数,范围为 -1 到 1(含)。
  • unorm float - IEEE 32 位无符号规范化浮点数,范围为 0 到 1(含)。

例如,下面是一个 4 分量有符号规范化 float-variable 声明。

snorm float4 fourComponentIEEEFloat;

字符串类型

HLSL 还支持 字符串 类型,即 ASCII 字符串。 没有接受字符串的操作或状态;但效果可以查询字符串参数和注释。

示例

// Top-level variable.
float globalShaderVariable; 

// Top-level function.
void function(
in float4 position: POSITION0 // Top-level argument.
              )
{
  float localShaderVariable; // Local variable.
  function2(...)
}

void function2()
{
  ...
}

另请参阅