(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.和資料來...