ps_1_1__ps_1_2__ps_1_3__ps_1_4寄存器
像素着色器依赖于寄存器来获取顶点数据、输出像素数据、在计算期间保存临时结果以及识别纹理采样阶段。 有多种类型的寄存器,每种寄存器都具有独特的功能。 本部分包含像素着色器版本1_X实现的输入和输出寄存器的参考信息。
注册供像素着色器使用的保留数据。 以下各节将全面介绍寄存器。
- 寄存器类型描述了四种类型的可用寄存器及其用途。
- 阅读端口限制详细介绍在单个指令中使用多个寄存器的限制。
- 只读读写描述哪些寄存器可用于读取和/或写入。
- 范围详细说明了组件数据的范围。
寄存器类型
名称 | 类型 | 版本 1_1 | 版本 1_2 | 版本 1_3 | 版本 1_4 |
---|---|---|---|---|---|
c# | 常量寄存器 | 8 | 8 | 8 | 8 |
R# | 临时寄存器 | 2 | 2 | 2 | 6 |
t# | 纹理寄存器 | 4 | 4 | 4 | 6 |
V# | 颜色寄存器 | 2 | 2 | 2 | 阶段 2 中的 2 |
常量寄存器包含常量数据。 可以使用 SetPixelShaderConstantF 将数据加载到常量寄存器中,也可以使用 def - ps 进行定义。 纹理地址指令无法使用常量寄存器。 唯一的例外是 texm3x3spec - ps 指令,它使用常量寄存器提供眼睛射线矢量。
临时寄存器用于存储中间结果。 r0 还用作像素着色器输出。 着色器末尾的 r0 值是着色器的像素颜色。
在尝试从尚未由先前指令编写的临时寄存器读取的任何着色器上,着色器验证将失败 CreatePixelShader 。 D3DXAssembleShader 同样会失败,前提是启用了验证 (不使用D3DXSHADER_SKIPVALIDATION) 。
纹理寄存器
对于像素着色器版本 1_1 到 1_3,纹理寄存器包含纹理数据或纹理坐标。 对纹理采样时,纹理数据将加载到纹理寄存器中。 纹理采样使用纹理坐标查找或采样指定 (u,v,w,q) 坐标的颜色值,同时考虑纹理阶段状态属性。 纹理坐标数据从顶点纹理坐标数据中插入,并与特定的纹理阶段相关联。 纹理阶段号和纹理坐标声明顺序之间存在默认的一对一关联。 默认情况下,以顶点格式定义的第一组纹理坐标与纹理阶段 0 相关联。
对于这些像素着色器版本,纹理寄存器在由算术指令使用时的行为就像临时寄存器一样。
对于像素着色器版本 1_4,纹理寄存器 (t#) 包含只读纹理坐标数据。 这意味着纹理坐标集和纹理阶段编号彼此独立。 从中采样纹理) 的纹理阶段编号 (由目标寄存器编号 (r0 到 r5) 确定。 对于 texld 指令,纹理坐标集由源寄存器 (t0 到 t5) 确定,因此纹理坐标集可以映射到任何纹理阶段。 此外,源寄存器 (为 texld 指定纹理坐标) 也可以是 r#) (临时寄存器,在这种情况下,临时寄存器的内容用作纹理坐标。
颜色寄存器包含每像素的颜色值。 这些值是通过顶点数据中漫射和反射颜色值的按像素迭代获取的。 对于像素着色器版本 1_4 着色器,颜色寄存器仅在第二阶段可用。
如果阴影模式设置为“D3DSHADE_FLAT”,则禁用顶点颜色 (漫射和反射) 的迭代。 无论阴影模式如何,如果启用了像素雾,则管道仍会循环访问雾。 请记住,雾在管道中应用的晚于像素阴影。
通常使用顶点漫射颜色数据加载 v0 寄存器。 使用顶点反射颜色数据加载 v1 寄存器也是常见的。
输入颜色数据值固定 (饱和) 范围 0 到 1,因为这是像素着色器中颜色寄存器的有效输入范围。
像素着色器对颜色寄存器具有只读访问权限。 这些寄存器的内容是迭代值,但迭代的精度可能远低于纹理坐标。
读取端口限制
读取端口限制指定可在单个指令中用作源寄存器的每种寄存器类型的不同寄存器数。
名称 | 类型 | 版本 1_1 | 版本 1_2 | 版本 1_3 | 版本 1_4 |
---|---|---|---|---|---|
c# | 常量寄存器 | 2 | 2 | 2 | 2 |
R# | 临时寄存器 | 2 | 2 | 2 | 3 |
t# | 纹理寄存器 | 2 | 3 | 3 | 1 |
V# | 颜色寄存器 | 2 | 2 | 2 | 阶段 2 中的 2 |
例如,几乎所有版本的颜色寄存器的读取端口限制为 2。 这意味着单个指令最多可以使用两个不同的颜色寄存器 (v0 和 v1,例如) 作为源寄存器。 此示例演示在同一指令中使用的两个颜色寄存器:
mad r0, v1, c2, v0
只读、读/写
寄存器类型根据只读 (RO) 功能或读/写 (RW) 功能进行标识。 只读寄存器只能用作指令中的源寄存器;它们永远不能用作目标寄存器。
名称 | 类型 | 版本 1_1 | 版本 1_2 | 版本 1_3 | 版本 1_4 |
---|---|---|---|---|---|
名称 | 类型 | 1_1 | 1_2 | 1_3 | 1_4 |
c# | 常量寄存器 | RO | RO | RO | RO |
R# | 临时寄存器 | RW | RW | RW | RW |
t# | 纹理寄存器 | RW | RW | RW | 请参阅以下说明 |
V# | 颜色寄存器 | RO | RO | RO | RO |
支持 RW 的寄存器可用于存储中间结果。 这包括某些着色器版本的临时寄存器和纹理寄存器。
注意
- 对于像素着色器版本 1_4,纹理寄存器是用于纹理寻址指令的 RO,并且纹理寄存器既不能从中读取也不能通过算术指令写入。 此外,由于纹理寄存器已成为纹理坐标寄存器,因此具有 RO 访问权限不是以前功能的回归。
范围
范围是最大和最小寄存器数据值。 范围因寄存器类型而异。 可以使用 GetDeviceCaps 从设备上限查询某些寄存器的范围。
名称 | 类型 | 范围 | 版本 |
---|---|---|---|
c# | 常量寄存器 | -1 到 +1 | 所有版本 |
R# | 临时寄存器 | - PixelShader1xMaxValue 到 + PixelShader1xMaxValue | 所有版本 |
t# | 纹理寄存器 | - MaxTextureRepeat 到 + MaxTextureRepeat | 所有版本 |
V# | 颜色寄存器 | 0 到 1 | 所有版本 |
早期像素着色器硬件使用定点数表示寄存器中的数据。 这会将数值的小数部分的精度限制为最大约 8 位。 设计着色器时请记住这一点。
对于像素着色器版本 1_1 到 1_3,MaxTextureRepeat 必须至少为 1。 对于 1_4,MaxTextureRepeat 必须至少为 8。
有关 PixelShader1xMaxValue 的详细信息,请参阅 D3DCAPS9 。
相关主题