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