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