狀態(tài)
Microsoft® Direct3D®設(shè)備是一個(gè)狀態(tài)機(jī)。應(yīng)用程序設(shè)置光照、渲染和變換模塊的狀態(tài),然后在渲染時(shí)傳遞數(shù)據(jù)給它們。
本節(jié)描述圖形流水線用到的所有不同類型的狀態(tài)。
設(shè)備渲染狀態(tài)控制Microsoft® Direct3D®設(shè)備光柵化模塊的行為,它們通過(guò)改變渲染狀態(tài)的屬性,使用何種類型的著色算法,霧屬性和其它光柵化器操作來(lái)達(dá)到這個(gè)目的。
C++應(yīng)用程序通過(guò)調(diào)用IDirect3DDevice9::SetRenderState方法控制渲染狀態(tài)的屬性。D3DRENDERSTATETYPE枚舉類型指定所有可能的渲染狀態(tài),應(yīng)用程序把一個(gè)枚舉類型值作為第一個(gè)參數(shù)傳遞給IDirect3DDevice9::SetRenderState方法。
固定功能頂點(diǎn)處理由IDirect3DDevice9::SetRenderState方法和以下設(shè)備渲染狀態(tài)控制。這些控制中的大多數(shù)在使用可編程頂點(diǎn)著色器時(shí)沒(méi)有任何作用。
- D3DRS_SPECULARENABLE
- D3DRS_FOGSTART
- D3DRS_FOGEND
- D3DRS_FOGDENSITY
- D3DRS_RANGEFOGENABLE
- D3DRS_LIGHTING
- D3DRS_AMBIENT
- D3DRS_FOGVERTEXMODE
- D3DRS_COLORVERTEX
- D3DRS_LOCALVIEWER
- D3DRS_NORMALIZENORMALS
- D3DRS_DIFFUSEMATERIALSOURCE
- D3DRS_SPECULARMATERIALSOURCE
- D3DRS_AMBIENTMATERIALSOURCE
- D3DRS_EMISSIVEMATERIALSOURCE
- D3DRS_VERTEXBLEND
另外,固定功能頂點(diǎn)處理流水線使用以下方法設(shè)置變換、材質(zhì)和光照。
- IDirect3DDevice9::SetTransform
- IDirect3DDevice9::SetMaterial
- IDirect3DDevice9::SetLight
- IDirect3DDevice9::LightEnable
注意 D3DRS_SPECULARENABLE控制像素流水線中鏡面反射色的加法。D3DRS_FOGSTART,D3DRS_FOGEND和D3DRS_FOGDENSITY控制如何計(jì)算霧的起點(diǎn)、終點(diǎn)和像素霧的密度。
更多的信息包含在以下主題中。
概述
阿爾法混合狀態(tài)
阿爾法測(cè)試狀態(tài)
環(huán)境光狀態(tài)
抗鋸齒狀態(tài)
剔除狀態(tài)
深度緩存狀態(tài)
霧狀態(tài)
光照狀態(tài)
輪廓和填充狀態(tài)
每頂點(diǎn)顏色狀態(tài)
圖元裁剪狀態(tài)
著色狀態(tài)
模板緩存狀態(tài)
紋理環(huán)繞狀態(tài)
阿爾法混合狀態(tài)
一個(gè)顏色的阿爾法值控制它的透明度。啟用阿爾法混合允許把一個(gè)表面上的顏色、材質(zhì)和紋理根據(jù)透明度混合到另一個(gè)表面上。
更多信息請(qǐng)參閱阿爾法紋理混合和紋理混合。
C++應(yīng)用程序使用D3DRS_ALPHABLENDENABLE渲染狀態(tài)啟用阿爾法透明混合。Microsoft® Direct3D® API允許多種類型的阿爾法混合。但是,重要的是要注意用戶的三維硬件可能不完全支持所有Direct3D提供的混合狀態(tài)。
已完成的阿爾法混合的類型取決于D3DRS_SRCBLEND和D3DRS_DESTBLEND渲染狀態(tài)。源和目的混合狀態(tài)須成對(duì)使用。以下示例代碼顯示了如何將源混合狀態(tài)設(shè)置為D3DBLEND_SRCCOLOR并將目的混合狀態(tài)設(shè)置為D3DBLEND_INVSRCCOLOR。
// 本例假設(shè)d3dDevice為指向IDirect3DDevice9接口的有效指針。
// 設(shè)置源混合狀態(tài)。
d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
// 設(shè)置目的混合狀態(tài)。
// 設(shè)置目的混合狀態(tài)。
d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
改變?cè)春湍康幕旌蠣顟B(tài)可以使物體在霧很濃或灰塵很多的環(huán)境中看起來(lái)像發(fā)光物體。例如,若應(yīng)用程序在霧很濃的環(huán)境中建模了火焰,能量場(chǎng),離子束或類似的發(fā)光體,則可把源和目的混合狀態(tài)都設(shè)置為D3DBLEND_ONE。
阿爾法混合的另一種應(yīng)用是控制三維場(chǎng)景中的光照,也稱為光照貼圖。將源混合狀態(tài)設(shè)置為D3DBLEND_ZERO并將目的混合狀態(tài)設(shè)置為D3DBLEND_SRCALPHA,會(huì)根據(jù)源的阿爾法信息使場(chǎng)景變暗。源圖元被用作光照貼圖,對(duì)幀緩存中的內(nèi)容進(jìn)行縮放,并在適當(dāng)?shù)臅r(shí)候使之變暗,這就是單色光照貼圖。
應(yīng)用程序可以生成彩色光照貼圖,只要把源阿爾法混合狀態(tài)設(shè)置為D3DBLEND_ZERO,并把目的混合狀態(tài)設(shè)置為D3DBLEND_SRCCOLOR。
阿爾法測(cè)試狀態(tài)
C++應(yīng)用程序可以用阿爾法測(cè)試控制何時(shí)把像素被寫(xiě)入渲染目標(biāo)表面。通過(guò)設(shè)置D3DRS_ALPHATESTENABLE渲染狀態(tài),應(yīng)用程序讓當(dāng)前的Direct3D設(shè)備根據(jù)阿爾法測(cè)試函數(shù)測(cè)試每個(gè)像素。如果測(cè)試成功,那么就把像素寫(xiě)入表面。如果不成功,那么Direct3D就忽略該像素。應(yīng)用程序通過(guò)D3DRS_ALPHAFUNC渲染狀態(tài)選擇阿爾法測(cè)試函數(shù)。應(yīng)用程序可以通過(guò)D3DRS_ALPHAREF渲染狀態(tài)設(shè)置一個(gè)參考阿爾法值用來(lái)和所有像素進(jìn)行比較。
阿爾法測(cè)試常用于在光柵化幾乎透明的物體時(shí)提高性能。如果正被光柵化的顏色數(shù)據(jù)比給定像素更不透明(D3DPCMPCAP_GREATEREQUAL),那么該像素就被寫(xiě)入。否則,光柵化器就完全忽略該像素,這樣就節(jié)省了將兩個(gè)顏色混合所需要的處理。以下示例代碼檢查當(dāng)前設(shè)備是否支持一個(gè)給定的比較函數(shù),若支持,則設(shè)置比較函數(shù)的參數(shù),用來(lái)在渲染時(shí)提高性能。
// 本示例代碼假設(shè)pCaps為一D3DCAPS9結(jié)構(gòu),
// 被先前的一個(gè)IDirect3D9::GetDeviceCaps調(diào)用填充。
if (pCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL)
{
dev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
dev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
dev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
}
// 如果不支持比較,那么就照常渲染。唯一的缺點(diǎn)是沒(méi)有性能上的提升。
并不是所有的硬件都支持全部阿爾法測(cè)試特性。可以通過(guò)調(diào)用IDirect3D9::GetDeviceCaps方法檢查設(shè)備能力,取回設(shè)備能力后,根據(jù)希望使用的比較函數(shù)檢查相關(guān)D3DCAPS9結(jié)構(gòu)的AlphaCmpCaps成員。如果AlphaCmpCaps成員只包含D3DPCMPCAPS_ALWAYS能力或D3DPCMPCAPS_NEVER能力,那么驅(qū)動(dòng)程序不支持阿爾法測(cè)試。
環(huán)境光狀態(tài)
環(huán)境光是周圍的光,從各個(gè)方向照射而來(lái)。
有關(guān)Microsoft® Direct3D®如何使用環(huán)境光的信息,請(qǐng)參閱直射光與環(huán)境光,和與光照相關(guān)的數(shù)學(xué)。
C++應(yīng)用程序調(diào)用IDirect3DDevice9::SetRenderState方法設(shè)置環(huán)境光的顏色,并將D3DRS_AMBIENT枚舉類型值作為第一個(gè)參數(shù)傳入。第二個(gè)參數(shù)是顏色值,默認(rèn)值為零。
// 本例假設(shè)d3dDevice為指向IDirect3DDevice9接口的有效指針。
// 設(shè)置環(huán)境光
d3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
抗鋸齒狀態(tài)
抗鋸齒是使屏幕上的線和邊緣看起來(lái)更為平滑的一種方法。Microsoft® Direct3D®支持兩種抗鋸齒方法:邊緣抗鋸齒和全屏抗鋸齒。
有關(guān)這些技術(shù)的更多細(xì)節(jié),請(qǐng)參閱抗鋸齒。
默認(rèn)情況下,Direct3D不執(zhí)行抗鋸齒。邊緣抗鋸齒需要渲染第二遍,要啟用邊緣抗鋸齒,應(yīng)該把D3DRS_EDGEANTIALIAS渲染狀態(tài)設(shè)置為TRUE,要禁用邊緣抗鋸齒,應(yīng)該把D3DRS_EDGEANTIALIAS設(shè)置為FALSE。
要啟用全屏抗鋸齒,應(yīng)該把D3DRS_MULTISAMPLEANTIALIAS渲染狀態(tài)設(shè)置為TRUE。要禁用全屏抗鋸齒,應(yīng)該把D3DRS_MULTISAMPLEANTIALIAS設(shè)置為FALSE。
剔除狀態(tài)
Direct3D渲染圖元時(shí)會(huì)剔除背向用戶的圖元。
C++應(yīng)用程序使用D3DRS_CULLMODE渲染狀態(tài)設(shè)置剔除模式,它可以被設(shè)置為D3DCULL枚舉類型的成員。默認(rèn)情況下,Direct3D把頂點(diǎn)逆時(shí)針排列的面作為背向面剔除。
以下示例代碼描述了設(shè)置剔除模式的過(guò)程,這里把頂點(diǎn)順時(shí)針排列的面作為背向面剔除。
// 本例假設(shè)d3dDevice為指向IDirect3DDevice9接口的有效指針。
// 設(shè)置剔除狀態(tài)。
d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
深度緩存狀態(tài)
深度緩存是消除隱藏線和隱藏面的一種方法。默認(rèn)的情況下,Direct3D不使用深度緩存。
有關(guān)深度緩存的概念,請(qǐng)參閱深度緩存。
C++應(yīng)用程序用D3DRS_ZENABLE渲染狀態(tài)更新深度緩存的狀態(tài),用D3DZBUFFERTYPE枚舉類型成員指定新的狀態(tài)值。
若應(yīng)用程序要阻止Direct3D寫(xiě)入深度緩存,則可在調(diào)用IDirect3DDevice9::SetRenderState時(shí)用D3DRS_ZWRITEENABLE枚舉類型作為第一個(gè)參數(shù),并將第二個(gè)參數(shù)指定為D3DZB_FALSE。
以下示例代碼顯示了如何將深度緩存狀態(tài)設(shè)置為啟用z緩存。
// 本例假設(shè)d3dDevice為指向IDirect3DDevice9接口的有效指針。
// 啟用z緩存
d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
應(yīng)用程序也可以使用D3DRS_ZFUNC渲染狀態(tài)控制Direct3D用于深度緩存的比較函數(shù)。
Z偏移是把一個(gè)表面顯示在另一個(gè)表面之前的一種方法,即使它們的深度值相同。可以將此技術(shù)用于多種效果。一個(gè)常用的例子是在墻上渲染影子,影子和墻具有相同的深度值,但是應(yīng)用程序希望把影子顯示在墻上,只要給影子賦一個(gè)z偏移值就可以讓Direct3D正確地顯示它們(請(qǐng)參閱D3DRS_ZBIAS)。
霧狀態(tài)
霧效果可以賦予三維場(chǎng)景更強(qiáng)的真實(shí)感。霧效果不僅可以用于模擬霧,也能減少遠(yuǎn)處場(chǎng)景的清晰度。這反映了真實(shí)世界中的情況,物體離用戶越遠(yuǎn),它們的細(xì)節(jié)就越模糊。
有關(guān)如何在應(yīng)用程序中使用霧的更多信息,請(qǐng)參閱霧。
C++應(yīng)用程序通過(guò)設(shè)備渲染狀態(tài)控制霧。D3DRENDERSTATETYPE枚舉類型包括許多狀態(tài),控制應(yīng)用程序使用的是像素(查找表)霧還是頂點(diǎn)霧,霧是何顏色,系統(tǒng)使用的霧的公式,及公式的參數(shù)。
可以通過(guò)將D3DRS_FOGENABLE渲染狀態(tài)設(shè)置為TRUE啟用霧。霧的顏色可以使用D3DRS_FOGCOLOR渲染狀態(tài)設(shè)置為指定顏色,霧的顏色的阿爾法分量被忽略。
D3DRS_FOGTABLEMODE和D3DRS_FOGVERTEXMODE渲染狀態(tài)控制霧計(jì)算使用的公式,它們也間接控制使用何種類型的霧。這兩個(gè)渲染狀態(tài)都可以被設(shè)置為D3FOGMODE枚舉類型的成員。將任何一個(gè)渲染狀態(tài)設(shè)置為D3DFOG_NONE相應(yīng)地禁用像素霧或頂點(diǎn)霧。如果兩個(gè)渲染狀態(tài)都被設(shè)置為有效的模式,則系統(tǒng)只啟用像素霧。
D3DRS_FOGSTART和D3DRS_FOGEND渲染狀態(tài)控制D3DFOG_LINEAR模式下霧公式的參數(shù)。D3DRS_FOGDENSITY渲染狀態(tài)控制指數(shù)霧模式下霧的密度。
更多信息請(qǐng)參閱霧的參數(shù)。
光照狀態(tài)
使用Microsoft® Direct3D®幾何流水線的應(yīng)用程序可以啟用或禁用光照計(jì)算。只有包含頂點(diǎn)法向的頂點(diǎn)才能正確地計(jì)算光照,不含法向的頂點(diǎn)在所有光照計(jì)算中將使用零點(diǎn)積,因此沒(méi)有法向的頂點(diǎn)得不到光照。
更多信息請(qǐng)參閱光照的數(shù)學(xué)。
應(yīng)用程序通過(guò)將D3DRS_LIGHTING渲染狀態(tài)設(shè)置為TRUE啟用Direct3D光照,這是默認(rèn)的設(shè)置,應(yīng)用程序通過(guò)將該渲染狀態(tài)設(shè)置為FALSE禁用Direct3D光照。
光照渲染狀態(tài)與可以對(duì)頂點(diǎn)緩存中的頂點(diǎn)執(zhí)行的光照計(jì)算完全無(wú)關(guān)。在進(jìn)行頂點(diǎn)處理時(shí)IDirect3DDevice9::ProcessVertices方法接收自己的標(biāo)志用于控制光照計(jì)算。
輪廓和填充狀態(tài)
沒(méi)有紋理的圖元會(huì)使用它們的材質(zhì)指定的顏色進(jìn)行渲染,或者如果為頂點(diǎn)指定了顏色,就使用頂點(diǎn)色。可以將D3DRS_FILLMODE渲染狀態(tài)指定為D3DFILLMODE枚舉類型的值以選擇填充圖元的方法。
要啟用抖動(dòng),應(yīng)用程序必須把D3DRS_DITHERENABLE枚舉類型值作為第一個(gè)參數(shù)傳給IDirect3DDevice9::SetRenderState,并把第二個(gè)參數(shù)設(shè)置為TRUE,把第二個(gè)參數(shù)設(shè)置為FALSE則禁用抖動(dòng)。
有時(shí),畫(huà)一條線中的最后一個(gè)像素可能導(dǎo)致與周圍圖元的重疊。可以使用D3DRS_LASTPIXEL枚舉值控制這種情況。但是,未經(jīng)深思熟慮最好不要改變這個(gè)設(shè)置。在有些情況下,禁止渲染最后一個(gè)像素可能會(huì)導(dǎo)致圖元之間的縫隙。
通過(guò)設(shè)置適當(dāng)?shù)漠?huà)線模式可以畫(huà)物體的輪廓。默認(rèn)的畫(huà)線狀態(tài)是畫(huà)實(shí)線。更多信息請(qǐng)參閱Direct3D擴(kuò)展(D3DX)線段繪制渲染狀態(tài)。
每頂點(diǎn)顏色狀態(tài)
當(dāng)使用彈性頂點(diǎn)格式(FVF)編碼時(shí),頂點(diǎn)可以同時(shí)包含頂點(diǎn)顏色和頂點(diǎn)法向的信息。默認(rèn)情況下, Microsoft® Direct3D®在計(jì)算光照時(shí)使用這些信息。要設(shè)置是否把頂點(diǎn)顏色用于光照計(jì)算,應(yīng)該調(diào)用IDirect3DDevice9::SetRenderState方法,把D3DRS_COLORVERTEX作為第一個(gè)參數(shù),把第二個(gè)參數(shù)設(shè)置為FALSE禁用頂點(diǎn)顏色光照,或TRUE啟用之。
若每頂點(diǎn)顏色被啟用,則應(yīng)用程序可以配置系統(tǒng)從何處取得源頂點(diǎn)顏色信息。D3DRS_AMBIENTMATERIALSOURCE,D3DRS_DIFFUSEMATERIALSOURCE,D3DRS_EMISSIVEMATERIALSOURCE和D3DRS_SPECULARMATERIALSOURCE渲染狀態(tài)控制相應(yīng)環(huán)境反射色、漫反射色、放射色和鏡面反射顏色成員的來(lái)源。每個(gè)狀態(tài)可以被設(shè)置為D3DMATERIALCOLORSOURCE枚舉類型的成員,該枚舉類型定義了一些常數(shù),通知系統(tǒng)是使用當(dāng)前材質(zhì)的顏色、頂點(diǎn)的漫反射顏色還是頂點(diǎn)的鏡面反射顏色作為指定顏色成員的來(lái)源。
圖元裁剪狀態(tài)
如果圖元的一部分位于視區(qū)外,那么Microsoft® Direct3D®可以對(duì)此類圖元進(jìn)行裁剪。在C++應(yīng)用程序中,Direct3D裁剪由D3DRS_CLIPPING渲染狀態(tài)控制。可以將該渲染狀態(tài)設(shè)置為TRUE(默認(rèn)值)啟用圖元裁剪,或?qū)⒅O(shè)置為FALSE禁用Direct3D裁剪服務(wù)。
著色狀態(tài)
Direct3D同時(shí)支持平面和高洛德著色,默認(rèn)情況下使用高洛德著色。要控制當(dāng)前的著色模式,C++應(yīng)用程序可以給D3DRS_SHADEMODE渲染狀態(tài)指定一個(gè)D3DSHADEMODE枚舉類型值。
以下C++示例代碼顯示了把著色狀態(tài)設(shè)置為平面著色模式的過(guò)程。
// 本例假設(shè)d3dDevice為指向IDirect3DDevice9接口的有效指針。
// 設(shè)置著色模式。
d3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
模板緩存狀態(tài)
應(yīng)用程序使用模板緩存決定是否把一個(gè)像素寫(xiě)入到渲染目標(biāo)表面。
細(xì)節(jié)請(qǐng)參閱模板緩存技術(shù)。
C++應(yīng)用程序通過(guò)調(diào)用IDirect3DDevice9::SetRenderState方法啟用或禁用模板緩存,應(yīng)該將D3DRS_STENCILENABLE作為第一個(gè)參數(shù)的值,并相應(yīng)地把第二個(gè)參數(shù)設(shè)置為TRUE或FALSE啟用或禁用模板緩存。
通過(guò)調(diào)用IDirect3DDevice9::SetRenderState,可以設(shè)置Microsoft® Direct3D®執(zhí)行模板測(cè)試時(shí)使用的比較函數(shù),只需將第一個(gè)參數(shù)的值設(shè)置為D3DRS_STENCILFUNC,并把D3DCMPFUNC枚舉類型值作為第二個(gè)參數(shù)的值傳入。
模板參考值是在模板緩存中的值,模板函數(shù)用它進(jìn)行測(cè)試。默認(rèn)情況下,模板參考值為零。應(yīng)用程序可以調(diào)用IDirect3DDevice9::SetRenderState設(shè)置它的值,只需將D3DRS_STENCILREF作為第一個(gè)參數(shù)傳入,并把第二個(gè)參數(shù)的值設(shè)置為新的參考值。
Direct3D在對(duì)每個(gè)像素執(zhí)行模板測(cè)試前,會(huì)對(duì)模板參考值和模板掩碼值進(jìn)行按位與操作,并把得到的結(jié)果用模板比較函數(shù)與模板緩存的內(nèi)容進(jìn)行比較。應(yīng)用程序可以調(diào)用IDirect3DDevice9::SetRenderState設(shè)置模板掩碼值,只需將D3DRS_STENCILMASK作為第一個(gè)參數(shù)傳入,并把第二個(gè)參數(shù)設(shè)置為新的模板掩碼值。
要設(shè)置模板測(cè)試失敗時(shí)Direct3D采取的行動(dòng),可以調(diào)用IDirect3DDevice9::SetRenderState并將D3DRS_STENCILFAIL作為第一個(gè)參數(shù)傳入,第二個(gè)參數(shù)必須被設(shè)為D3DSTENCILCAPS枚舉類型的成員。
應(yīng)用程序也可以控制當(dāng)模板測(cè)試通過(guò)但是z緩存測(cè)試失敗時(shí)Direct3D如何響應(yīng),只需調(diào)用IDirect3DDevice9::SetRenderState,將D3DRS_STENCILZFAIL作為第一個(gè)參數(shù)傳遞,并把第二個(gè)參數(shù)設(shè)為D3DSTENCILCAPS枚舉類型的成員。
另外,應(yīng)用程序還可以控制當(dāng)模板測(cè)試和z緩存測(cè)試都通過(guò)時(shí)Direct3D做什么,只需調(diào)用IDirect3DDevice9::SetRenderState并將D3DRS_STENCILPASS作為第一個(gè)參數(shù),并把第二個(gè)參數(shù)設(shè)為D3DSTENCILCAPS枚舉類型的成員。
寫(xiě)掩碼可以用于修改將要寫(xiě)入模板緩存的值。要設(shè)置模板緩存寫(xiě)掩碼,只需調(diào)用IDirect3DDevice9::SetRenderState,并將D3DRS_STENCILWRITEMASK作為第一個(gè)參數(shù)傳遞,并把第二個(gè)參數(shù)設(shè)為寫(xiě)掩碼的值。
紋理環(huán)繞狀態(tài)
D3DRS_WRAP0到D3DRS_WRAP7渲染狀態(tài)啟用或禁用設(shè)備的多重紋理級(jí)聯(lián)中各種紋理的u和v環(huán)繞。可以把這些渲染狀態(tài)設(shè)置為標(biāo)志D3DWRAPCOORD_0,D3DWRAPCOORD_1,D3DWRAPCOORD_2和D3DWARPCOORD_3的組合,相應(yīng)地啟用紋理在第一、第二、第三和第四個(gè)方向上的環(huán)繞,若使用零值,則禁用所有環(huán)繞。默認(rèn)情況下,所有紋理的所有方向上的紋理環(huán)繞都被禁用。
有關(guān)的概念綜述請(qǐng)參閱紋理環(huán)繞。
取樣狀態(tài)控制諸如過(guò)濾、tiling及尋址等與取樣有關(guān)的操作。
取樣狀態(tài)
SetSamplerState設(shè)置取樣器狀態(tài)(包括tessellator中對(duì)位移貼圖進(jìn)行取樣的狀態(tài)),為了能夠在編譯時(shí)檢測(cè)出正在移植Microsoft® DirectX® 8.x的應(yīng)用程序,這些狀態(tài)已經(jīng)被重新命名并以D3DSAMP_前綴開(kāi)頭。這些狀態(tài)包括:
- D3DSAMP_ADDRESSU, D3DSAMP_ADDRESSV, D3DSAMP_ADDRESSW
- D3DSAMP_BORDERCOLOR
- D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER, D3DSAMP_MIPFILTER
- D3DSAMP_MIPMAPLODBIAS
- D3DSAMP_MAXMIPLEVEL
- D3DSAMP_MAXANISOTROPY
在DirectX 9.0中,使用像素著色器2.0版時(shí),雖然紋理坐標(biāo)的數(shù)量仍被限制為8個(gè),但每一趟最多可以支持16個(gè)紋理表面。有些紋理層狀態(tài)與表面相關(guān),有些與坐標(biāo)集相關(guān),有些與頂點(diǎn)處理相關(guān),而有些則與像素處理相關(guān)。IDirect3DDevice9::SetSamplerState方法可以指定紋理過(guò)濾、平鋪、截取、MIPLOD等狀態(tài),最多可以有16個(gè)取樣器。
C++應(yīng)用程序通過(guò)調(diào)用IDirect3DDevice9::SetSamplerState方法控制與紋理有關(guān)的取樣狀態(tài)。D3DSAMPLERSTATETYPE枚舉類型用于指定取樣狀態(tài)。
相關(guān)主題
紋理層狀態(tài)控制紋理坐標(biāo)的生成及紋理坐標(biāo)的狀態(tài),如環(huán)繞模式。
C++應(yīng)用程序通過(guò)調(diào)用IDirect3DDevice9::SetTextureStageState方法控制與紋理有關(guān)的狀態(tài)。D3DTEXTURESTAGESTATETYPE枚舉類型定義了所有與紋理有關(guān)的渲染狀態(tài),應(yīng)用程序應(yīng)該將D3DTEXTURESTAGESTATETYPE枚舉類型值作為第一個(gè)參數(shù)傳遞給IDirect3DDevice9::SetTextureStageState方法。
應(yīng)用程序可以通過(guò)調(diào)用IDirect3DDevice9::SetTexture方法設(shè)置某一層的紋理。
SetTextureStageState
SetTextureStageState現(xiàn)在可以設(shè)置以下?tīng)顟B(tài)。
- 固定功能頂點(diǎn)處理狀態(tài)。這些狀態(tài)控制對(duì)紋理坐標(biāo)的操控:D3DTSS_TEXTURETRANSFORMFLAGS和 D3DTSS_TEXCOORDINDEX。最多可以設(shè)置八個(gè)(因?yàn)镈irect3D總是支持八組紋理坐標(biāo))
- 固定功能像素著色器狀態(tài)(以前的TextureStageState)。D3DTSS_COLOROP, D3DTSS_ALPHAOP, D3DTSS_COLORARG0, D3DTSS_COLORARG1, D3DTSS_COLORARG2, D3DTSS_ALPHAARG0, D3DTSS_ALPHAARG1, D3DTSS_ALPHAARG2, D3DTSS_BUMPENVMAT00, D3DTSS_BUMPENVMAT01, D3DTSS_BUMPENVMAT10, D3DTSS_BUMPENVMAT11, D3DTSS_BUMPENVLSCALE, D3DTSS_BUMPENVLOFFSET, and D3DTSS_RESULTARG。這些狀態(tài)最多可有MaxTextureBlendStages組可供設(shè)置。
D3DTSS_TEXCOORDINDEX是一個(gè)固定功能頂點(diǎn)處理狀態(tài)。如果使用可編程頂點(diǎn)著色器,那么這個(gè)狀態(tài)被忽略。
應(yīng)用程序可以使用的紋理取樣器的數(shù)量由像素著色器的版本決定。
- 固定功能像素著色器:MaxTextureBlendStages/MaxSimultaneousTextures個(gè)紋理取樣器
- ps.1.1到ps.1.3: 4個(gè)紋理取樣器。
- ps.1.4:6個(gè)紋理取樣器。
- ps.2.0:16個(gè)紋理取樣器。
- 支持Microsoft DirectX® 9.0位移貼圖的設(shè)備將支持一個(gè)額外的取樣器(D3DDMAPSAMPLER),它在tesselator對(duì)位移貼圖進(jìn)行取樣。
有關(guān)更多紋理混合的信息,請(qǐng)參閱紋理混合。
狀態(tài)塊
一個(gè)狀態(tài)塊是一組設(shè)備狀態(tài)、渲染狀態(tài)、光照和材質(zhì)的參數(shù)、變換狀態(tài)、紋理層狀態(tài)和當(dāng)前紋理信息。狀態(tài)塊是設(shè)備當(dāng)前狀態(tài)的一個(gè)記錄,或者是被顯式地記錄下來(lái)的。可以通過(guò)單獨(dú)的一次調(diào)用把記錄應(yīng)用于設(shè)備。渲染設(shè)備可以優(yōu)化設(shè)備狀態(tài)塊以加速應(yīng)用程序所要求的一般順序的狀態(tài)改變。另外,設(shè)備狀態(tài)塊也可以使改變?cè)O(shè)備狀態(tài)更為方便。
C++應(yīng)用程序可以在調(diào)用IDirect3DDevice9::EndStateBlock方法結(jié)束記錄一個(gè)狀態(tài)塊,以及調(diào)用IDirect3DDevice9::CreateStateBlock方法保存一組預(yù)定義的設(shè)備狀態(tài)數(shù)據(jù)時(shí),得到一個(gè)狀態(tài)塊句柄。
更多信息包含在以下主題中。
概述
創(chuàng)建預(yù)定義的狀態(tài)塊
記錄狀態(tài)塊
創(chuàng)建預(yù)定義的狀態(tài)塊
IDirect3DDevice9::CreateStateBlock方法創(chuàng)建一個(gè)新的狀態(tài)塊,它包含全部的設(shè)備狀態(tài)或是僅與頂點(diǎn)或像素處理相關(guān)的設(shè)備狀態(tài)。IDirect3DDevice9::CreateStateBlock方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)代表要在新的狀態(tài)塊中記錄的狀態(tài)信息的類型,第二個(gè)參數(shù)是返回句柄的地址,用于接收當(dāng)調(diào)用成功時(shí)返回的有效狀態(tài)塊的句柄。
第一個(gè)參數(shù)為D3DSTATEBLOCKTYPE枚舉類型,可以從以下三種選擇:
- 保存頂點(diǎn)和像素狀態(tài)。
- 只保存頂點(diǎn)狀態(tài)。
- 只保存像素狀態(tài)。
要了解可以保存的狀態(tài)的全部列表,請(qǐng)參閱D3DSTATEBLOCKTYPE。
一定要檢查IDirect3DDevice9::CreateStateBlock方法的錯(cuò)誤代碼,如果該方法失敗,很可能是顯示模式改變了。為了從此類失敗中恢復(fù),應(yīng)用程序應(yīng)該重新創(chuàng)建表面,然后重新創(chuàng)建狀態(tài)塊。
記錄狀態(tài)塊
IDirect3DDevice9接口提供IDirect3DDevice9::BeginStateBlock方法,在應(yīng)用程序設(shè)置設(shè)備狀態(tài)時(shí),該方法會(huì)把它們記錄到一個(gè)狀態(tài)塊中。該方法使系統(tǒng)開(kāi)始把設(shè)備狀態(tài)的改變記錄到一個(gè)狀態(tài)塊中,而不是將它們(新的設(shè)備狀態(tài))應(yīng)用于設(shè)備。可被記錄的狀態(tài)列表請(qǐng)參閱IDirect3DDevice9::BeginStateBlock。
當(dāng)應(yīng)用程序完成對(duì)狀態(tài)塊的記錄后,應(yīng)該調(diào)用IDirect3DDevice9::EndStateBlock方法通知系統(tǒng)以結(jié)束記錄。該方法返回一個(gè)狀態(tài)塊的句柄,應(yīng)用程序應(yīng)該將接收狀態(tài)塊句柄的變量的地址作為pToken參數(shù)傳入。應(yīng)用程序可以根據(jù)需要用這個(gè)句柄應(yīng)用該狀態(tài)塊,記錄新的狀態(tài)數(shù)據(jù)到狀態(tài)塊中,以及在不再需要該狀態(tài)塊時(shí)將之刪除。
一定要檢查IDirect3DDevice9::EndStateBlock方法的錯(cuò)誤代碼,如果該方法失敗,很可能是因?yàn)轱@示模式改變了。應(yīng)該合理地設(shè)計(jì)應(yīng)用程序,使之能夠從此類失敗中恢復(fù),只要重新創(chuàng)建表面并再次記錄狀態(tài)塊就可以達(dá)到這個(gè)目的。