可恶的纹理偏移,一直困惑的事情。最后还是得要试验靠实践出真知:
问题: 当把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)的坐标,否则正交投影的计算会出错。