Common-Shader Core
在着色器模型 4 中,所有着色器阶段都使用通用着色器核心实现相同的基本功能。 此外,这三个着色器阶段(顶点、几何图形和像素)中的每个阶段都提供特定于每个阶段的功能,例如能够从几何着色器阶段生成新基元或放弃像素着色器阶段中的特定像素。 下图显示了数据如何流经着色器阶段,以及公共着色器核心与着色器内存资源的关系。
着色器阶段关系图
- 输入数据:顶点着色器从输入汇编器阶段接收其输入;几何图形和像素着色器从上一着色器阶段接收其输入。 其他输入包括 系统值语义,这些语义由管道中的第一个单位使用,它们适用。
- 输出数据:着色器生成输出结果,以传递到管道中的后续阶段。 对于几何着色器,单个调用的数据输出量可能会有所不同。 某些输出由通用着色器核心(如顶点位置和呈现目标数组索引)解释,其他输出设计为由应用程序解释。
- 着色器代码:着色器可以从内存中读取、执行矢量浮点和整数算术运算或流控制作。 可以在着色器中实现的语句数没有限制。
- 采样器:采样器定义如何采样和筛选纹理。 多达 16 个采样器可以同时绑定到着色器。
- 纹理:可以使用采样器筛选纹理,也可使用 加载 固有函数直接按纹素读取纹理。
- 缓冲区:从不筛选缓冲区,但可以直接使用 加载 内部函数从内存中读取缓冲区。 可以同时将多达 128 个纹理和缓冲区资源(组合)绑定到着色器。
- 常量缓冲区:常量缓冲区针对着色器常量变量进行优化。 多达 16 个常量缓冲区可以同时绑定到着色器阶段。 它们旨在从 CPU 进行更频繁的更新;因此,它们具有其他大小、布局和访问限制。
Direct3D 9 和 Direct3D 10 之间的差异:
- 在 Direct3D 9 中,每个着色器单元都有一个小型常量寄存器文件,用于存储所有常量着色器变量。 容纳具有此有限常量空间的所有着色器需要 CPU 频繁回收常量。
- 在 Direct3D 10 中,常量存储在内存中的不可变缓冲区中,并像管理任何其他资源一样进行管理。 应用程序可以创建的常量缓冲区数没有限制。 通过将常量按更新和使用情况的频率将常量组织到缓冲区中,可以显著减少更新常量以容纳所有着色器所需的带宽量。
整数和按位支持
常见的着色器核心提供一组符合 IEEE 的 32 位整数和按位运算。 这些作支持图形硬件示例中的新算法类,包括压缩和打包技术、FFT 和位域程序流控制。
Direct3D 10 HLSL 中的 int 和 uint 数据类型映射到硬件中的 32 位整数。
Direct3D 9 和 Direct3D 10 之间的差异: 在标记为 HLSL 中的整数的 Direct3D 9 流输入中,被解释为浮点。 在 Direct3D 10 中,标记为整数的流输入解释为 32 位整数。 此外,布尔值现在已设置所有位或所有位未设置。 如果值不等于 0.0f(允许正零和负零)和 false,则转换为 布尔 的数据将被解释为 true。 |
按位运算符
常见的着色器核心支持以下按位运算符:
算子 | 功能 |
---|---|
~ | 逻辑不 |
<< | 左移 |
>> | 右移 |
& | 逻辑和 |
| | 逻辑或 |
^ | 逻辑 Xor |
<<= | 左移等于 |
>>= | 右移等于 |
&= | 等于 |
|= | 或等于 |
^= | Xor Equal |
按位运算符定义为仅对 int 和 uint 数据类型进行作。 尝试对 浮点数 或 结构使用位运算符 数据类型将导致错误。 对于其他运算符,按位运算符遵循与 C 相同的优先级。
二进制转换
在整数和浮点类型之间进行强制转换将转换遵循 C 截断规则的数值。 将值从 浮点强制转换为 int,并返回 浮点 是一种损失转换,具体取决于目标数据类型的精度。 下面是一些转换函数:asfloat(DirectX HLSL)、asint(DirectX HLSL)、asuint(DirectX HLSL)。
也可以使用 HLSL 内部函数执行二进制转换。 这会导致编译器将数字的位表示形式重新解释为目标数据类型。