这是一个很古老的问题了,不过最近使用HGE做我的Graphics给引擎用时,却又发现了这个问题
下图是一张序列帧图片,游戏中需要进行切片后进行播放,当然,这在HGE中一切正常,没有任何问题
这张原图大小480×285,非2的n次幂,载入D3D后,纹理表面大小为512×512
在使用D3DXCreateTextureFromFile*系列函数载入纹理时,有这么一个参数
Filter [in] Combination of one or more flags controlling how the image is filtered. Specifying D3DX_DEFAULT for this parameter is the equivalent of specifying D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER. Each valid filter must contain one of the flags in D3DX_FILTER. 这个参数有这么几种写法
D3DX_FILTER_NONE
D3DX_FILTER_POINT
D3DX_FILTER_LINEAR
D3DX_FILTER_TRIANGLE
D3DX_FILTER_BOX
在HGE中,用的是D3DX_FILTER_NONE,而我的引擎里,习惯性使用D3DX_FILTER_POINT
HGE绘制出来的效果就是原图,而只是修改成D3DX_FILTER_POINT,图片就会被压缩
我的引擎里纹理的大小,坐标都是使用图片真实的size。但是HGE其Texture_GetWidth,Texture_GetHeight默认都是取Surface的大小,也就是512×512
并且其精灵绘制时,也是统一使用512的大小来绘制,序列帧算法也是以图片大小为准来进行切片,这种算法未免诡异
按照纹理切片,左上角第一张纹理坐标,应该是
(0,0) (1/6,0)
(0, 1/3) (1/6, 1/3)
我的引擎就是这个算法,而HGE的hgeAnimation类切片出来却不是这个纹理坐标
经过高人指点,D3DX_FILTER_NONE D3DX_FILTER_POINT 的绘制效果是有差别的
左图为使用D3DX_FILTER_POINT绘制,右图是D3DX_FILTER_NONE绘制
跟纹理坐标之类,没有太大关系,关键在于,D3DX_FILTER_POINT需要对纹理进行点采样处理。但为什么采样后就能保证完整放置在Suface上不发生拉升呢?是不是D3D一个BUG?