半透明的混合效果經常在游戲裡看到,效果那叫一個好。有天好奇心起,想琢磨一下這種效果是怎麼實現的。可是自己沒學過數字圖像處理和圖形學,於是只好憑直覺猜測了。
按照生活經驗,將兩個膠片疊在一起時會有半透明效果,於是設想:從位圖A和B中對應位置各取一點Pa、Pb,分別求取Pa和Pb的RGB三個分量,並將對應分量求均值後拼裝成一個新的顏色,這樣就是透明度為一半的混合效果了。按這個思路試了試,發現運氣真好。
實現RGB拼裝的函數很簡單,此處僅說明原理,未作優化:
/**//*
* alpha mix demo
*/
inline COLORREF AlphaPixel(UINT alpha, COLORREF clr1, COLORREF clr2)
{
double k = (double)alpha / 256.0;
double reverse_k = 1.0 - k;
BYTE r = BYTE( GetRValue(clr2) * k + GetRValue(clr1) * reverse_k );
BYTE g = BYTE( GetGValue(clr2) * k + GetGValue(clr1) * reverse_k );
BYTE b = BYTE( GetBValue(clr2) * k + GetBValue(clr1) * reverse_k );
return RGB(r, g, b);
}
細心的讀者從上面代碼可以發現,隨著alpha參數由0-255的變化,混合效果可以實現全透明--不透明的漸變。依據上述函數實現的半透明混合效果截圖:
程序源代碼(內含demo)下載:http://blog.vckbase.com/Files/HateMath/test_alpha.rar
程序在winXp SP2 + VC6.0下通過。