同時使用ColorKey以及頂點Alpha效果

2021-06-16 00:25:30 字數 4193 閱讀 1177

(1)如何使用colorkey?

可以使用一張帶alpha通道的紋理,以及alphablend來實現。

也可以使用alphatest(先略過不表)。

具體做法:

在initdeviceobjects()中加入:

d3dxcreatetexturefromfileex(m_pd3ddevice,"a.bmp",d3dx_default,d3dx_default,1,0,

d3dfmt_a8r8g8b8,d3dpool_default,d3dx_filter_point,d3dx_filter_point,

0xff000000,null,null,&m_ptexture); 

其中,你需要使用帶alpha通道的格式比如a8r8g8b8,

色彩鍵(透明色)我設為了0xff000000純黑色。

這裡做乙個詳細說明:

本質上,d3d裡沒有色彩鍵。所謂的色彩鍵,是通過將alpha通道設為0x00來實現的。

d3dxcreatetexturefromfileex函式裡,如果你制定了色彩鍵(比如0xff000000),

那麼,函式會把紋理中所有的0xff000000的象素的alpha通道設定為0x00。

現在,我們的紋理,含有了alpha值(或者說相當於色彩鍵)。

那麼,我們就需要利用紋理中含有的alpha值,來進行alpha混合。

這樣,就可以實現色彩鍵的效果。

在render()函式裡加入:

//設定alpha混合

m_pd3ddevice->setrenderstate(d3drs_alphablendenable,true);

m_pd3ddevice->setrenderstate(d3drs_srcblend,d3dblend_srcalpha);

m_pd3ddevice->setrenderstate(d3drs_destblend,d3dblend_invsrcalpha);

//把alpha引數設為紋理的alpha值(下面2行其實也可以去掉,因為預設就是這樣的)

m_pd3ddevice->settexturestagestate(0,d3dtss_alphaarg1,d3dta_texture); 

m_pd3ddevice->settexturestagestate(0,d3dtss_alphaop,d3dtop_selectarg1);

//渲染圖元

m_pd3ddevice->setfvf(fvf); 

m_pd3ddevice->setstreamsource(0,m_pvb,0,sizeof(vertex));

m_pd3ddevice->drawprimitive(d3dpt_********fan,0,2);

//還原渲染狀態

m_pd3ddevice->setrenderstate(d3drs_alphablendenable,false);  

m_pd3ddevice->setrenderstate(d3drs_srcblend,d3dblend_one);   

m_pd3ddevice->setrenderstate(d3drs_destblend,d3dblend_zero);

執行程式,發現,的確實現了coloykey效果!

(2)如何使用頂點alpha?

頂點alpha應用很多,有乙個例子是,在使用者介面中,利用頂點alpha,可以

像qq那樣隨意切換透明度。(只需要設定一下矩形的4個頂點的alpha值即可)

方法是:為頂點的diffuse(色彩)設定alpha值,

然後,使用頂點的diffuse裡的alpha通道,來進行alpha混合即可。

具體做法:

由於同樣是alpha混合操作,所以與上面的(1)非常類似。

因此你可以ctrl+c、ctrl+v。

首先需要更改頂點定義。加上color值。或者叫做diffuse。

struct colorvertex

;const dword fvf = (d3dfvf_xyzrhw | d3dfvf_tex1 | d3dfvf_diffuse);

在initdeviceobjects()函式裡,載入紋理,和(1)一樣,去複製貼上吧^_^

在restoredeviceobjects()函式裡,設定各各頂點。以及頂點的alpha值:

我覺的這段**我可以不用寫了。

比如,我把color的最高位,也就是alpha通道設為0x88。(50%透明)

(根據需要,你可能需要實時地改變頂點的alpha值,這個你自己來寫)

現在,我們的頂點,含有了alpha值0x88。(50%透明)

那麼,我們就需要利用頂點中含有的alpha值,來進行alpha混合。

這樣,就可以實現頂點alpha的半透明效果。

修改(1)中的render()函式,修改1行就可以:

把這一行:

m_pd3ddevice->settexturestagestate(0,d3dtss_alphaarg1,d3dta_texture);

修改為:

m_pd3ddevice->settexturestagestate(0,d3dtss_alphaarg1,d3dta_diffuse);

這樣就可以了。也就是更改了乙個引數而已。

執行程式,發現,的確實現了半透明效果。

但是,這個頂點alpha效果中,沒有色彩鍵,這就很討厭,那麼怎麼實現呢?

(3)怎樣同時使用colorkey以及頂點alpha效果?

開門見山,先說怎麼實現:

修改(2)中的render()函式中的幾行**,

為了怕你弄錯了,我浪費大量篇幅把修改後的render()**全部寫出來:

//設定alpha混合

m_pd3ddevice->setrenderstate(d3drs_alphablendenable,true);

m_pd3ddevice->setrenderstate(d3drs_srcblend,d3dblend_srcalpha);

m_pd3ddevice->setrenderstate(d3drs_destblend,d3dblend_invsrcalpha);

//設定alpha值(把紋理alpha和頂點alpha進行乘法運算)

m_pd3ddevice->settexturestagestate( 0, d3dtss_alphaarg1, d3dta_texture ); 

m_pd3ddevice->settexturestagestate( 0, d3dtss_alphaarg2, d3dta_diffuse ); 

m_pd3ddevice->settexturestagestate( 0, d3dtss_alphaop, d3dtop_modulate );

//渲染圖元

m_pd3ddevice->setfvf(fvf); 

m_pd3ddevice->setstreamsource(0,m_pvb,0,sizeof(vertex));

m_pd3ddevice->drawprimitive(d3dpt_********fan,0,2);

//還原渲染狀態

m_pd3ddevice->setrenderstate(d3drs_alphablendenable,false);  

m_pd3ddevice->setrenderstate(d3drs_srcblend,d3dblend_one);   

m_pd3ddevice->setrenderstate(d3drs_destblend,d3dblend_zero);

執行程式,成功地實現了漂亮的colorkey加頂點alpha效果。

說明:原理是什麼呢?

在乙個紋理階段中,d3d可以對2個引數進行某種運算,獲得乙個alpha的輸出(op)值。

我們的目的是,

紋理alpha為0x00 --   0%(色彩鍵)的時候,alpha的op為零,即完全透明。

紋理alpha為0xff -- 100%(非色彩鍵)的時候,alpha的op為頂點的alpha。

那麼,很容易想到,使用乘法運算。

看看標頭檔案,d3dtop_modulate 做的就是乘法運算。然後,試驗通過。

因為,0% * 頂點alpha值 == 0 (完全透明)

100% * 頂點alpha值 == 頂點alpha值 

(運算的時候,換算為百分比,即0xff的alpha值換算為1.0 == 100%)

這樣做使用了3d硬體加速,所以很快。

如果你使用lock,然後自己寫alpha混合,色彩鍵演算法的話,會很慢的.

NLP以及CV頂會記錄

nlp四大頂會 難度大致排名 acl emnlp naacl coling 其他nlp頂會 另 計算機視覺三大頂會 iccv ieee international conference on computer vision 國際計算機視覺大會 由ieee主辦,被澳大利亞ict學術會議排名和中國計算機...

Pynput使用組合鍵,以及同時監控鍵盤和控制鍵盤

我想寫乙個使用快捷鍵來執行網頁搜尋的小軟體,但發現網上還沒有很多關於pynput使用組合鍵的帖子,只好自己寫乙個了.我剛開始的時候找了半天,發現了乙個人使用多執行緒的方式來實現這個功能,但我覺得這個東西還是越簡單越好 from pynput import keyboard from pynput.k...

同時使用多個UITableView

1.xib storyboard中給2個tableview設定constraints 等寬 方法 設定maintableview的上 下 左 三部分的約束為0 subtableview上 下 右 的約束為0 同時選中maintableview和subtableview,設定為等寬和等高 2.和資料來...