颜色混合理解

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值