.. _data-types: ======================== 数据类型和变量 ======================== 这些是 DSHL 原生的数据类型(意味着它们可以在 ``hlsl{...}`` 块之外使用)。 - 标量类型: ``float``, ``int``, ``bool`` - Vector 4D 类型: ``float4``, ``int4`` - Matrix 4x4 类型: ``float4x4`` - 纹理: ``texture`` - 缓存: ``buffer``, ``const_buffer`` - 光追结构: ``tlas`` DSHL 中还有一些特殊的**可转换**类型,用于处理顶点数据输入。 请参阅 :ref:`channels` 获取更多信息。 .. _global-variables: ---------------- 全局变量 ---------------- DSHL 中的全局变量通常在运行时从 C++ 代码中设置。 全局变量的声明语法如下: .. code-block:: c (type) name [ = initializer ] [always_referenced]; 示例: .. code-block:: c 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 上的变量时,这将很有帮助。 .. _local-variables: --------------- 局部变量 --------------- 局部变量在 ``shader{...}`` 结构中的声明方式与此类似: .. code-block:: c [specifier] (type) name [ = initializer ] [no_warnings]; 局部变量可以有以下**说明符**。 - ``local`` -- 基本上是堆栈上的变量,这些变量在着色器外部不可见,在 CPU 端也不可见,只有在着色器块 :ref:`shader-blocks` 中进行一些临时计算时才需要它们。 - ``static`` -- 表示该变量是材质参数,只在材质实例化时设置一次。 - ``dynamic`` -- 与 ``static`` 类似,定义了一个材质参数,但可以在运行时更改。 .. warning:: 使用 ``dynamic`` (以及全局)着色器变量比 ``static`` 更昂贵,因为每次调用着色器的 ``setStates()`` 时,都要执行 stcode(负责设置这些变量)。 .. note:: ``no_warnings``(无警告)是一个仅用于 ``static``变量的修改器。当我们需要在 CPU 上访问着色器变量,而不在着色器中使用它们(通常会触发警告)时,就会使用它。 -------------------- 纹理和缓存 -------------------- 纹理和缓冲区被声明为全局变量 .. code-block:: c texture some_tex; buffer some_buf; const_buffer some_constant_buf; 然后通过 DSHL 预着色器将 C++ 代码输送到 DSHL,例如 .. code-block:: c (ps) { my_tex@smp2d = some_tex; my_buf@buf = some_buf hlsl { #include // 假设 some_buffer_inc.hlsli 已定义 SomeBuffer 结构 StructuredBuffer my_buf@buf; } my_cbuf@cbuf = some_constant_buf hlsl { cbuffer my_cbuf@cbuf { #include // 假设 some_constant_buffer_inc.hlsli 已定义 SomeConstantBuffer 结构 SomeConstantBuffer my_constant_buf; }; } // 现在可在 HLSL 中访问 my_tex、my_buf 和 my_constant_buf 名称 } 请参阅 :ref:`preshader` 获取更多信息。