5/10/2007

Alpha blending



Pixel data:

座標: X Y Z
顏色: RGBA

簡單地說這是一種讓3D物件產生透明感的技術。屏幕上顯示的3D物件,每個像素中有紅、綠、藍三組數值。若3D環境中允許像素能擁有一組α值,我們就稱它擁有一個α通道。α值是記載像素的透明度,範圍在0.0(透明)1.0(不透明)之間這樣。一來使得每一個物件都可以擁有不同的透明程度。比如說,玻璃會擁有很高的透明度,而一塊木頭可能就沒什麼透明度可言。α混合這個功能,就是處理兩個物件在螢幕畫面上疊加的時候,還會將α值列入考慮,使其呈現接近真實物件的效果。

Over定義:

RGBc = RGBf + (1-αf) RGBb

αc =αf +(1-αf) αb

Comp 定義:

RGBc = β(f over b) + (1-β)(b over f)

最後的描繪值= SRC(來源)*blending係數 + DEST(目的地)* blending係數

最後的描繪值= SRC*SRCalpha + DEST*(1-SRCalpha)

//--------------------------------------

// 設定Rendering state參數

//--------------------------------------

// 指定兩面描繪的模式

pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

// 光源沒有計算

pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

// 比較Z

pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);

// 混色模式(高品質描繪)

pD3DDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE );

// Alfa Brending執行

pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);

// Alfa Brending狀態的設定

pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );

pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

一般半透明效果(alpha=0.0~1.0):

D3DRS_SRCBLEND, D3DBLEND_SRCALPHA

D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA

  • 畫半透明模型要先畫其後面的模型, 否則即使前面是透明的, 後面的東西也不被描繪

// 描繪四方形

pD3DDevice->SetStreamSource( 0, m_pVB1, 0, sizeof(MY_VERTEX) );

pD3DDevice->SetFVF( MY_VERTEX_FVF );

pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

// 描繪三角形

pD3DDevice->SetStreamSource( 0, m_pVB2, 0, sizeof(MY_VERTEX) );

pD3DDevice->SetFVF( MY_VERTEX_FVF );

pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );


1 comment:

Anonymous said...

傻拉!!
BLOG是放輕鬆的地方!!!
搞的像ㄍ技術論壇一樣...ㄘㄟ