這是一個很古老的問題了,不過最近使用HGE做我的Graphics給引擎用時,卻又發(fā)現(xiàn)了這個問題
下圖是一張序列幀圖片,游戲中需要進行切片后進行播放,當然,這在HGE中一切正常,沒有任何問題
這張原圖大小480×285,非2的n次冪,載入D3D后,紋理表面大小為512×512
在使用D3DXCreateTextureFromFile*系列函數(shù)載入紋理時,有這么一個參數(shù)
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. 這個參數(shù)有這么幾種寫法
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
并且其精靈繪制時,也是統(tǒng)一使用512的大小來繪制,序列幀算法也是以圖片大小為準來進行切片,這種算法未免詭異
按照紋理切片,左上角第一張紋理坐標,應該是
(0,0) (1/6,0)
(0, 1/3) (1/6, 1/3)
我的引擎就是這個算法,而HGE的hgeAnimation類切片出來卻不是這個紋理坐標
經(jīng)過高人指點,D3DX_FILTER_NONE D3DX_FILTER_POINT 的繪制效果是有差別的
左圖為使用D3DX_FILTER_POINT繪制,右圖是D3DX_FILTER_NONE繪制
跟紋理坐標之類,沒有太大關系,關鍵在于,D3DX_FILTER_POINT需要對紋理進行點采樣處理。但為什么采樣后就能保證完整放置在Suface上不發(fā)生拉升呢?是不是D3D一個BUG?