VBGAME-DIRECT3D

坚持并快乐着!——繁星
posts - 15, comments - 15, trackbacks - 0, articles - 1
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

像素着色器(2)

Posted on 2006-12-03 19:07 繁星 阅读(985) 评论(0)  编辑 收藏 引用

Microsoft DirectX 8.1 (Visual Basic) (pixel shader versions 1.0, 1.1, 1.2, 1.3, 1.4)

Pixel Shader Texture Addressing( 像素着色器纹理寻址 )

依靠纹理寻址方式,纹理坐标被直接使用或被用来从一个纹理中采样数据。

纹理坐标集能够作为顶点格式一部分被提供或者能够从某些特定的纹理图中读取。纹理坐标集一般也被称为 TCs 。查询一个二维纹理图使用 (UV) 坐标系统。查询一个三维纹理图(立方体图或体纹理图)使用 (UVW) 坐标系统。同样,纹理坐标集也同样可以被直接使用。

当用一个纹理坐标定址一个位置的纹素数据时采样发生了。这个过程通常也被称为纹理查询。为了采样一个纹理,纹理坐标必须先与纹理级别相联系。在纹理坐标地址采样得到的数据受以下四个因数影响:

1.                  纹理寻址指令 .

2.                  纹理坐标集 .

3.                  纹理所在的坐标级别 .

4.                  在纹理级别状态中的纹理采样属性的设置 .

下图显示了纹理坐标集用于纹理寻址的机制:

BlockDiag_PixelShader_TexAddress.gif


对于 pixel shader version 1.0 to 1.3, 纹理坐标有以下三种使用方法:

·                     纹理坐标直接作为纹理坐标数据被简单地载入到寄存器,而不发生查询和采样操作。

·                     纹理采样器使用得到的纹理坐标集来采样一个纹理,这个纹理被设置在一个纹理级别上,并且根据纹理级别状态中的采样属性来对其进行采样。在 pixel shader version 1.0 to 1.3 中,纹理坐标的设置和其所在的纹理级别号要与指令的目的寄存器号一致。

·                     pixel shader version 1.0 to 1.3 , 某些特殊的纹理寻址指令如: texbem texm3x3spec 能对输入的纹理坐标进行变换产生新的纹理坐标集来对纹理进行采样 . 在使用 texdp3 texm3x3 指令的情况下一个变换被应用,但产生的结果被直接载入到了目的寄存器,而没有用来进行任何文理采样。

对于 pixel shader version 1.4 ,纹理寄存器( t# )拥有不同于以往版本的功用。他储存纹理坐标集。因此,他被认为是纹理坐标寄存器,这些纹理坐标寄存器仅仅只能被读取(对于纹理寻址指令作为源参数)且不能用于算术指令。

拥有纹理坐标集自己的寄存器意味着纹理坐标的设置和纹理级别号能够可以在 pixel shader version 1.4 中的纹理寻址指令中不同。目的寄存器号指明采样操作所在的纹理级别号,但是纹理坐标设置已被新的源寄存器( t# )号所指定。

"Modify TCs" 在原先的图中并没有应用到 pixel shader version 1.4 中,因为发生在纹理采样之前的纹理坐标修改只是用标准的算术指令进行了简单的实现。以下图表和文字对“依赖读取”进行了描述:

BlockDiag_PixelShader_TexAddress2.gif


通常,在使用纹理坐标集采样之前对它进行一些操作是十分有用的,这也可以被称为“依赖读取“。术语”依赖“表明采样得到的文理数据依赖于着色器计算出来的一些结果。

 

对于 pixel shader version 1.0 to 1.3 ,“依赖读取“被局限在使用一个先前纹理寻址指令的结果作为源参数的纹理寻址指令。对于 pixel shader version 1.4 ,”依赖读取“有很大的伸缩性:对纹理采样的纹理坐标集可由先前的纹理寻址指令(或任意的算术指令)的结果获得。在 pixel shader version 1.4 中,”依赖读取“对于一个纹理寻址指令常引入一个 r(#) 寄存器储存纹理标。这意味着”依赖读取“仅发生在第二阶段。

有关算术和纹理寻址指令更多的信息,请参阅“指令流“一章。
只有注册用户登录后才能发表评论。