介绍OpenGL glBlendFunc参数
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_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR 等。在OpenGL旧版本中,前两个只能用于设置目标因子,后两个只能用于设置源因子。新版本的OpenGL没有此限制,还支持新的 GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、GL_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)$,结果为黄色。
源颜色和目标颜色与绘制顺序的关系
源颜色和目标颜色与绘制顺序有关。若先绘制红色物体,再在其上绘制绿色物体,则绿色是源颜色,红色是目标颜色;若顺序相反,则红色是源颜色,绿色是目标颜色。在绘制时,应注意顺序,确保源颜色与设置的源因子对应,目标颜色与设置的目标因子对应,避免因顺序混乱导致错误。