[OpenGL]混合

2020/8/21 posted in  音视频 总阅读量

混合


如上图所示,绿色色块有一定透明度,红色色块在移动到绿色色块下时,重叠部分的颜色进行了混合,变成了一个比较脏的颜色。混合功能在OpenGL中默认是关闭的,我们需要开启GL_BLEND来启用混合功能:

glEnable(GL_BLEND);

开启混合后,还需要告诉OpenGL混合的计算方式,OpenGL以下面的方程进行混合:

Cf = (Cs * S) + (Cd * D)
  • Cf: 混合色,最终计算出来的颜色
  • Cs: 源颜色向量,作为当前渲染命令结果进入颜色缓冲区的颜色值,上图的红色就是源颜色向量。
  • S:目标颜色向量,已经存储在颜色缓冲区的颜色,上图的绿色就是目标颜色向量。
  • Cd: 源混合因子,设置了对源颜色的alpha值影响。
  • D: 目标混合因子,设置了对目标颜色的alpha值影响。

在上面的公式中,源颜色和目标颜色会自动被OpenGL设置,而源混合因子和目标混合因子可以让我们自由设置。如上图,我们是在红色方块(1.0, 0.0, 0.0, 1.0)上绘制绿色方块(0.0, 1.0, 0.0, 0.6),红色方块会成为目标颜色(它先进入颜色缓冲),然后在红色方块上绘制绿色方块,绿色方块则是源颜色。

我们暂时先把绿色方块的alpha值0.6作为源混合因子,1 - 0.6作为目标混合因子,代入公式,方程将变成:

我们通过glBlendFunc函数来告诉OpenGL如何使用因子

// S: 源混合因子
// D: 目标混合因子
glBlendFunc(GLenum S, GLenum D);

OpenGL为我们定义了很多选项,调用的时候使用相应的即可。

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

我们打算把源颜色的alpha给源因子,1−alpha给目标因子。调整到glBlendFunc之后就像这样:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

混合方程

上面我们使用的是默认的混合计算方程

Cf = (Cs * S) + (Cd * D)

除了默认的混合方程,我们还有以下5种可以选择

通过调用函数glbBlendEquation进行切换。

// model: 上图中的模式一列
glbBlendEquation(GLenum mode);