對(duì)于一些紋理,我們不要求全部顯示出來,如用公告板顯示的一棵樹的紋理,此時(shí)就要求讓背景不顯示出來,只顯示樹的部分。
//首先圖片的背景要處理成透明,顯然我們看到是透明的了,但是對(duì)于計(jì)算機(jī)來說,同樣會(huì)將透明背景后的物品遮住。
//此時(shí)就要在渲染紋理前對(duì)其進(jìn)行ALPHA混合
/*
alpha測(cè)試根據(jù)當(dāng)前像素是否滿足alpha測(cè)試條件(即是否達(dá)到一定的透明度)來控制是否繪制該像素,圖形程序應(yīng)用alpha測(cè)試可以有效地屏蔽某些像素顏色。與alpha混合相比,alpha測(cè)試不將當(dāng)前像素的顏色與顏色緩沖區(qū)中像素的顏色混合,像素要么完全不透明,要么完全透明。由于無需進(jìn)行顏色緩沖區(qū)的讀操作和顏色混合,因此alpha測(cè)試在速度上要優(yōu)于alpha混合。
比如一棵樹,我們將它的背景ALPHA值設(shè)置為小于1。0,那么,我們可以將ALPHAREF 設(shè)置為1。0 即0x000000ff 然后ALPHAFUNC 設(shè)置為GREATEREQUAL (>=) 所以,只有當(dāng)ALPHA值大于等于1的部份被渲染,這樣樹的背景就不用畫了!
*/
g_pMyd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );//開啟ALPHA混合功能
g_pMyd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);//設(shè)置源混合因子為(As,As,As,As)
g_pMyd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);//設(shè)置目標(biāo)混合因子為(1-As,1-As,1-As,1-As);
g_pMyd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );//開啟ALPHA測(cè)試功能
g_pMyd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x0f );//設(shè)置ALPHA測(cè)試參考值
g_pMyd3dDevice->SetRenderState( D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL );//設(shè)置APLHA測(cè)試比較規(guī)則
//在此處加載紋理和渲染
在渲染完畢后,不要忘了關(guān)閉開啟的功能
g_pMyd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
g_pMyd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );