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

转载于:https://www.cnblogs.com/ttthink/archive/2009/10/13/1582588.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值