战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  252 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

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

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

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

image

 

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

image

 

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

image 

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

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

 

posted on 2009-12-24 17:36 战魂小筑 阅读(3187) 评论(6)  编辑 收藏 引用 所属分类: C++/ 编程语言

评论

# re: D3D载入纹理需要注意的一个地方 2009-12-24 17:43 Adrian
HGE这么做肯定有他的道理,慢慢你就会知道了。  回复  更多评论
  

# re: D3D载入纹理需要注意的一个地方 2009-12-24 18:14 Adrian
因为你是用D3DX的辅助函数,这个宏是告诉D3DX用什么方式来载入图片资源进D3D的纹理,NONE是不拉伸,POINT当然是用点阵方式拉伸,其他就是其他方式拉伸了。不拉伸当然像素效果能保持原样了。  回复  更多评论
  

# re: D3D载入纹理需要注意的一个地方 2009-12-24 19:28 func
HGE的Texture的Width/Height有两个,一个是原始的W/H,一个是贴图的W/H。
原始W/H就是图片的W/H,贴图的W/H是由图片size补成2的n次幂size的W/H。
Texture_GetWidth是可以带参数的,以切换原始size和贴图size。
动画算UV坐标,是拿帧在图片上的x/y除以贴图W/H的。
HGE动画的UV坐标计算过程,不支持D3DX_FILTER_POINT这种通过压缩得到2的n次幂的方法吧?(没去看代码,猜的)

你那张写着ABC的测试贴图从哪搞到的?  回复  更多评论
  

# re: D3D载入纹理需要注意的一个地方 2009-12-24 20:22 剑孤寒
HGE用D3DX_FILTER_NONE而不用D3DX_FILTER_POINT是因为加了过滤后图片就会变模糊,另外hgeAnimation并不诡异,正如func所说HGE的Texture的Width/Height有两个,hgeAnimation的那种算法能保证纹理能够以正确的大小渲染出来  回复  更多评论
  

# re: D3D载入纹理需要注意的一个地方[未登录] 2009-12-25 00:32 Davy.xu
哈哈,这个纹理是3,4年前在一个展示vs2.0demo中弄到的,现在一直用来调试3d程序,很好用  回复  更多评论
  

# re: D3D载入纹理需要注意的一个地方 2009-12-25 15:59 凡客诚品官方网站
HGE这么做肯定有他的道理  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理