Alpha 混合 兩個半透明色的疊加

2021-04-19 00:38:00 字數 824 閱讀 4889

講 alpha 混合的文章太多了,我並不是要說有什麼新的更好的演算法,而是這些 alpha 混合的文章都是基於一種特定的現實應用:在背景色上疊加乙個半透明色。而 openpainter 的需求更具一般性:混合兩個半透明顏色。也就是說,原始色也是有透明度的。

為此我首先用 ps 做了不少試驗,試圖推導出 alpha 混合的公式。事實上,一些簡單的實驗外加一些邏輯推理,成功了找到了 alpha 混合的方法。這裡為了計算上的方便,所有顏色分量值的取值範圍都是 0 ~ 1。

首先是透明度值的計算。顏色在本質上是光的產物,如果把透明度理解為玻璃的透光性,則一切就變得非常簡單。例如乙個 alpha = 0.2 的顏色,就可以將其想像為透光率為 80% 的彩色玻璃。我們透過這塊玻璃看去,由於 80% 的光都透過了,因此留下來的顏色只剩 20%,即所謂 0.2 的 alpha。現在我們來做乙個混合:將 alpha 為 0.2 和 0.6 的顏色進行疊加。這時,我們有了兩塊玻璃,一塊透光率為 80%,另一塊為 40%。一道光束穿過,經過 80% 透光率的玻璃時,光線強度剩下 80%,再經過 40% 透光率的玻璃時,光線進一步被削弱,只剩下 80% * 40% = 32%。這意味著有 32% 的透明性,即 alpha = 0.68。

總結上面的演算法,我們可以得出:

那麼,我們可以通過在背景色上疊加兩個半透明顏色的不同方法來進行公式推導。第一種疊加方式:先在背景色上疊上第乙個半透明顏色,再在疊好的結果上疊上第二個半透明顏色;第二種方式則是先將兩個半透明顏色疊好,再與背景色混合。即:

這兩種混合方式的結果應當是完全一致的,則有

整理,得

這即是 rgb 模式下的 alpha 混合公式。對於 cmyk 等其他模式,也可以用相似的方式推導。

兩個頁面的Alpha混合C 原始碼

hresult ddrval ddrval lpbackbuffer bltfast 0,0,lpddsone,rc,ddbltfast wait 背景位圖傳送到後台緩衝區 if ddrval dd ok ddsu cedesc ddsd,ddsd2 zeromemory ddsd,sizeof d...

Direct3D進行Alpha混合實現半透明效果

這次給大家奉獻的是我最近學習directx基礎的一些內容 進行alpha混合。雖然我在很多的遊戲中看到了美輪美奐的半透明效果,但是能夠自己製作出半透明的效果還是一件非常欣慰的事情。因為這不僅僅是自己目的的達成,還是自己自學能力的提公升。alpha是畫素顏色中的乙個值,但是改變它並不能改變任何顏色,而...

MIDP2 0下處理Alpha通道產生半透明效果

遊戲中經常會用到半透明效果。但midp1.0年代似乎只有nokia和lg兩家的擴充套件api給出了可以處理alpha通道的api。在midp2.0下,我們可以用image類提供的方法得到乙個的半透明版本。try catch ioexception e int argb new int image.g...