精确测试了下纹理坐标与像素的映射,仍有些困惑,求解。
先看看这张原图,便于观察,做了放大的处理:
注意,彩色边框的外围还有1个像素白色空间,用于测试。
实际要显示的内容宽高是126×126。
然后我的代码是这样的:(D3DFVF_XYZRHW格式)
float x = 200.0, y = 200.0;float width = 128.0f, height = 128.0f; // 图像的实际宽和高float left= 1.0f/width;float top = 1.0f/height;float right = left + 126.0f/width;float bottom= top + 126.0f/height;CustomVertex objData[] ={ { x, y, 0, 1, col, left, top }, { width+x, y, 0, 1, col, right, top }, { width+x, height+y, 0, 1, col, right, bottom }, { x, height+y, 0, 1, col, left, bottom }};
//define FVF with vertex values in transformed screen space#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1)struct CUSTOMVERTEX{ FLOAT x, y, z, rhw; // position FLOAT tu, tv; // texture coordinates};//unadjusted vertex valuesfloat left = 0.0f;float right = 255.0f;float top = 0.0f;float bottom = 255.0f;//256 by 256 rectangle matching 256 by 256 textureCUSTOMVERTEX vertices[] ={ { left, top, 0.5f, 1.0f, 0.0f, 0.0f}, // x, y, z, rhw, u, v { right, top, 0.5f, 1.0f, 1.0f, 0.0f}, { right, bottom, 0.5f, 1.0f, 1.0f, 1.0f}, { left, top, 0.5f, 1.0f, 0.0f, 0.0f}, { right, bottom, 0.5f, 1.0f, 1.0f, 1.0f}, { left, bottom, 0.5f, 1.0f, 0.0f, 1.0f}, };//adjust all the vertices to correctly line up texels with pixels for (int i=0; i<6; i++){ vertices[i].x -= 0.5f; vertices[i].y -= 0.5f;}
[解决办法]
根据SDK里面的说法,顶点坐标偏移和纹理坐标的反向偏移的效果是等价的,但是顶点坐标偏移是固定的0.5,不需要额外的计算。
[解决办法]
没有问题的样子:
用的是你在主楼的图片,大小387*387,显示了中间383*383的部分:
Rect rc(2,2,385,385);
image.Load(L"E:\\test.jpg",&rc);
Image的显示用的是顶点坐标-0.5f
[解决办法]
遇到你说的问题了,而且怎么调也不对,真诡异,呵呵
[解决办法]
width+x -->改为width+x-1看看
[解决办法]
你想,加入x=2, width=2, 那么右边的像素应该是3,而按照楼主的计算 width+x=4,多算了一个像素
[解决办法]
把要显示的图片区域修改为(50,50,91,91)就正常了,在想是不是开区间闭区间的问题。
[解决办法]
里面蓝色那少一块。。
[解决办法]
[解决办法]
索引是从0开始还是从1开始啊, :)
数一数
0 1 2 3 4 。。。。。 128 长度是128,坐标点可是129个,因为索引是从0开始
红色的开始坐标是0, 结束坐标是127吧