译注:对于一个想学好着色器语言(不管是ASM还是HLSL、GLSL)的人来说,了解显卡中相应寄存器的功能和局限是必不可少的。 下面给出了PS 1.X中可用的寄存器的相关信息,希望能给大家带来帮助!
有些单词我实在不知道怎么翻译,只可意会! |
像素着色器需要依靠寄存器来取得顶点数据,输出像素数据,取得计算时的临时结果和关联纹理采样通道(stage)。有几种类型的寄存器,每一种都有特殊的功能和用途。
像素着色器需要的用到的数据由寄存器保管,下面是寄器存的所有介绍
寄存器类型:描述了四种可用的寄存器和他们各自的用途
读取端口限制:单指针使用多个寄存器时的限制
R/RW: 描述了哪些寄存器可以用来读,写或是读写。
范围:各个分量的范围的详细说明
Register Types
Versions
Name Type 1_1 1_2 1_3 1_4
c# Constant register 8 8 8 8
r# Temporary register 2 2 2 6
t# Texture register 4 4 4 6
v# Color register 2 2 2 2 in phase 2
1,常量寄存器:常量寄存器容纳了常量数据。数据可以用IDirect3DDevice9::SetPixelShaderConstantF函数将一个常量装入常量寄存器中。也可以用def-ps来定义一个常量。 常量寄存器对纹理寻址指令来说是不可用的,唯一例外的是texm3x3spec-ps指令,这个指令使用一个常量寄存器来提供一个视线向量(eye-ray vector)
2,临时寄存器:临时寄存器用来存立即结果。r0用来作为PS的最终输出。shader的最后时刻r0中存放的是最后的像素颜色值
如果任何的着色器试图从一个没有被写入数据的临时寄存器中读取数据时,着色器激IDirect3DDevice9::CreatePixelShader将会失败(shader validation will fail)。假设激活(validation)是可用状态D3DXAssembleShader函数调用也会因为相同的原因而失败。(不要使用D3DXSHADER_SKIPVALIDATION)
纹理寄存器:
在ps 1_1 到1_3中,纹理寄存器容纳纹理数据或是纹理坐标。当一个纹理被采样时,纹理数据便被装载到一个纹理寄存器中。
当纹理通道状态属性被登记的时候纹理采样使用纹理坐标来查询(look up)或采样(sample)一个纹理坐标(u,v,w,q)标记的颜色值。纹理坐标数据会根据顶点纹理坐标数据进行插值,并关联到相关的纹理通道。纹理通道号与纹理坐标声明序列有一个一一对应关系。默认情况下,顶点格式中定义的第一个纹理坐标与纹理通道0关联。
在这些版本的像素着色器中,当纹理寄存器用来做算术运算的时候就和临时寄存器的效果一样了。
在ps_1_4中,纹理寄存器(t#)容纳的是只读纹理坐标信息。这意味着纹理坐标集和纹理通道编号是独立的。纹理通道编号由目的寄存器(r0 to r5)决定。对于texld指令来说,纹理坐标集由源寄存器t0 to t5决定。因此纹理坐标集可以映射到任何的纹理通道上。另外,对于texld的源寄存器(指定纹理坐标信息)也可以是临时寄存器(r#)。在这样的情况下,临时寄存器记录纹理坐标。
颜色寄存器容纳了每个像素的颜色值,这个值通过顶点数据中的漫反射和镜面光颜色值迭代而来。对于ps_1_4。颜色寄存器只有在phase2中可用。如果着色模式设置为D3DSHADE_FLAT,那么顶点颜色中的颜色迭代将不可用。如果雾化开启的话,那么渲染管线还是会忽略着色模式,对雾进行颜色迭代。记住雾化比像素着色器后应用。
通常我们会从v0加载顶点漫反射颜色数据。从v1加载顶点镜面光颜色数据。
输入颜色数据值将会被规范到0和1,因为这是像素着色器中的颜色寄存器的有效范围
像素着色器对颜色寄存器进行只读操作。颜色寄存器中存放的是迭代值,但是迭代可能会造成比纹理坐标低很多精度