数据类型和变量
这些是 DSHL 原生的数据类型(意味着它们可以在 hlsl{...} 块之外使用)。
标量类型:
float,int,boolVector 4D 类型:
float4,int4Matrix 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
全局变量不能有 float2 和 float3 类型。
类型 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(负责设置这些变量)。
纹理和缓存
纹理和缓冲区被声明为全局变量
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 获取更多信息。