颜色混合理解
1、概念:
“混合”是指兩種顏色的疊加方式。在新圖片將要渲染畫到屏幕上的時候,將用在新圖片中的紅、綠、藍和透明度信息(RGBA),與屏幕上已經存在的圖片顏色信息相融合。(只會改變新圖片的大小范圍內)
“源顏色”:即新圖片的顏色碼(因為就是以新圖片為對象,進行渲染)
”目標顏色“:屏幕上已存在的圖片顏色(新圖片的大小范圍內的屏幕顏色,其他范圍不受影響)
OpenGL會把源顏色和目標顏色各自取出,并乘以一個系數
“源因子”:源顏色乘以的系數稱為“源因子”
“目標因子”:目標顏色乘以的系數稱為“目標因子”
2、計算公式
假設:顏色信息的四個分量(紅,綠,藍,透明度)
(1)“源顏色” :(Rs, Gs, Bs, As)
(2)“目標顏色”:(Rd, Gd, Bd, Ad)
(3)“源因子” :(Sr, Sg, Sb, Sa)
(4)“目標因子”:(Dr, Dg, Db, Da)
那么混合產生的新顏色可以表示為:
(RsSr + RdDr , GsSg + GdDg , BsSb + BdDb , AsSa + AdDa)
常見的混合因子
GL_ZERO 全部不用 (0 , 0 , 0 , 0)
GL_ONE 全部使用 (1 , 1 , 1 , 1)
GL_SRC_COLOR 使用源顏色 (Rs , Gs , Bs , As)
GL_DST_COLOR 使用目標顏色 (Rd , Gd , Bd , Ad)
GL_ONE_MINUS_SRC_COLOR 減去源顏色 (1-Rs , 1-Gs , 1-Bs , 1-As)
GL_ONE_MINUS_DST_COLOR 減去目標顏色 (1-Rd , 1-Gd , 1-Bd , 1-Ad)
GL_SRC_ALPHA 使用源顏色的透明度 (As , As , As , As)
GL_DST_ALPHA 使用目標顏色的透明度 (Ad , Ad , Ad , Ad)
GL_ONE_MINUS_SRC_ALPHA 減去源顏色的透明度 (1-As , 1-As , 1-As , 1-As)
GL_ONE_MINUS_DST_ALPHA 減去目標顏色的透明度 (1-Ad , 1-Ad , 1-Ad , 1-Ad)
使用方法
(平時使用需要加畫布,不然背景也會進行混合)
local node = D.imgc(“g/button/btn_play.png”):to(layer)
node:setBlendFunc(”源因子“,“目標因子”)
默認的混合模式
node:setBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA)
源顏色:全部使用
目標因子:減去源顏色的透明度
我們圖片,才會不顯示透明
利用透明度會有特殊的效果:
通常使用的混合模式
node:setBlendFunc(GL_ONE,GL_ONE)
可以進行顏色的混合(可以達到紅+綠=黃的效果)
缺陷(顏料混合)
(技術難點,RGB轉CMYK,實現不太好,如果成功,可以“為所欲為”)
如:上圖所示(最終混合為白色,這符合光的混合但不符合顏料的混合)
由于光的顏色是RGBA碼,顏料的CMYK碼
首先將CMYK轉成RGBA碼,在屏幕呈現出來(保存CMYK),進行CMYK碼的疊加運算(C = C1+ C2, M = m1 + m2 等,越值處理一下),在建CMYK呈現出來達到顏料的混合效果
青 + 黃變成綠
三基色:疊加變成黑色,不在是白色
CMYK轉RGB的公式
function M:cmytorgb(c,m,y,k)
local node = {}
node.r = 255 (1 - c) (1 - k)
node.g = 255 (1 - m) (1 - k)
node.b = 255 (1 - y) (1 - k)
return cc.c3b(node.r,node.g,node.b)
end
rgb碼轉CMYK碼不太行
function M:rgbtocmy(r,g,b)
local node = {}
local R = r / 255
local G = g / 255
local B = b / 255
local K = 1 - math.max(R,G,B)
node.c = (1 - R - K)/(1 - K)
node.m = (1 - G - K)/(1 - K)
node.y = (1 - B - K)/(1 - K)
node.k = K
return node
end
總結
- 上一篇: 秋招总结
- 下一篇: Java实现bt文件下载、制作、解析、磁