16位Alpha混合的簡單演算法 (轉)

amyz發表於2007-11-16
16位Alpha混合的簡單演算法 (轉)[@more@]

  遊戲中,我們常常可以看到一些半透明的影像,那麼這些影像是怎麼生成的呢?是簡單的貼點陣圖做的嗎?當然不是,要不美工不就慘死了。這其實是利用將兩張圖片進行混合後的效果,也就是圖形的Alpha混合,要得到混合圖片,就必須對每個點分別進行處理。讓我們來看看如何進行Alpha混合。這裡以16位色彩位例子:
  16位色彩下,每個畫素都用一個來表示,有16位二進位制。這16位,分成三段分別表示畫素的R、G、B值。現在的顯示卡有兩種:555格式的RGB分別各佔5位最高位空、565格式G的值佔6位,其他兩個分量各佔5位。所以首先,我們要得到畫素的RGB。:namespace prefix = o ns = "urn:schemas--com::office" />

N

R

R

R

R

R

G

G

G

G

G

B

B

B

B

B

圖1 555的RGB分量

R

R

R

R

R

G

G

G

G

G

G

B

B

B

B

B

圖2 565的RGB分量


   在DirectDraw下,可以透過鎖定表面,得到表面的畫素,將他儲存到一個WORD*的變數裡。當我們得到資源表面和目的表面的畫素後,我們就可以開始進行Alpha混合了。16bit的Alpha混合首先必須分別對原和目的表面的畫素分色。這可以透過位操作來實現,用畫素值分別與RGB對應的特定值進行與操作將多餘的其他色去掉,最後透過移位去掉後面的0。這裡要注意555顯示卡和565顯示卡的區別。分色後,混合正式開始,我們將分色得到的R、G、B的各分色分別混合。下面先看一個公式:A=目的顏色、B=資源顏色、Alpha=混色深度(0 < alpha < 1)

混合後的顏色 = A * Alpha + B * ( 1-Alpha )


  當Alpha=0,混合後的顏色=A。當Alpha=1,混合後的顏色=B。當Alpha介於0與1之間,混合後的顏色包含了資源和目的表面的兩種顏色。調整Alpha的值,混合後的顏色就會跟著有規律的變化。但是,顏色是整數,所以,我們必須對公式進行一點簡單的變化:

混合後的顏色 = ( A * Alpha + B * ( 32-Alpha ) ) / 32   1 < 32


  這樣的等價變化後所有的元素都變成了整數,混合顏色的調整級數為32(更高當然也是可以的,把公式中的32換成其他數,Alpha區值範圍也變化),但是處理乘法和除法是很慢的,而Alpha混合是對很多的點進行計算,上面的公式顯然是不適合的,我們再來點變化:

混合後的顏色=( ( A-B ) * Alpha ) >> 5 + B


  除以32等於右移5位,這就是調整級數取32的原因。計算機處理移位是很快的。至於那個乘以Alpha,我也不知道有什麼簡單的方法改成更高的演算法。分別混合好R、G、B的色後,最後還需要將他們合成,這是個簡單的步驟,與分色相反的移位,然後將三個色值按位或操作就可以了。處理了所有需要混色的畫素後,記得將表面解鎖。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982695/,如需轉載,請註明出處,否則將追究法律責任。

相關文章