設(shè)置多級(jí)漸進(jìn)紋理過濾方式
當(dāng)最終顯示的紋理貼圖大小介于任意兩級(jí)紋理之間時(shí),Direct3D能夠取得兩級(jí)紋理元素進(jìn)行混合后顯示,具體的混合方式由指定的多級(jí)漸進(jìn)紋理過濾方式?jīng)Q定??梢哉{(diào)用函數(shù)IDirect3DDevice9::SetSamplerState()設(shè)置多級(jí)漸進(jìn)紋理過濾方式,將第一個(gè)參數(shù)設(shè)為紋理層序號(hào),第二個(gè)參數(shù)設(shè)為D3DSAMP_MIPFILTER表示多級(jí)漸進(jìn)紋理過濾,第三個(gè)參數(shù)設(shè)為在相鄰紋理級(jí)之間的過濾方式,可取枚舉類型D3DTEXTUREFILTERTYPE的任意值。下面的示例代碼設(shè)置相鄰紋理級(jí)之間的過濾方式為線性過濾。
g_device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
如果將第三個(gè)參數(shù)設(shè)為D3DTEXF_NONE,那么就會(huì)一直使用最高一級(jí)的紋理,即禁用多級(jí)漸進(jìn)紋理過濾。如果將其設(shè)為D3DTEXF_POINT,就會(huì)只使用與圖元大小最匹配的一級(jí)紋理。如果將其設(shè)為D3DTEXF_LINEAR,Direct3D就將與圖元大小最匹配的兩級(jí)紋理以線性方式混合。
需要注意的是,多級(jí)紋理過濾是縮小和放大過濾器的結(jié)合。例如,如果將縮小和方法過濾器設(shè)為線性過濾,但是多級(jí)紋理過濾方式設(shè)為最近點(diǎn)采樣,Direct3D就會(huì)選擇與要顯示的紋理貼圖大小最接近的紋理級(jí)別,在該級(jí)紋理上完成雙線性紋理過濾,并將結(jié)果作為像素的值。如果將縮小、放大過濾器和多級(jí)漸進(jìn)紋理都設(shè)置為線性過濾,則Direct3D就會(huì)在兩個(gè)最接近的紋理級(jí)別上都進(jìn)行雙線性紋理過濾,然后再對(duì)相鄰兩級(jí)紋理圖形上對(duì)應(yīng)的兩個(gè)紋理顏色進(jìn)行加權(quán)平均,最后的結(jié)果作為單個(gè)像素值。這種為了圖元中的一個(gè)像素,而結(jié)合了兩幅紋理,共8個(gè)像素的技術(shù),稱為“三線性過濾”,因?yàn)樗诩y理的三個(gè)方向----u、 v和紋理級(jí)別上都進(jìn)行了線性過濾。
可以通過IDirect3DDevice9::SetSamplerState()函數(shù)設(shè)置實(shí)際渲染時(shí)紋理過濾的最大級(jí)數(shù),其中需要將第二個(gè)參數(shù)設(shè)為D3DSAMP_MAXMIPLEVEL,第三個(gè)參數(shù)設(shè)為實(shí)際渲染時(shí)紋理過濾的最大級(jí)數(shù)。下面的示例代碼設(shè)置紋理層0的最大多級(jí)紋理過濾級(jí)數(shù)為16。
g_device->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, 16);
還可以通過將IDirect3DDevice9::SetSamplerState()的第二個(gè)參數(shù)設(shè)為D3DSAMP_MIPMAPLODBIAS,設(shè)置多級(jí)紋理映射級(jí)數(shù)偏移值。如果對(duì)某個(gè)紋理映射設(shè)置正偏移值,得到的圖形結(jié)果就會(huì)比原來的更清晰,但鋸齒更多;反之設(shè)為負(fù)偏移值,得到的圖形結(jié)果就會(huì)更模糊。
代碼:實(shí)例下載