数据类型和变量

这些是 DSHL 原生的数据类型(意味着它们可以在 hlsl{...} 块之外使用)。

  • 标量类型: float, int, bool

  • Vector 4D 类型: float4, int4

  • Matrix 4x4 类型: float4x4

  • 纹理: texture

  • 缓存: buffer, const_buffer

  • 光追结构: tlas

DSHL 中还有一些特殊的**可转换**类型,用于处理顶点数据输入。 请参阅 通道 获取更多信息。

全局变量

DSHL 中的全局变量通常在运行时从 C++ 代码中设置。 全局变量的声明语法如下:

(type) name [ = initializer ]  [always_referenced];

示例:

float4 f4 = (1.0, 1.0, 1.0, 1.0);
int a;
texture tex;

Warning

全局变量不能有 float2float3 类型。 类型 bool 必须有初始化器。 类型 float4x4, texture, buffer, const_buffer 不支持初始化器。

``always_referenced``(始终引用)标志禁止着色器编译器删除全局着色器变量中任何未使用的变量。 例如,当我们要访问 CPU 上的变量时,这将很有帮助。

局部变量

局部变量在 shader{...} 结构中的声明方式与此类似:

[specifier] (type) name [ = initializer ] [no_warnings];

局部变量可以有以下**说明符**。

  • local – 基本上是堆栈上的变量,这些变量在着色器外部不可见,在 CPU 端也不可见,只有在着色器块 着色器块 中进行一些临时计算时才需要它们。

  • static – 表示该变量是材质参数,只在材质实例化时设置一次。

  • dynamic – 与 static 类似,定义了一个材质参数,但可以在运行时更改。

Warning

使用 dynamic (以及全局)着色器变量比 static 更昂贵,因为每次调用着色器的 setStates() 时,都要执行 stcode(负责设置这些变量)。

Note

``no_warnings``(无警告)是一个仅用于 ``static``变量的修改器。当我们需要在 CPU 上访问着色器变量,而不在着色器中使用它们(通常会触发警告)时,就会使用它。

纹理和缓存

纹理和缓冲区被声明为全局变量

texture some_tex;
buffer some_buf;
const_buffer some_constant_buf;

然后通过 DSHL 预着色器将 C++ 代码输送到 DSHL,例如

(ps) {
  my_tex@smp2d = some_tex;

  my_buf@buf = some_buf hlsl {
    #include <some_buffer_inc.hlsli>
    // 假设 some_buffer_inc.hlsli 已定义 SomeBuffer 结构
    StructuredBuffer<SomeBuffer> my_buf@buf;
  }

  my_cbuf@cbuf = some_constant_buf hlsl {
    cbuffer my_cbuf@cbuf {
      #include <some_constant_buffer_inc.hlsli>
      // 假设 some_constant_buffer_inc.hlsli 已定义 SomeConstantBuffer 结构
      SomeConstantBuffer my_constant_buf;
    };
  }

  // 现在可在 HLSL 中访问 my_tex、my_buf 和 my_constant_buf 名称
}

请参阅 Preshader 获取更多信息。