狀態
Direct3D設備使用狀態來配置所有的管道處理。采樣器狀態通過例如定義紋理尋址方式(texture addressing)和過濾模式控制紋理采樣器設置。紋理狀態設置用于控制紋理如何被組合以及相互之間如何混合的多重紋理混合器。渲染狀態控制大多數管道狀態。
狀態塊是存儲和恢復狀態的便利機制。
狀態塊保存和恢復狀態
狀態塊是一組設備狀態。設備狀態由渲染狀態,定點狀態,像素狀態,或上述的所有狀態組成。狀態塊包含設備當前狀態的快照,或你可以創建狀態塊來記錄每一個應用程序造成的狀態改變。
創建狀態塊
選擇你想獲取的狀態類型,比功能照下面的方法創建狀態塊:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->CreateStateBlock(D3DSBT_ALL, &pStateBlock);
CreateStateBlock創建狀態塊,并且獲取設備狀態。設備狀態由第一個參數中狀態塊類型指定。該狀態可以為下面任一值:
l 所有的設備狀態
l 所有的像素狀態
l 所有的定點狀態
獲取狀態信息
創建狀態塊自動獲取當前設備狀態。效果系統使用狀態塊保存狀態。在調用Begin后,狀態塊被創建并且獲取狀態。當調用End,狀態塊中狀態被重新應用于設備。
要保存自定義的狀態序列,將你需要保存的狀態更改序列包含在BeginStateBlock,EndStateBlock之間。BeginStateBlock通知當前的設備設置狀態塊并且將EndStateBlock調用之前發生的狀態改變添加到其中。下面是例子:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->BeginStateBlock();
//這里發生任意數量的狀態改變
//SetRenderState, SetSamplerState, SetTextureStageState…
pd3dDevice->EndStateBlock(&pStateBlock);
這將在自定義狀態塊中保存代碼序列中任意數量的狀態改變。之后,當你想要使用狀態塊重置設備狀態時,調用IDirect3DStateBlock::Apply。這僅僅會覆蓋狀態塊中義獲取的設備狀態。其他在自定義狀態塊中沒有獲取的設備狀態不會改變。(記得在不需要使用狀態塊對象時調用Release)。
用狀態塊保存所有的設備狀態
狀態塊可以用于獲取所有的設備狀態。下面是設備狀態中包含的狀態元素:
l 頂點狀態;
l 像素狀態;
l 每個紋理指定的采樣器;
l 每個頂點紋理;
l 每個位移映射紋理(Each displacement map texture);
l 當前紋理的調色板;
l 對于每個頂點流:指向頂點緩存的指針,SetStreamSource中指定的每個參數和SetStreamSourceFreq指定的分配器(divider)(如果有);
l 指向索引緩存的指針;
l 視口;
l 裁剪矩形;
l 世界變換矩陣,視變換矩陣和投影矩陣;
l 紋理變換;
l 裁剪面(如果有);
l 當前材質;
要用狀態塊獲取所有的狀態對象,需在調用CreateStateBlock時使用D3DSBT_ALL作為第一個參數。
使用狀態塊保存頂點狀態
狀態塊可以用于僅獲取頂點狀態。下面的狀態為頂點狀態:
l 頂點渲染狀態;
l 頂點采樣器器狀態;
l 頂點紋理狀態;
l SetNPatchMode中N面片(NPatch)模式片段;
l SetLight中每一個光源,包括LightEnable指定的光源是否開啟的狀態;
l 當前頂點著色器和每一個頂點著色器常量;
l 對于每個頂點流:保存SetStreamSourceFreq中指定的分配器(divider)值;
l 當前頂點聲明(FVF)
使用狀態塊獲取頂點狀態,需在調用CreateStateBlock時為第一個參數指定D3DSBT_VERTEXSTATE。
頂點管道:渲染狀態
設備渲染狀態幾乎影響管道的每一個部分的行為。渲染狀態通過調用SetRenderState來設置。下面的表格包含設置頂點狀態的所有渲染狀態:
Render States |
Default Value |
D3DRS_CULLMODE(剔除模式) |
D3DCULL_CCW(剔除逆時針順序的點平面) |
D3DRS_FOGCOLOR(霧顏色) |
0 |
D3DRS_FOGTABLEMODE |
D3DFOG_NONE |
D3DRS_FOGSTART |
0 |
D3DRS_FOGEND |
1 |
D3DRS_FOGDENSITY(霧密度) |
1 |
D3DRS_RANGEFOGENABLE |
FALSE |
D3DRS_AMBIENT(環境(光)色) |
0 |
D3DRS_COLORVERTEX |
TRUE |
D3DRS_FOGVERTEXMODE |
D3DFOG_NONE |
D3DRS_CLIPPING(裁剪) |
TRUE |
D3DRS_LIGHTING(光照) |
TRUE |
D3DRS_LOCALVIEWER |
TRUE |
D3DRS_EMISSIVEMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_AMBIENTMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_DIFFUSEMATERIALSOURCE |
D3DMCS_COLOR1 |
D3DRS_SPECULARMATERIALSOURCE |
D3DMCS_COLOR2 |
D3DRS_VERTEXBLEND |
D3DVBF_DISABLE |
D3DRS_CLIPPLANEENABLE |
0 |
D3DRS_POINTSIZE |
Driver dependent |
D3DRS_POINTSIZE_MIN |
1 |
D3DRS_POINTSPRITEENABLE |
FALSE |
D3DRS_POINTSCALEENABLE |
FALSE |
D3DRS_POINTSCALE_A |
1 |
D3DRS_POINTSCALE_B |
0 |
D3DRS_POINTSCALE_C |
0 |
D3DRS_MULTISAMPLEANTIALIAS |
TRUE |
D3DRS_MULTISAMPLEMASK |
0xffffffff |
D3DRS_PATCHEDGESTYLE |
D3DPATCHEDGE_DISCRETE |
D3DRS_POINTSIZE_MAX |
1 |
D3DRS_INDEXEDVERTEXBLENDENABLE |
FALSE |
D3DRS_TWEENFACTOR |
0 |
D3DRS_POSITIONDEGREE |
D3DDEGREE_CUBIC |
D3DRS_NORMALDEGREE |
D3DDEGREE_LINEAR |
D3DRS_MINTESSELLATIONLEVEL |
1 |
D3DRS_MAXTESSELLATIONLEVEL |
1 |
D3DRS_ADAPTIVETESS_X |
0 |
D3DRS_ADAPTIVETESS_Y |
0 |
D3DRS_ADAPTIVETESS_Z |
1 |
D3DRS_ADAPTIVETESS_W |
0 |
D3DRS_ENABLEADAPTIVETESSELLATION"/> |
FALSE |
采樣器狀態控制采樣相關的主題,如濾波,貼瓷和紋理坐標尋址模式。使用SetSamplerState設置采樣器狀態(包括在鑲嵌器(tessellator)單元中用于采樣位移映射(displacement maps)的采樣器狀態).采樣器狀態以”D3DSAMP_”為前綴重命名會導致從DirectX 8中移植的程序在編譯時報錯。
下面的表格包含設置頂點狀態的所有采樣器狀態:
Sampler States |
Default Value |
D3DSAMP_DMAPOFFSET |
256 |
頂點管道:紋理狀態
紋理狀態控制多紋理混合器的紋理混合操作。使用SetTextureStageState來設置紋理狀態。使用SetTexture將一個紋理對象與采樣器層關聯。
下面的表格包含設置頂點狀態的所有紋理狀態:
Texture States |
Default Value |
D3DTSS_TEXCOORDINDEX |
0 |
D3DTSS_TEXTURETRANSFORMFLAGS |
D3DTTFF_DISABLE |
D3DTSS_TEXCOORDINDEX是一個固定功能的定點處理狀態。如果使用可編程的頂點著色器,該狀態會被忽略。
使用狀態塊保存像素狀態
狀態塊可以僅用于獲取像素狀態。下面的狀態為像素狀態:
l 像素渲染狀態
l 像素紋理狀態
l 像素采樣器狀態
l 當前像素著色器和每個像素著色器常量
使用狀態塊獲取像素狀態,需在調用CreateStateBlock時為第一個參數指定D3DSBT_PIXELSTATE。
像素管道:渲染狀態
設備渲染狀態幾乎影響管道每一個部分的行為。調用SetRenderState設置渲染狀態。
下面的表格包含設置像素狀態的所有渲染狀態:
Render States |
Default Value |
D3DRS_ZENABLE |
D3DZB_FALSE |
D3DRS_SPECULARENABLE |
FALSE |
D3DFILLMODE |
D3DFILL_SOLID |
D3DSHADEMODE |
D3DSHADE_GOURAUD |
D3DRS_ZWRITEENABLE |
TRUE |
D3DRS_ALPHATESTENABLE |
FALSE |
D3DRS_LASTPIXEL |
TRUE |
D3DRS_SRCBLEND |
D3DBLEND_ONE |
D3DRS_DESTBLEND |
D3DBLEND_ZERO |
D3DRS_ZFUNC |
D3DCMP_LESSEQUAL |
D3DRS_ALPHAREF |
0 |
D3DRS_ALPHAFUNC |
D3DCMP_ALWAYS |
D3DRS_DITHERENABLE |
FALSE |
D3DRS_FOGSTART |
0 |
D3DRS_FOGEND |
1 |
D3DRS_FOGDENSITY |
1 |
D3DRS_ALPHABLENDENABLE |
FALSE |
D3DRS_DEPTHBIAS |
0 |
D3DRS_STENCILENABLE |
FALSE |
D3DRS_STENCILFAIL |
D3DSTENCILOP_KEEP |
D3DRS_STENCILZFAIL |
D3DSTENCILOP_KEEP |
D3DRS_STENCILPASS |
D3DSTENCILOP_KEEP |
D3DRS_STENCILFUNC |
D3DCMP_ALWAYS |
D3DRS_STENCILREF |
0 |
D3DRS_STENCILMASK |
0xffffffff |
D3DRS_STENCILWRITEMASK |
0xffffffff |
D3DRS_TEXTUREFACTOR |
0xffffffff |
D3DRS_WRAP0 |
0 |
D3DRS_WRAP1 |
0 |
D3DRS_WRAP2 |
0 |
D3DRS_WRAP3 |
0 |
D3DRS_WRAP4 |
0 |
D3DRS_WRAP5 |
0 |
D3DRS_WRAP6 |
0 |
D3DRS_WRAP7 |
0 |
D3DRS_WRAP8 |
0 |
D3DRS_WRAP9 |
0 |
D3DRS_WRAP10 |
0 |
D3DRS_WRAP11 |
0 |
D3DRS_WRAP12 |
0 |
D3DRS_WRAP13 |
0 |
D3DRS_WRAP14 |
0 |
D3DRS_WRAP15 |
0 |
D3DRS_LOCALVIEWER |
TRUE |
D3DRS_EMISSIVEMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_AMBIENTMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_DIFFUSEMATERIALSOURCE |
D3DMCS_COLOR1 |
D3DRS_SPECULARMATERIALSOURCE |
D3DMCS_COLOR2 |
D3DRS_COLORWRITEENABLE |
0x0000000f |
D3DBLENDOP |
D3DBLENDOP_ADD |
D3DRS_SCISSORTESTENABLE |
FALSE |
D3DRS_SLOPESCALEDEPTHBIAS |
0 |
D3DRS_ANTIALIASEDLINEENABLE |
FALSE |
D3DRS_Two_Sided_StencilMODE |
FALSE |
D3DRS_CCW_STENCILFAIL |
D3DSTENCILOP_KEEP |
D3DRS_CCW_STENCILZFAIL |
D3DSTENCILOP_KEEP |
D3DRS_CCW_STENCILPASS |
D3DSTENCILOP_KEEP |
D3DRS_CCW_STENCILFUNC |
D3DCMP_ALWAYS |
D3DRS_COLORWRITEENABLE1 |
0x0000000f |
D3DRS_COLORWRITEENABLE2 |
0x0000000f |
D3DRS_COLORWRITEENABLE3 |
0x0000000f |
D3DRS_BLENDFACTOR |
0xffffffff |
D3DRS_SRGBWRITEENABLE |
0 |
D3DRS_SEPARATEALPHABLENDENABLE |
FALSE |
D3DRS_SRCBLENDALPHA |
D3DBLEND_ONE |
D3DRS_DESTBLENDALPHA |
D3DBLEND_ZERO |
D3DRS_BLENDOPALPHA |
D3DBLENDOP_ADD |
像素管道:采樣器狀態
采樣器狀態控制采樣相關的主題,如濾波,貼瓷和紋理坐標尋址模式。使用SetSamplerState設置采樣器狀態(包括在鑲嵌器(tessellator)單元中用于采樣位移映射(displacement maps)的采樣器狀態).采樣器狀態以”D3DSAMP_”為前綴重命名會導致從DirectX 8中移植的程序在編譯時報錯。
下面的表格包含設置像素狀態的所有采樣器狀態:
Sampler States |
Default Value |
D3DSAMP_ADDRESSU |
D3DTADDRESS_WRAP |
D3DSAMP_ADDRESSV |
D3DTADDRESS_WRAP |
D3DSAMP_ADDRESSW |
D3DTADDRESS_WRAP |
D3DSAMP_BORDERCOLOR |
0x00000000 |
D3DSAMP_MAGFILTER |
D3DTEXF_POINT |
D3DSAMP_MINFILTER |
D3DTEXF_POINT |
D3DSAMP_MIPFILTER |
D3DTEXF_NONE |
D3DSAMP_MIPMAPLODBIAS |
0 |
D3DSAMP_MAXMIPLEVEL |
0 |
D3DSAMP_MAXANISOTROPY |
1 |
D3DSAMP_SRGBTEXTURE |
0 |
D3DSAMP_ELEMENTINDEX |
0 |
像素管道:紋理狀態
紋理狀態控制多紋理混合器的紋理混合操作。使用SetTextureStageState來設置紋理狀態。使用SetTexture將一個紋理對象與采樣器層關聯。
下面的表格包含設置像素狀態的所有紋理狀態:
Texture States |
Default Value |
D3DTSS_COLOROP |
D3DTOP_DISABLE |
D3DTSS_COLORARG1 |
D3DTA_TEXTURE |
D3DTSS_COLORARG2 |
D3DTA_CURRENT |
D3DTSS_ALPHAOP |
D3DTOP_DISABLE |
D3DTSS_ALPHAARG1 |
D3DTA_TEXTURE |
D3DTSS_ALPHAARG2 |
D3DTA_CURRENT |
D3DTSS_BUMPENVMAT00 |
0 |
D3DTSS_BUMPENVMAT01 |
0 |
D3DTSS_BUMPENVMAT10 |
0 |
D3DTSS_BUMPENVMAT11 |
0 |
D3DTSS_TEXCOORDINDEX |
0 |
D3DTSS_BUMPENVLSCALE |
0 |
D3DTSS_BUMPENVLOFFSET |
0 |
D3DTSS_TEXTURETRANSFORMFLAGS |
D3DTTFF_DISABLE |
D3DTSS_COLORARG0 |
D3DTA_CURRENT |
D3DTSS_ALPHAARG0 |
D3DTA_CURRENT |
D3DTSS_RESULTARG |
D3DTA_CURRENT |
渲染狀態
設備渲染狀態幾乎影響管道每一個部分的行為。調用SetRenderState設置渲染狀態。下面的主題包含了附加的信息。
- Alpha混合狀態(Alpha Blending State)
- Alpha測試狀態(Alpha Testing State)
- 環境光照狀態(Ambient Lighting State)
- 反走樣狀態(Antialiasing State)
- 剔除狀態(Culling State)
- 深度緩存狀態(Depth Buffering State)
- 霧狀態(Fog State)
- 光照狀態(Lighting State)
- 輪廓和填充狀態(Outline and Fill State)
- 單點顏色狀態(Per-Vertex Color State)
- 圖元裁剪狀態(Primitive Clipping State)
- 著色狀態(Shading State)
- 模板緩存狀態(Stencil Buffer State)
- 紋理包裝狀態(Texture Wrapping State)
Alpha混合狀態(Alpha Blending State)
色彩的Alpha值控制其透明度。開啟Alpha混合允許平面上的顏色,材質和紋理以透明度混合到其他平面上。
更多信息參考Alpha紋理混合(Alpha Texture Blending)和紋理混合(Texture Blending)。
用C++編寫的應用程序使用D3DRS_ALPHABLENDENABLE渲染狀態開啟Alpha透明度混合。Direct3D API允許多種Alpha混合類型。然而,需要注意用戶的3D硬件并不一定支持所有Direct3D允許的混合狀態。
Alpha混合類型的設定依賴于D3DRS_SRCBLEND和D3DRS_DESTBLEND渲染狀態。需要成對使用源混合狀態和目標混合狀態。下面的代碼舉例說明如何將源混合狀態設置為D3DBLEND_SRCCOLOR,將目標混合狀態設置為D3DBLEND_INVSRCCOLOR。
//此代碼假設d3dDevice為合法的IDirect3DDevice9接口指針
//設置源混合狀態
d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
//設置目標混合狀態
d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
改變源混合狀態和目標混合狀態會改變在布滿霧或灰層的大氣中的放射性物體的外觀。例如,如果你的應用程序模擬在霧環境中的火焰,力場,等離子束或相似的放射性物質,將源混合狀態和目標混合狀態設置為D3DBLEND_ONE。
其他的Alpha混合應用程序用該狀態來控制3D場景的光照,也稱之為光照映射(light mapping)。根據源的Alpha信息,將源混合狀態設置為D3DBLEND_ZERO并將目標混合狀態設置為D3DBLEND_SRCALPHA使場景變暗。源圖元在合適的時機被作為使幀緩存內容變暗比例的光照映射(The source primitive is used as a light map that scales the contents of the frame buffer to darken it when appropriate).這生成單色光照映射(This produces monochrome light mapping).
你可以通過將源Alpha混合狀態設置為D3DBLEND_ZERO,把目標混合狀態設置為D3DBLEND_SRCCOLOR來完成彩色光照映射。
Alpha測試狀態(Alpha Testing State)
C++應用程序可使用Alpha測試來控制像素何時被吸入渲染目標平面。通過使用D3DRS_ALPHATESTENABLE渲染狀態,應用程序設置當前Direct3D設備依照Alpha測試函數測試每一個像素。如果測試成功,像素被寫在該平面。如果失敗,Direct3D忽略該像素。使用D3DRS_ALPHAFUNC渲染狀態選擇Alpha測試函數。應用程序可以通過使用D3DRS_ALPHAREF渲染狀態為所有的像素設置Alpha參考值用于比較。
Alpha測試最一般的用途是當柵格華對象幾乎透明時用于改進性能。如果被柵格化的顏色數據比給定像素的顏色值更不透明(D3DCMPCAPS_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);
}
//若該比較不支持,繼續渲染。
//唯一的缺點是沒有性能的提升。
并不時所有的硬件支持所有的Alpha測試特性。你可以通過調用GetDeviceCaps方法檢測設備能力。在重新獲取設備能力后,檢測相關的D3DCAPS9結構的AlphaCmpCaps成員是否支持需要的比較函數。如果AlphaCmpCaps成員包含僅僅D3DPCMPCAPS_ALWAYS能力或D3DPCMPCAPS_NEVER能力,那驅動程序不支持Alpha測試。
環境光照狀態(Ambient Lighting State)
環境光是環境從所有方向輻射的光線。要了解Direct3D如何使用環境光照,參考光照數學(Mathematics of Lighting)。
C++應用程序通過在調用SetRenderState方法時給第一個參數傳遞枚舉值D3DRS_AMBIENT設置環境光顏色。第二個參數為顏色值。默認值為0。
d3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
反走樣(抗鋸齒)狀態(Antialiasing State)
反走樣是使線或邊緣在屏幕上外觀更光滑的方法。默認情況下,Direct3D不執行反走樣。要開啟全屏反走樣,設置D3DRS_MULTISAMPLEANTIALIAS渲染狀態為TRUE。要關閉反走樣則設置該渲染狀態值為FALSE。
剔除狀態(Culling State)
要改進渲染性能,你可以挑選(或刪除)背離攝像機的圖元面。對于單面圖元,由于背面不可見,此方法節省了渲染時間。要開啟剔出,你需要知道定點的環繞順序(一般為逆時針)。此例子講刪除任何背面向前的圖元(給定逆時針環繞順序):
SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
深度緩存狀態(Depth Buffering State)
深度緩存是刪除隱藏線或隱藏面的方法。默認情況下,Direct3D不使用深度緩存。
C++應用程序使用D3DRS_ZENABLE渲染狀態更新深度緩存狀態,使用D3DZBUFFERTYPE枚舉成員以制定新的狀態值。
如果你的應用程序需要阻止Direct3D寫入深度緩存,可在調用SetRenderState時使用D3DRS_ZWRITEENABLE枚舉值,并給第二個參數指定值D3DZB_FALSE。
下面的代碼說明如何將深度緩存狀態設置為開啟Z緩存。
d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
應用程序也可以使用D3DRS_ZFUNC渲染狀態來控制Direct3D在執行深度緩存時的比較函數。
Z偏移是將一個平面在另一平面前顯示的方法,即時他們的深度值相同。你可以使用該技術實現變化的效果。一般的例子是渲染墻的陰影。墻和陰影具有相同的深度值。然而,你希望你的應用程序在墻上顯示陰影。給陰影加上一個Z偏移使Direct3D合適的顯示他們(參見D3DRS_DEPTHBIAS)。
霧狀態(Fog State)
舞化效果使得3D場景更加真實。你可以使用霧化效果更好的模擬霧(You can use fog effects for more than simulating fog)。他們同樣可以根據距離減小場景的清晰度。這反映了現實世界中發生的情況;隨著物體遠離用戶,他們的細節變得更模糊。
C++應用程序通過設備渲染狀態控制霧化。D3DRENDERSTATETYPE枚舉類型包含的狀態控制像素(表)或頂點霧是否使用,它們的顏色,系統使用的霧化計算公式和公式的參數。
你通過將D3DRS_FOGENABLE渲染狀態設置為TRUE開啟霧化效果。可以使用D3DRS_FOGCOLOR渲染狀態將霧顏色設置為任意值;霧顏色的Alpha值被忽略。
D3DRS_FOGTABLEMODE和D3DRS_FOGVERTEXMODE渲染狀態控制應用于霧計算的公式,它們間接地控制所使用的霧化類型。兩個渲染狀態可設置D3DFOGMODE枚舉類型中的成員。分別設置為這兩個渲染狀態設置D3DFOG_NONE值關閉像素和頂點霧效果。如果兩個渲染狀態都被設置為有效的模式,系統僅應用像素渲染效果。
D3DRS_FOGSTART和D3DRS_FOGEND渲染狀態控制D3DFOG_LINEAR模式的霧化公式的參數。D3DRS_FOGDENSITY渲染狀態控制指數(exponential)霧化模式的霧密度。
光照狀態(Lighting State)
如果你不使用頂點著色器或像素著色器進行光照,你可以在運行時選擇光照引擎。光照引擎要求頂點數據中包含每個頂點的法線;沒有法線數據的頂點在光照計算時會發生點積為0的情況。光照計算在光照數學(Mathematics of lighting)中有更詳細的介紹。
要開啟光照引擎,使用:
SetRenderState(D3DRS_LIGHTING, TRUE);
輪廓和填充狀態(Outline and Fill State)
沒有紋理的圖元使用由材質或頂點顏色指定的顏色進行渲染。你可以通過D3DFILLMODE中定義的枚舉值為D3DRSFILLMODE渲染狀態選擇一個填充方法。
要開啟抖動(dithering),應用程序需給SetRenderState的第一個參數傳遞D3DRS_DITHERENABLE枚舉值。并設置第二個參數為TRUE以打開抖動,設為FALSE關閉抖動。
有時,在繪制直線的最后一個像素時會與周圍的圖元造成難看的重疊。你可以使用D3DRS_LASTPIXEL枚舉值控制此情況的發生。然而,在裝換該設置時需要仔細考慮。在某些情況下,禁止渲染最后一個像素會造成圖元之間難看的裂縫。
對象輪廓可以通過設置合適的線繪模式來繪制。默認的畫線狀態為繪制實線。參考D3DX中的繪線支持(Line Drawing Support in D3DX )渲染狀態獲取更多信息。
逐點顏色狀態(Per-Vertex Color State)
在執行光照時如果你告知運行時顯示頂點顏色數據,Direct3D光照引擎會使用逐頂點顏色數據。通過開啟下面的渲染狀態:
//關閉逐點顏色渲染
SetRenderState(D3DRS_COLORVERTEX, FALSE);
//關閉逐點顏色渲染
SetRenderState(D3DRS_COLORVERTEX, TRUE);
如果逐點顏色被開啟,應用程序可以配置系統獲取頂點顏色信息的源。D3DRS_AMBIENTMATERIALSOURCE, D3DRS_DIFFUSEMATERIALSOURCE, D3DRS_EMISSIVEMATERIALSOURCE和D3DRS_SPECULARMATERIALSOURCE渲染狀態分別控制環境光,漫反射光,發射光和鏡面光顏色組成源。每一個狀態可以被設置為定義指示系統為指定的顏色成份使用當前材質,漫反射色或鏡面光顏色作為源的D3DMATERIALCOLORSOURCE枚舉類型的成員。
圖元裁剪狀態(Primitive Clipping State)
部分位于(或完全在外)視錐臺的圖元會被裁減,僅渲染圖元的可視部分。裁減使得僅渲染可見的圖元或圖元的可見部分,從而減少了大量工作。
要使用管道進行裁減,設置D3DRS_CLIPPING渲染狀態為TRUE(默認值)來開啟裁減或設置為FALSE關閉Direct3D裁減。
著色狀態(Shading State)
Direct3D支持平面著色和高絡德著色。默認為高絡德著色。遙控制當前著色模式,C++應用程序需為D3DRS_SHADEMODE渲染狀態指定一個D3DSHADEMODE枚舉類型的成員。
下面的代碼說明如何設置著色狀態為平面著色模式:
d3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
模板緩存狀態(Stencil Buffer State)
應用程序使用模板緩存來決定像素是否被寫入目標平面。細節參看模板緩存技術(Stencil Buffer Techniques)。
紋理環繞狀態(Texture Wrapping State)
D3DRS_WRAP0到D3DRS_WRAP7渲染狀態為設備的多紋理層中多個紋理開啟和關閉u環繞和v環繞(紋理u,v坐標)。你可以設置這些渲染狀態為D3DWRAPCOORD_0,D3DWRAPCOORD_1, D3DWRAPCOORD_2和D3DWRAPCOORD_3標識的或值來開啟紋理第一個,第二個,第三個和第四個方向的環繞。使用0關閉所有的環繞。默認情況下禁用所有紋理層所有方向的紋理環繞。