RGBA alpha 透明度混合演算法

2021-09-08 14:47:51 字數 1503 閱讀 4174

一、 r1,g1,b1,alpha1 為前景顏色值,r2,g2,b2,alpha2 為背景顏色值,則

前景色  r = r1 * alpha1 + r2 * alpha2 * (1-alpha1) ;

g = g1 * alpha1 + g2 * alpha2 * (1-alpha1) ;

b = b1 * alpha1 + b2 * alpha2 * (1-alpha1) ;

背景色 alpha = 1 - (1 - alpha1) * ( 1 - alpha2) ;

r = r / alpha ;

g = g / alpha ;

b = b / alpha ;

二、半透明演算法:

混合演算法目前在常用到的演算法是alphablend。

計算公式如下:假設一幅圖象是a,另一幅透明的圖象是b,那麼透過b去看a,看上去的圖象c就是b和a的混合圖象,

設b圖象的透明度為alpha(取值為0-1,1為完全透明,0為完全不透明).

alpha混合公式如下:

r(c)=(1-alpha)*r(b) + alpha*r(a)

g(c)=(1-alpha)*g(b) + alpha*g(a)

b(c)=(1-alpha)*b(b) + alpha*b(a)

r(x)、g(x)、b(x)分別指顏色x的rgb分量原色值。從上面的公式可以知道,alpha其實是乙個決定混合透明度的數值。

改變這個 alpha 值可以得到乙個漸變的效果。

分離rgb色用"位與"、"移位"運算的方法;

透明的比例按2的n次冪來分級,這樣可以快速運算。

如果是按32級

alpha = 1/32

b圖的權重 = (32-n)/32,則a圖的權重= n/32,

可以得到這樣的演算法:

r(c)= (32-n) * r(b)+ n* r(a);

再對r(c)右移5位(除以32)就可以了

透明的處理:

假設指定b上的黑色透明色,則碰到b上的顏色為黑色,則不顯示黑色,改為顯示a上這個位置的顏色。

三、簡易alpha混合演算法:首先,要能取得上層與下層顏色的 rgb三基色,

然後用r,g,b 為最後取得的顏色值;r1,g1,b1是上層的顏色值;r2,g2,b2是下層顏色值

若alpha=透明度,則

當alpha=50%時,

r = r1/2 + r2/2;

g = g1/2 + g2/2;

b = b1/2 + b2/2;

當alpha<50%時,

r = r1 - r1/alpha + r2/alpha;

g = g1 - g1/alpha + g2/alpha;

b = b1 - b1/alpha + b2/alpha;

當alpha>50%時,

r = r1/alpha + r2 - r2/alpha;

g = g1/alpha + g2 - g2/alpha;

b = b1/alpha + b2 - b2/alpha;

透明度混合

透明度混合 可以實現半透明效果。使用當前片元的透明度作為混合因子,與已經儲存在顏色緩衝中的顏色值進行混合,得到新的顏色。同時需要關閉深度寫入,注意渲染順序問題。混合命令 blend 這個命令在設定的同時也開啟了混合模式,開啟之後才能使用混合。混合是乙個逐片元操作。常用語義 blend off 關閉混...

shader 透明度混合

透明度混合是實現了真正的半透效果。它會以當前片元透明度作為混合因子,與已經儲存在顏色緩衝區中的顏色進行混合,得到新的顏色。同時要關掉深度寫入,小心物體的渲染順序。用blend srcfactor dstfactor來進行混合。這個命令在設定混合因子的同時也開啟了混合模式,否則不會有混合效果,因為開啟...

UnityShader 透明度混合

關閉深度寫入帶來的問題 開啟深度寫入的半透明效果 shaderlab的混合命令 透明度混合 實現 開啟深度寫入的半透明效果 實現 透明度混合可以得到真正的半透明效果。它會使用當前片元的透明度作為混合因子,與已經儲存在顏色緩衝中的顏色值進行混合,得到新的顏色。但是,透明度混合需要關閉深度寫入,這使得我...