轉 關於 D3D的 SetRenderState 以及AlphaBlend 和AlphaTest

改變D3D中的渲染狀態

1). 設置着色模式:                                                         

SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT //設置平面着色模式

SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD //設置格勞德着色模式

2). 設置多邊形填充模式:

SetRenderStateD3DRS_FILLMODE, D3DFILL_POINT //點填充模式,D3D在多邊形的每個頂點繪製一個像素

SetRenderStateD3DRS_FILLMODE, D3DFILL_WIREFRAME //線填充模式,D3D在多邊形的每個邊繪製一條線

SetRenderStateD3DRS_FILLMODE, D3DFILL_SOLID   //面模式,D3D默認模式,對多邊形的面進行填充

3). 設置全景圖形抗鋸齒:

SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, TRUE)   //抗鋸齒

SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, FALSE)   //不抗鋸齒

4). 設置剔除模式:


SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) //不剔除任何面

5). 設置光照模式:
SetRenderState(D3DRS_AMBIENT, D3DCOLOR ambientColor); //爲整個場景設置環境光
SetRenderState(D3DRS_SPECULARENABLE, TRUE);   //激活鏡面反射計算(D3D默認情況下關閉)

6). 啓動/關閉深度測試:
SetRenderState( D3DRS_ZENABLE, TRUE );    //啓用深度測試

 

7) 設置紋理過濾器

  //線性紋理

SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

  //最近點採樣

SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ POINT);

SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

  //各向異性紋理過濾

SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC)

SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_ ANISOTROPIC);

8)

SetRenderState( D3DRS_POINTSCALEENABLE, TRUE ); //打開縮放功能

9)

SetRenderState( D3DRS_POINTSCALE_A , FtoDW( 1.00f ));//設置因子,下同

SetRenderState( D3DRS_POINTSCALE_B , FtoDW( 1.00F ));

SetRenderState( D3DRS_POINTSCALE_C , FtoDW( 1.00f ));

10)

SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));//設置點大小上限,下類似

SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));

SetRenderState( D3DRS_POINTSPRITEENABLE , TRUE ) ;  //打開點精靈效果

SetRenderState( D3DRS_AMBIENT,  0xffffffff );  //設置環境光顏色開啓ALPHA混合效果

11)

設置混合因子:

源:SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );

目的:SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA);

第二個參數是 D3DBLEND的枚舉結構

 

 

 

1.       深度測試
a)         深度緩衝區:屏幕上每個像素點的深度信息的一塊內存緩衝區.D3D通過比較當前繪製的像素點的深度和對應深度緩衝區的點的深度值來決定是否繪製當前像素.
b)        D3DPRESENT_PARAMETERS. AutoDepthStencilFormat = D3DFMT_D16
示深度值由16位二進制表示
開啓深度測試:pDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
深度測試函數:D3DRS_ZFUNC:
D3DCMP_NEVER
總是返回FALSE
D3DCMP_LESS (常用)
小於深度緩衝區的相應值時返回TRUE
D3DCMP_EQUAL
等於
D3DCMP_LESSEQUAL
小於等於
D3DCMP_GREATER
大於
D3DCMP_NOTEQUAL
不等於
D3DCMP_GREATEREQUAL
大於等於
D3DCMP_ALWAYS
總是返回TRUE
更新緩衝區:保持深度緩衝區不變還是用當前像素的深度值更新
pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
2.       Alpha混合
a)         原理:Color = (RGBsrc * Ksrc) OP (RGBdst * Kdst)
最常用的方法:Color = (RGBsrc * Alphasrc) + (RGBdst * (1 – Alphasrc)
 
b)        應用
啓用:pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
Blend mode factor
Description
D3DBLEND_ZERO
(0, 0, 0, 0)
D3DBLEND_ONE
(1, 1, 1, 1)
D3DBLEND_SRCCOLOR
(Rs, Gs, Bs, As)
D3DBLEND_INVSRCCOLOR
(1-Rs, 1-Gs, 1-Bs, 1-As)
D3DBLEND_SRCALPHA
(As, As, As, As)
D3DBLEND_INVSRCALPHA
(1-As, 1-As, 1-As, 1-As)
D3DBLEND_DESTALPHA
(Ad, Ad, Ad, Ad)
D3DBLEND_INVDESTALPHA
(1-Ad, 1-Ad, 1-Ad, 1-Ad)
D3DBLEND_DESTCOLOR
(Rd, Gd, Bd, Ad)
D3DBLEND_INVDESTCOLOR
(1-Rd, 1-Gd, 1-Bd, 1-Ad)
D3DBLEND_SRCALPHASAT
(f, f, f, 1); f = min(As, 1-Ad)
Alpha混合方法
D3DBLENDOP_ADD
源計算結果與顏色緩衝區計算結果相加
D3DBLENDOP_SUBTRACT
源計算結果減去顏色緩衝區計算結果
D3DBLENDOP_REVSUBTRACT
顏色緩衝區計算結果減去源計算結果
D3DBLENDOP_MIN
MIN(源計算結果, 顏色緩衝區計算結果)
D3DBLENDOP_MAX
MAX(源計算結果, 顏色緩衝區計算結果)
Color = (RGBsrc * Alphasrc) + (RGBdst * (1 – Alphasrc) )的設置示例:
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
pDevice->SetRenderState( D3DBLENDOP, D3DBLENDOP_ADD );(默認值,可選)
3.       Alpha測試
a)         原理
根據Alpha測試條件來決定當前像素是否繪製,並不需要對顏色緩衝進行操作,所以速度比Alpha混合要快.
b)        應用
啓用:pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
Alpha測試函數
D3DCMP_FUNC枚舉,默認爲D3DCMP_ALWAYS
參考值:
pDevice->SetRenderState( D3DRS_ALPHAREF, 0x00000081);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章