遊戲中常見的半透明混合效果視覺效果極佳。出於好奇,筆者嘗試從生活經驗推導其實現原理:將兩張膠片疊合會產生半透明效果,對應到位圖像素,即對兩圖對應像素的 RGB 分量分別取加權平均。實驗證實這一定性認識完全正確。
給定透明度參數 alpha (0~255),前景色 clr2、背景色 clr1,混合結果為:
/**//*
* Alpha 混合演示
*/
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)下載:test_alpha.rar
測試環境:Windows XP SP2 + VC6.0