幾種常用的畫素混合方法

2021-03-31 12:45:35 字數 1637 閱讀 9021

前兩天為大家介紹了處理透明光影效果的 alpha-blending 技術,今次我將再為大家介紹其它幾種常用的畫素混合方法,這些方法一般在遊戲中被用來處理光影效果。

『alpha-blending』

前次已經說了,所謂 alpha-blending,其實就是按照「alpha」混合向量的值來混合源畫素和目標畫素,一般用來處理半透明效果。

『additive-blending』

至於 additive-blending,就是用飽和相加的方法來混合源畫素和目標畫素的顏色分量。一般用來處理光源,比如說**的火光等等。下面就來看看兩個畫素間的 additive-blending 過程。

第一步,先把源畫素和目標畫素的 rgb 三個顏色分量分離,然後把對應顏色分量相加,如果某分量的結果超出了該分量的最大值,則對該分量作飽和運算(即如果結果超出了允許的最大值則取結果為允許的最大值),最後把三個顏色分量重新合成為乙個畫素輸出。

在這個過程中,為了分離畫素中的 rgb 三個顏色分量,我們一般會使用掩膜的方法。至於具體的三個掩膜值:rmask、gmask 和 bmask,可以從 directdraw 中的 ddpixelformat 返回得到(當然,你也可以根據自己的需要做各種靈活處理)。

在下面給出的說明性例程中,我們假設 rmask、gmask 和 bmask 已經存放的是 rgb 三個顏色分量的位掩膜值,三個顏色分量的最大值為 255,而 source 和 dest 是指向源畫素和目標畫素的指標。

unsigned long tdest = 0;

unsigned long t;

t = (*source & rmask) + (*dest & rmask);

if(t > rmask) t = rmask;

tdest |= t;

t = (*source & gmask) + (*dest & gmask);

if(t > gmask) t = gmask;

tdest |= t;

t = (*source & bmask) + (*dest & bmask);

if(t > bmask) t = bmask;

tdest |= t;

*dest = (unsigned short)tdest;

這段**使用了乙個小技巧來處理飽和運算,即結果用位掩膜值來衡量是否要作飽和運算處理。

『subtractive-blending』

同 additive-blending 正好相反,subtractive-blending 就是用飽和相減的方法來混合源畫素和目標畫素的顏色分量。freemind 很喜歡用它來處理陰影,用這種方法處理出來的陰影效果能夠很自然地同環境相融合。

至於 subtractive-blending 的處理過程,同 additive-blending 很類似,我就不羅嗦了。唯一要注意的是當用目標畫素的顏色分量減去源畫素的顏色分量時,如果結果小於允許的最小值則結果取為允許的最小值(通常為零)。

『其它混合方法』

玩過 photoshop 的人都知道,其實畫素間的混合方法還有很多種,比如 multiplicative,divisive,maximum,minimum 等等,但這些方法運算相對較慢,而且遊戲中對這些效果的要求也比較少,所以在實際的遊戲中使用得很少。

如果您還有什麼新的思路和好的想法,不妨也通知俺一聲,好東西也讓大家分享一下嘛,呵呵 :)

OpenCV常用訪問畫素的幾種方式

1.直接用at訪問 2.使用mat 模板子類過載 訪問,需要提前知道影象型別 cv mat img image img j,i cv vec3b 注意1 此處的 j,i 並不是座標,是訪問的第j行第i列的畫素。注意2 使用at方法訪問較慢,宜用於隨機訪問,而非迴圈。得到第j行畫素首位址的指標 for...

Web前端繪製0 5畫素的幾種方法

最近完成了公司安排的移動web觸屏開發,期間涉及到在移動裝置上顯示線條,最開始採用pc常用的css board屬性來顯示1個畫素的線條,但是發現在移動裝置上並不美觀,參考 京東的觸屏發現它們均是採用淺細的線條來顯示在移動裝置上。以下紀錄了比較方便的4種繪製0.5畫素線條方式 一 採用meta vie...

同步的幾種常用方法

最簡單的執行緒同步的例子 本文,旨在 幾種常用的同步的方法 本文的同步指對於一點程式乙個時間點只有乙個程式在執行,必須乙個執行完了,另乙個才能執行。1.物件同步 同一例項 成員方法同步 public class mytestthread extends thread catch interrupte...