首先我们引入1个一维图片
![](https://i-blog.csdnimg.cn/blog_migrate/fd5259088db08b27c5b87aed1d78bc2b.jpeg)
它的维度是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):
![](https://i-blog.csdnimg.cn/blog_migrate/fd5259088db08b27c5b87aed1d78bc2b.jpeg)
矩形顶点左移动0.5个单位(Point):
![](https://i-blog.csdnimg.cn/blog_migrate/fd5259088db08b27c5b87aed1d78bc2b.jpeg)
矩形纹理坐标右移1/Width个单位(Linear)
![](https://i-blog.csdnimg.cn/blog_migrate/fd5259088db08b27c5b87aed1d78bc2b.jpeg)
矩形纹理坐标右移1/Width个单位(Point)
![](https://i-blog.csdnimg.cn/blog_migrate/fd5259088db08b27c5b87aed1d78bc2b.jpeg)
矩形顶点坐标不移动(Point)
![](https://i-blog.csdnimg.cn/blog_migrate/fd5259088db08b27c5b87aed1d78bc2b.jpeg)
矩形顶点坐标不移动(Linear)
![](https://i-blog.csdnimg.cn/blog_migrate/942b285a82c3dd856ce700304e8768cc.jpeg)
0 * 0.5 + 255 * 0.5