Common-Shader核心

在着色器模型 4 中,所有着色器阶段都使用通用着色器核心实现相同的基本功能。 此外,这三个着色器阶段 (顶点、几何图形和像素) 为每个阶段提供唯一的功能,例如能够从几何着色器阶段生成新基元或放弃像素着色器阶段中的特定像素。 下图显示了数据如何流经着色器阶段,以及公共着色器核心与着色器内存资源的关系。

diagram of data flow in a shader stage

  • 输入数据:顶点着色器从输入汇编器阶段接收其输入;几何图形和像素着色器从上一着色器阶段接收其输入。 其他输入包括 系统值语义,这些语义可供管道中的第一个单元使用,它们适用。
  • 输出数据:着色器生成输出结果,以传递到管道中的后续阶段。 对于几何图形着色器,单个调用的数据输出量可能会有所不同。 某些输出由公共着色器核心 (解释,例如顶点位置和呈现目标数组索引) ,其他输出由应用程序设计为解释。
  • 着色器代码:着色器可以从内存中读取、执行矢量浮点和整数算术运算或流控制操作。 着色器中可以实现的语句数没有限制。
  • 采样器:采样器定义如何采样和筛选纹理。 多达 16 个采样器可以同时绑定到着色器。
  • 纹理:可以使用采样器筛选纹理,也可以使用 负载 内部函数直接按纹素读取纹理。
  • 缓冲区:从不筛选缓冲区,但可以直接使用 加载 内部函数从内存中读取缓冲区。 (组合) 可以同时绑定到着色器,多达 128 个纹理和缓冲区资源。
  • 常量缓冲区:常量缓冲区针对着色器常量变量进行优化。 多达 16 个常量缓冲区可以同时绑定到着色器阶段。 它们旨在通过 CPU 进行更频繁的更新;因此,它们具有其他大小、布局和访问限制。

Direct3D 9 和 Direct3D 10 之间的差异:

  • 在 Direct3D 9 中,每个着色器单元都有一个小型常量寄存器文件,用于存储所有常量着色器变量。 容纳具有此有限常量空间的所有着色器需要 CPU 频繁回收常量。
  • 在 Direct3D 10 中,常量存储在内存中的不可变缓冲区中,并像任何其他资源一样进行管理。 应用程序可以创建的常量缓冲区数没有限制。 通过将常量按更新和使用情况的频率将常量组织到缓冲区中,可以显著减少更新常量以容纳所有着色器所需的带宽量。

整数和按位支持

常见的着色器核心提供一组符合 IEEE 的 32 位整数和按位运算。 这些操作使图形硬件示例中的新算法类包括压缩和打包技术、FFT 和位字段程序流控制。

Direct3D 10 HLSL 中的 intuint 数据类型映射到硬件中的 32 位整数。

Direct3D 9 和 Direct3D 10 之间的差异:
在标记为 HLSL 中的整数的 Direct3D 9 流输入中,被解释为浮点。 在 Direct3D 10 中,标记为整数的流输入解释为 32 位整数。
此外,布尔值现在是所有位集或所有位未设置。 如果值不等于 0.0f,则转换为 布尔 的数据将解释为 true, (允许正零和负零为 false) ,否则为 false。

位运算符

常见的着色器核心支持以下按位运算符:

运算符 函数
~ 逻辑非
<< 左移
>> 右移
& 逻辑与
| 逻辑或
^ 逻辑 Xor
<<= 左移等于
>>= 右移相等
&= 和等于
|= 或等于
^= Xor Equal

按位运算符定义为仅对 intuint 数据类型进行操作。 尝试对 浮点结构 数据类型使用按位运算符将导致错误。 对于其他运算符,按位运算符遵循与 C 相同的优先级。

二进制转换

整数和浮点类型之间的强制转换将转换遵循 C 截断规则的数值。 将值从 浮点转换为 int,并返回 浮点 是一个损失转换,具体取决于目标数据类型的精度。 下面是一些转换函数: asfloat (DirectX HLSL) asint (DirectX HLSL) asuint (DirectX HLSL)

也可以使用 HLSL 内部函数执行二进制转换。 这会导致编译器将数字的位表示形式重新解释为目标数据类型。

着色器模型 4