Common-Shader Core

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

着色器阶段中的数据流关系图

  • 输入数据:顶点着色器从输入汇编程序阶段接收其输入;geometry 和像素着色器从上一个着色器阶段接收其输入。 其他输入包括 系统值语义,它们由管道中适用的第一个单元使用。
  • 输出数据:着色器生成输出结果,以传递到管道中的后续阶段。 对于几何着色器,单个调用的数据输出量可能会有所不同。 某些输出由通用着色器核心 (例如顶点位置和 render-target-array 索引) ,其他输出由应用程序解释。
  • 着色器代码:着色器可以从内存中读取、执行矢量浮点和整数算术运算或流控制操作。 可以在着色器中实现的语句数没有限制。
  • 采样器:采样器定义如何对纹理进行采样和筛选。 可以同时将 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 之间的差异:
在 Direct3D 9 中,在 HLSL 中标记为整数的流输入被解释为浮点。 在 Direct3D 10 中,标记为整数的流输入被解释为 32 位整数。
此外,布尔值现在是设置的所有位或所有位未设置。 如果值不等于 0.0f,则转换为 bool 的数据将被解释为 true (则正零和负零都允许为 false) false。

位运算符

通用着色器核心支持以下位运算符:

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

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

二进制强制转换

在整数和浮点类型之间转换将转换遵循 C 截断规则的数字值。 将值从 float 转换为 int,再转换回 float 是一种损失转换,取决于目标数据类型的精度。 下面是一些转换函数 :asfloat (DirectX HLSL) 、asint (DirectX HLSL) 、asuint (DirectX HLSL) 。

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

着色器模型 4