颜色混合

作者: 黑眼豆豆_ | 来源:发表于2020-07-14 11:18 被阅读0次

假定一个场景,在OpenGL中,我们需要在一张图层中添加一个透明度为30%的图层,这种情况我们应该怎么做呢?


image.png

如上图的这个例子,假如红色、绿色都是半透明的,叠在一起,为啥会出现这个情况?这个情况就是混合。

概念

混合是指两种颜色的叠加方式。通俗的讲,就是把某一像素位置上原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
如上图的例子,在A像素点原本是红色填充,现在有一个绿色的、半透明的图层要遮盖在上面,这个时候就需要开启混合,重新计算出新的颜色。

  • 目标颜色,已经存储在颜色缓冲区的颜色值,比如图中的红色所代表的值。(这个目标与我们通常理解的目标有出入,不要混淆)
  • 源颜色,作为当前渲染命令结果进入颜色缓冲区的颜色值,比如图中新加入的绿色所代表的值。
  • 混合方程式,当开启混合时,源颜色和目标颜色的组合是方程式控制的。如下:
//Cf :最终计算参数的颜⾊
//Cs : 源颜⾊
//S:源混合因⼦
//Cd :⽬标颜⾊
//D:⽬标混合因⼦
Cf = (Cs * S) + (Cd * D)

设置混合因子,需要用到glBlendFunc函数:

//S:源混合因⼦
//D:⽬标混合因⼦
glBlendFunc(GLenum S, GLenum D);
函数 RGB混合因子 ALPHA混合因子
GL_ZERO (0,0,0) 0
GL_ONE (1,1,1) 1
GL_SRC_COLOR (Rs,Gs,Bs) As
GL_ONE_MINUS_SRC_COLOR (1,1,1)-(Rs,Gs,Bs) 1-As
GL_DST_COLOR (Rd,Gd,Bd) Ad
GL_ONE_MINUS_DST_COLOR (1,1,1)-(Rd,Gd,Bd) 1-Ad
GL_SRC_ALPHA (As,As,As) As
GL_ONE_MINUS_SRC_ALPHA (1,1,1)-(As,As,As) 1-As
GL_DST_ALPHA (Ad,Ad,Ad) Ad
GL_ONE_MINUS_DST_ALPHA (1,1,1)-(Ad,Ad,Ad) 1-Ad
GL_CONSTANT_COLOR (Rc,Gc,Bc) Ac
GL_ONE_MINUS_CONSTANT_COLOR (1,1,1)-(Rc,Gc,Bc) 1-Ac
GL_CONSTANT_ALPHA (Ac,Ac,Ac) Ac
GL_ONE_MINUS_CONSTANT_ALPHA (1,1,1)-(Ac,Ac,Ac) 1-Ac

表中R、G、B、A 分别代表 红、绿、蓝、alpha。
表中下标S、D,分别代表源、⽬标
表中C 代表常量颜⾊(默认⿊⾊)

举个例子,我们用以下这个公式,

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

还是拿上图来说,目标颜色是红色(1.0,0.0,0.0,1.0),源颜色是半透明的绿色(0.0,1.0,0.0,0.5),那么公式如下:

Cd(目标颜色) = (1.0,0.0,0.0,1.0);
Cs(源颜色) = (0.0,1.0,0.0,0.5);
S = 源Alpha值 = 0.5f;
D = 1 - 源alpha值= 1-0.5f = 0.5f
Cf = (红色 * 0.5f) + (绿色 * 0.5f)

用法

  • 开启混合
    //1.开启混合
    glEnable(GL_BLEND);
    //2.开启组合函数 计算混合颜色因子
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  • 关闭混合
    //关闭混合
    glDisable(GL_BLEND);

相关文章

  • OpenGL颜色混合原理

    这就是颜色混合 一。什么情况下会用到颜色混合:1.在固定着色器或者可编程着色器中,开启颜色混合(glEnable(...

  • OpenGL --混合、多重采样

    颜色混合 在OpenGL中使用glEnable(GL_BlEND)来开启颜色混合。目标颜色:已经存储在颜色缓存区的...

  • 十二 浅析OpenGL的颜色混合

    1 颜色混合效果 2 什么情况下使用 在固定着色器或者可编程着色器中,开启颜色混合(glEnable(GL_Bl...

  • OpenGL(4)颜色混合

    为什么要颜色混合?当2个重叠的图层,上面图层是半透明的话,那我们看到的颜色就是上面图层和下面图层的颜色混合的结果。...

  • 颜色混合

    假定一个场景,在OpenGL中,我们需要在一张图层中添加一个透明度为30%的图层,这种情况我们应该怎么做呢? 如上...

  • 颜色混合

    设计给了一个需求,需要在图片的点击态下增加 10%的黑色遮罩。并且只在有 alpha 通道的像素增加。于是需要进行...

  • 色彩混合

    把不同的颜色混合起来,会形成另外的颜色,这就是所谓的混色。一般使用三种颜色进行混合。混色法根据颜色混合后会变亮还是...

  • CGBlendMode研究

    BlendMode颜色混合模式枚举值 https://blog.csdn.net/qq_14920635/arti...

  • glBlendFunc颜色混合

    混合是什么呢?混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混...

  • 3.5 颜色混合

    我们把OpenGL渲染时会把颜⾊色值存在颜⾊缓存区中,每个片段的深度值也是放在深度缓冲区。当深度 缓冲区被关闭时,...

网友评论

    本文标题:颜色混合

    本文链接:https://www.haomeiwen.com/subject/cfcxhktx.html