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。 如果启用验证(不使用D3DXSHADER_SKIPVALIDATION),D3DXAssembleShader 将失败。

  • 纹理寄存器

    对于像素着色器版本 1_1 到 1_3,纹理寄存器包含纹理数据或纹理坐标。 采样纹理时,纹理数据将加载到纹理寄存器中。 纹理采样使用纹理坐标查找或采样指定(u,v,w,q)坐标的颜色值,同时考虑纹理阶段状态属性。 纹理坐标数据从顶点纹理坐标数据内插,并与特定纹理阶段相关联。 纹理阶段号和纹理坐标声明顺序之间存在默认的一对一关联。 默认情况下,在顶点格式中定义的第一组纹理坐标与纹理阶段 0 相关联。

    对于这些像素着色器版本,纹理寄存器的行为就像在算术指令使用时临时寄存器一样。

    对于像素着色器版本 1_4,纹理寄存器(t#)包含只读纹理坐标数据。 这意味着纹理坐标集和纹理阶段编号彼此独立。 纹理阶段号(从中采样纹理)由目标寄存器号(r0 到 r5)确定。 对于纹理坐标集,纹理坐标集由源寄存器(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

 

例如,几乎所有版本的颜色寄存器都有两个读取端口限制。 这意味着单个指令最多可以使用两个不同的颜色寄存器(例如 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# 临时注册 乌尔曼 乌尔曼 乌尔曼 乌尔曼
t# 纹理寄存器 乌尔曼 乌尔曼 乌尔曼 请参阅以下说明
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

注册