16位Alpha混合的簡單演算法 (轉)
遊戲中,我們常常可以看到一些半透明的影像,那麼這些影像是怎麼生成的呢?是簡單的貼點陣圖做的嗎?當然不是,要不美工不就慘死了。這其實是利用將兩張圖片進行混合後的效果,也就是圖形的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 64K色模式下的快速Alpha混合演算法(轉)模式演算法
- 利用MMX最佳化64K色Alpha混合演算法(轉)演算法
- ACM 16進位制的簡單運算ACM
- 16進位制的簡單運算(迴圈)
- 遊戲開發學堂:2D模式下的alpha混合(轉)遊戲開發模式
- dui框架開發系列:32位和565BMP的ALPHA混合和資源打包UI框架
- 簡單混合運算的計算器
- 能是最快的演算法alpha blend彙編原始碼 (轉)演算法原始碼
- 【混合雲小知識】混合雲四種形式簡單說明
- MD5演算法16位與32位的區別演算法
- 求平方根的兩種簡單演算法 (轉)演算法
- react16.7.0-alpha hooks的api介紹ReactHookAPI
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- 一個簡單實用的 vb 加密/解密演算法 (轉)加密解密演算法
- Flutter 混合開發實戰問題記錄(二)自定義簡單的混合棧路由Flutter路由
- 簡單演算法演算法
- 16位簡單ASM題的記錄——[HGAME 2022 week1]easyasmASMGAM
- 身份證15位升18位的演算法 (轉)演算法
- 位運算簡單操作
- 10進位制和16進位制互轉的例子
- Reactv16.7.0-alpha.2 Hooks學習ReactHook
- [譯] React 16.3(.0-alpha) 新特性React
- Oracle建立自增欄位方法-ORACLE SEQUENCE的簡單介紹(轉帖)Oracle
- 簡單排序演算法排序演算法
- 16進位制字串轉位元組字串
- 2/8/16轉10進位制
- 簡單裝系統打造64位系統萬能映象(轉)
- 對CAS演算法的簡單理解演算法
- 簡單的幾個排序演算法排序演算法
- RSA加密演算法的簡單案例加密演算法
- 簡單的java遞迴演算法Java遞迴演算法
- A*演算法的簡單實現薦演算法
- PCMark04的簡單演算法演算法
- shell 中轉換16進位制10進位制
- 字串和16進位制字串的相互轉化字串
- JavaScript 進位制轉換(2進位制、8進位制、10進位制、16進位制之間的轉換)JavaScript
- Alpha上安裝Linux(轉)Linux
- 簡單管理的核心真理(轉)