首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

精确测试了下纹理坐标与像素的映射,仍有些困惑,求解。该怎么处理

2012-02-22 
精确测试了下纹理坐标与像素的映射,仍有些困惑,求解。先看看这张原图,便于观察,做了放大的处理:注意,彩色边

精确测试了下纹理坐标与像素的映射,仍有些困惑,求解。
先看看这张原图,便于观察,做了放大的处理:


注意,彩色边框的外围还有1个像素白色空间,用于测试。
实际要显示的内容宽高是126×126。


然后我的代码是这样的:(D3DFVF_XYZRHW格式)

C/C++ code
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 }};



然而运行之后的情况:



出问题了。左边和右边应该和另外两边一样,为什么左上这两边不正常了?

我那个纹理坐标填的不对么?如果不对的话,应该怎么填?
我自己琢磨了半天也探究不出这个问题的所在。迷迷糊糊的。

另外我想顺便问个问题:
看这两句:
float right = left + 126.0f/128.0f;
float bottom= top + 126.0f/128.0f;
如果图中的右边和下边的彩色边界正好是在127,127的位置,即不留缝隙。
那127/128和128/128 是等同的么?映射的是同一个像素么?为何?

[解决办法]
再讲一下吧,我还是不得其解。
1:那个right和bottom 到底是什么?
2:到底是纹理坐标加上0.5还是减0.5,
[解决办法]
D3D SDK里面的例子代码:
C/C++ code
//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吧

热点排行