Direct3D9纹理坐标采样的计算方法

纹理坐标采样,看似简单,其实则不然,特别是DX9中的像素纹素对应,这对纹理的精确操作带来非常大的困难,至少对我来说,今天记录下刚才分析出的一些结论。
  首先我们引入1个一维图片1x8
它的维度是1x8的,我们首先绘制一个1x8的矩形。我们要把它精确对应到像素怎么办呢,答案是将矩形的位置左移-0.5个单位,这样做导致了什么样的结果呢?因为我们的纹理坐标是采用的像素点的坐标。原先的像素点也是矩形的顶点是(0,0).那么纹理坐标也是(0,0),因为是和顶点绑定的。我们将顶点左移0.5个单位后,会造成取样的像素点的坐标变为0.5.这就是结果,你其实也可以直接偏移纹理坐标。RenderMonkey中的例子就是这么做的。
  有了纹理坐标,在介绍个方程。Tu = U * Width - 0.5; Tv = V * Height - 0.5; 这是Direct3D9中的映射方式。(U,V)是纹理坐标范围[0,1]。我们姑且把Tu,Tv叫做纹素坐标,范围[0, Width ], [0, Height] Width和Height 分别为纹理的宽高。那么对于纹理坐标(0,0) (Tu, Tv) = (-0.5, -0.5)这个Tu, Tv怎么在纹理中寻找纹素呢,第一排第一个像素为0, 第二个为1, 最后一个为Width - 1;对于我们的(-0.5, -0.5)显然对于它取什么值要看我们的寻址方式了,若果是环绕(Wrap),它就是第一个像素和最后一个像素各一半,如果是Clamp,它就是第一个像素。但是这里,因为我们将矩形左移了0.5个单位,所以,第一个像素的纹理坐标为(0,0)带入方程得到的值也为Tu, Tv也是(0, 0),因此完全对应我们的第一个像素,不管你是用的线性插值,还是最近点插值,线性插值也无外乎照顾了一下小数部分,而我们这里没小数了。这样就能做到像素的精确操作。

矩形顶点左移动0.5个单位(Linear):

矩形顶点左移动0.5个单位(Point):

矩形纹理坐标右移1/Width个单位(Linear)

矩形纹理坐标右移1/Width个单位(Point)


矩形顶点坐标不移动(Point) 

矩形顶点坐标不移动(Linear)
                                                                                                   0 * 0.5 + 255 * 0.5
posted @ 2009-10-13 16:35  ttthinks  阅读(1830)  评论(0编辑  收藏  举报