可恶的纹理偏移,一直困惑的事情。最后还是得要试验靠实践出真知:
问题:
当把1024×1024大小的贴图,通过纹理矩阵变换,取出来其中的一部分区域。
然后通过标准QUAD将其绘制到到800×600的表面(backbuffer)。
这里的纹理偏移值该是何值才能保证结果绝对正确毫无偏移。
以StretchRect的结果为准,经过反复试验。得到uv坐标的偏移值应该是:
0.5 / Size(backbuffer) * Size(经过纹理矩阵转换后的纹理坐标范围)
总结如下:
通过D3D9文档知,偏差是0.5个像素(而不是纹素)。
所以关键在于,这0.5个像素对应的纹理的尺寸是多少。
总的纹理尺寸(即变换后的纹理坐标范围)/ 绘制表面的尺寸:是每一个像素对应的纹理尺寸。
再乘以0.5即为所求。
目标缓冲区的尺寸如果和纹理尺寸相同,纹理偏移量=0.5/宽或高;
顶点也必须偏移0.5的值,不能出现(0,0)的坐标,否则正交投影的计算会出错。