**:
摘要:本系列文章介紹了一種在影象處理、2d遊戲、3d遊戲中經常使用的混合模型:alpha顏色混合;
它就像神奇的魔法一樣,在電腦螢幕上給我們展現出乙個個絢麗多彩的世界!
全文 分為: 上篇 各種alpha顏色混合方式
下篇 其他一些顏色混合方案、補充
tag:alpha,blend,透明,顏色混合,顏色混合公式
正文:
為了便於討論,這裡只處理32bit的argb顏色;
**使用c++,編譯器:vc2005
a: 一些顏色和的資料定義:
#define
asm __asm
typedef unsigned
char
tuint8;
//[0..255]
struct
targb32
//32 bit color ;
struct
tpicregion
//一塊顏色資料區的描述,便於引數傳遞 ;
//那麼訪問乙個點的函式可以寫為:
inline targb32
&pixels(
const
tpicregion
&pic,
const
long
x,const
long
y)
b: 混合兩幅
這裡簡單的按照50%的比例混合兩幅;演算法也很簡單,就是將顏色分量直接
相加,然後取平均值;函式如下:
void
picblend_half(
const
tpicregion
&picdst,
const
tpicregion
& picsrc)}}
函式效果:
混合前源0 混合前源1
picblend_half混合後的結果
c.按比例混合兩幅
我們來增強picblend_half的混合能力,允許指定兩幅的混合比例(引數alpha);
alpha屬於[0..255],當alpha=127的時候與picblend_half等價(小的誤差不算:)
alpha顏色混合公式:dst=( src0*(255-alpha) + src1*alpha ) / 255;
void
picblend_alpha(
const
tpicregion
&picdst,
const
tpicregion
& picsrc,tuint8 alpha)}}
函式效果:
alpha=64時混合後的結果 alpha=192時混合後的結果
d.帶關鍵色的合成
中用一種特殊的顏色來代表透明的部分,這個關鍵色一般會選擇中實際沒
有用到的顏色;程式在顯示的時候跳過這些特殊畫素,從而形成透明效果;
gif的透明、很多遊戲中的透明貼圖都應用了這種原理;
比如一幅帶有透明關鍵色的:
該中的關鍵色顏色為純紅色,r=255;g=0;b=0;
函式實現:
void
picblend_keycolor(
const
tpicregion
&picdst,
const
tpicregion
&picsrc,
const
targb32
& keycolor)}}
函式效果:
picblend_keycolor函式效果圖
乙個支援換裝人物系統簡單示例:
身體 頭 髮型
按 底、身體、頭、髮型 的順序混合後的效果圖
void
picblend(
const
tpicregion
&picdst,
const
tpicregion
& picsrc)}}
函式效果:
混合前源0 混合前源1(32bit argb顏色) 其中透明通道展示
picblend混合後的結果(注意精靈的輪廓線,與背景完美的融合在了一起)
f.顏色混合方案:加
有時候,直接把兩幅顏色值相加也能得到很不錯的效果;
比如在實現一些光照特效、太陽引起的鏡頭光暈等效果的時候就很不錯;
(顏色相加時可能會超出255的值域,需要把結果飽和到255)
inline
long
border_color_up(
long
color)
void
picblend_add(
const
tpicregion
&picdst,
const
tpicregion
& picsrc)}}
函式效果:
混合前源0 混合前源1
picblend_add混合後的結果圖
關於顏色混合
ccsprite有乙個ccblendfunc型別的blendfunc 結構體成員,可以用來設定描繪時的顏色混合方案。ccblendfunc包含了乙個src和乙個dst,分別表示目標和源的運算因子。如果我們對乙個sprite使用setblendfunc方法,如 spritesetblendfunc c...
關於顏色混合
飛機大戰新增子彈的時候,子彈總是有背景的黑色,可以採用顏色混合的方法解決。在子彈初始化的時候 ccblendfunc cbl this setblendfunc cbl ccblendfunc 有兩個引數,第乙個引數代表源 也就是子彈 的顏色,第二個引數代表目標 也就是地圖背景 的顏色。1.glbl...
opengl顏色混合
注源顏色是當前顏色,目標顏色是背景顏色。顏色混合公式 混合之後的rgb顏色分量 影象的rgb顏色分量 alpha值 背景的rgb顏色分量 1 alpha值 開啟顏色混合步驟 1,glblendfunc gl src alpha,gl one 開啟混合 gldisable gl depth test ...