D3D载入纹理需要注意的一个地方

D3D载入纹理需要注意的一个地方

这是一个很古老的问题了,不过最近使用HGE做我的Graphics给引擎用时,却又发现了这个问题

下图是一张序列帧图片,游戏中需要进行切片后进行播放,当然,这在HGE中一切正常,没有任何问题

这张原图大小480×285,非2的n次幂,载入D3D后,纹理表面大小为512×512

D3D载入纹理需要注意的一个地方_第1张图片

 

在使用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,图片就会被压缩

D3D载入纹理需要注意的一个地方_第2张图片

 

我的引擎里纹理的大小,坐标都是使用图片真实的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  的绘制效果是有差别的

D3D载入纹理需要注意的一个地方_第3张图片 

左图为使用D3DX_FILTER_POINT绘制,右图是D3DX_FILTER_NONE绘制

跟纹理坐标之类,没有太大关系,关键在于,D3DX_FILTER_POINT需要对纹理进行点采样处理。但为什么采样后就能保证完整放置在Suface上不发生拉升呢?是不是D3D一个BUG?

 

你可能感兴趣的:(D3D载入纹理需要注意的一个地方)