介绍OpenGL glBlendFunc参数

2015年03月22日 11:27 0 点赞 0 评论 更新于 2025-11-21 18:07

OpenGL混合的基本知识

混合是OpenGL中一种常用的技巧,通常用于实现半透明效果。它十分灵活,通过不同的设置可以得到不同的混合结果,从而产生一些有趣或奇特的图像。

混合的本质是将两种颜色混合在一起,具体来说,是把某一像素位置原来的颜色(目标颜色)和将要绘制上去的颜色(源颜色),通过特定方式混合,以实现特殊效果。

例如,要绘制一个透过红色玻璃看绿色物体的场景,可以先绘制绿色物体,再绘制红色玻璃。在绘制红色玻璃时,利用“混合”功能,将将要绘制的红色与原来的绿色进行混合,得到一种新颜色,使玻璃看起来像是半透明的。

要使用OpenGL的混合功能,只需调用 glEnable(GL_BLEND);若要关闭混合功能,则调用 glDisable(GL_BLEND)。需要注意的是,只有在RGBA模式下才能使用混合功能,颜色索引模式下无法使用。

源因子和目标因子

混合需要找出原来的颜色(目标颜色)和将要绘制的颜色(源颜色),经过处理后得到新颜色。OpenGL会将源颜色和目标颜色分别乘以一个系数,源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”,然后将两者相加得到新颜色。(新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,为简化讨论,这里暂不涉及)

用数学公式表示该运算方式:假设源颜色的四个分量(红色、绿色、蓝色、alpha值)为 $(R_s, G_s, B_s, A_s)$,目标颜色的四个分量为 $(R_d, G_d, B_d, A_d)$,源因子为 $(S_r, S_g, S_b, S_a)$,目标因子为 $(D_r, D_g, D_b, D_a)$,则混合产生的新颜色可表示为 $(R_sS_r + R_dD_r, G_sS_g + G_dD_g, B_sS_b + B_dD_b, A_sS_a + A_dD_a)$。若颜色的某一分量超过1.0,会自动截取为1.0,无需考虑越界问题。

源因子和目标因子可通过 glBlendFunc 函数设置,该函数有两个参数,前者表示源因子,后者表示目标因子。这两个参数有多种取值,下面介绍几种常用的取值。

常用的源因子和目标因子取值

  • GL_ZERO:使用0.0作为因子,实际上相当于不使用该颜色参与混合运算。
  • GL_ONE:使用1.0作为因子,相当于完全使用该颜色参与混合运算。
  • GL_SRC_ALPHA:使用源颜色的alpha值作为因子。
  • GL_DST_ALPHA:使用目标颜色的alpha值作为因子。
  • GL_ONE_MINUS_SRC_ALPHA:用1.0减去源颜色的alpha值作为因子。
  • GL_ONE_MINUS_DST_ALPHA:用1.0减去目标颜色的alpha值作为因子。

此外,还有 GL_SRC_COLOR(将源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLORGL_DST_COLORGL_ONE_MINUS_DST_COLOR 等。在OpenGL旧版本中,前两个只能用于设置目标因子,后两个只能用于设置源因子。新版本的OpenGL没有此限制,还支持新的 GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLORGL_CONST_ALPHAGL_ONE_MINUS_CONST_ALPHA,以及 GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha值和RGB值采用不同的混合因子,但这些内容超出了入门范畴,暂不深入探讨。

不同设置的效果示例

  • glBlendFunc(GL_ONE, GL_ZERO):表示完全使用源颜色,完全不使用目标颜色,画面效果与不使用混合时一致(可能效率稍低)。若未设置源因子和目标因子,默认即为该设置。
  • glBlendFunc(GL_ZERO, GL_ONE):表示完全不使用源颜色,无论想绘制什么,最终都不会显示(但在某些特殊情况下可能有用)。
  • glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA):源颜色乘以自身的alpha值,目标颜色乘以1.0减去源颜色的alpha值。源颜色的alpha值越大,新颜色中源颜色所占比例越大,目标颜色所占比例越小。可将源颜色的alpha值简单理解为“不透明度”,这是混合时最常用的方式。
  • glBlendFunc(GL_ONE, GL_ONE):表示完全使用源颜色和目标颜色,最终颜色是两种颜色的简单相加。例如,红色 $(1, 0, 0)$ 和绿色 $(0, 1, 0)$ 相加得到 $(1, 1, 0)$,结果为黄色。

源颜色和目标颜色与绘制顺序的关系

源颜色和目标颜色与绘制顺序有关。若先绘制红色物体,再在其上绘制绿色物体,则绿色是源颜色,红色是目标颜色;若顺序相反,则红色是源颜色,绿色是目标颜色。在绘制时,应注意顺序,确保源颜色与设置的源因子对应,目标颜色与设置的目标因子对应,避免因顺序混乱导致错误。

作者信息

menghao

menghao

共发布了 3994 篇文章