Alpha顏色混合的魔法 上篇

2021-06-04 05:15:55 字數 3417 閱讀 9270

**:

摘要:本系列文章介紹了一種在影象處理、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 ...