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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡單混合運算的計算器
- 【混合雲小知識】混合雲四種形式簡單說明
- 簡單演算法演算法
- Flutter 混合開發實戰問題記錄(二)自定義簡單的混合棧路由Flutter路由
- 簡單排序演算法排序演算法
- 簡單的幾個排序演算法排序演算法
- 對CAS演算法的簡單理解演算法
- 玩轉混合加密加密
- go練手:簡單的單詞格式轉換工具Go
- python hex轉ascii轉換Python程式碼的簡單方法PythonASCII
- 簡單理解Paxos演算法(譯)演算法
- 簡單的量子演算法(二):Simon's Algorithm演算法Go
- pdf轉換word,超簡單!
- 手寫簡單的元件化跳轉Router元件化
- PDF轉文字檔案的最簡單方法
- Anno 讓微服務、混合程式設計更簡單(Net love Java)微服務程式設計Java
- 超級簡單的資料壓縮演算法—LZW演算法演算法
- 實現一個簡單的輪詢演算法演算法
- 實現一個簡單的DOM diff演算法演算法
- 十道簡單演算法題演算法
- [轉]:如何快速構建一個簡單的程式
- Python實現簡單驗證碼的轉文字Python
- 用最簡單的方式理解 IoC 控制反轉
- [轉帖]軟體的Alpha、Beta、GM、OEM、LTS等版本的含義
- Minimax 和 Alpha-beta 剪枝演算法簡介,及以此實現的井字棋遊戲(Tic-tac-toe)演算法遊戲
- 超簡單的,掃描PDF轉換成Word的方法
- 簡單的量子演算法(一):Hadamard 變換、Parity Problem演算法
- 雙指標演算法的一個簡單題解指標演算法
- 一道簡單的分配演算法題,求解演算法
- 演算法學習---歸併演算法簡單記錄演算法
- 簡單理解slot演算法和shadow DOM演算法
- 演算法(3)簡單四則運算演算法
- LeetCode簡單演算法題目-JS解法LeetCode演算法JS
- 用js玩轉Scriptable,超簡單教程JS
- python_pygame_alpha-beta剪枝演算法_玩中國象棋PythonGAM演算法
- keras轉tensorflow lite【方法二】直接轉:簡單模型例項Keras模型
- 轉一篇OpenSSL的例子:簡單的TLS伺服器TLS伺服器
- 有什麼簡單的將caj轉換成Word的方法
- 簡單的css3頭像旋轉與3D旋轉效果CSSS33D