混合用来实现半透明。但其实它也是十分灵活的,通过不同的设置得到不同的混合结果,产生一些有趣或者奇怪的图象。
混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
注意:只有在RGBA模式下,才可以使用混合功能,颜色索引模式下是无法使用混合功能的。
1、混合功能开关
glEnable(GL_BLEND); //打开混合功能
glDisable(GL_BLEND); //关闭混合功能
2、源因子和目标因子
把源颜色和目标颜色各自取出,各自乘以各自的系数之后再相加,这样就得到了新的颜色。
源1:(R1, G1, B1, A1)
源2:(R2, G2, B2, A2)。
合成的新颜色(Rn, Gn , Bn ,An):
Rn = R1Sr+R2Dr
Gn = G1Sg+G2Dg
Bn = B1Sb+B2Db
An=A1Sa+A2Da
混合函数:
void glBlendFunc (GLenum sfactor, GLenum dfactor);
常用参数:
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值来作为因子。
3、源码演示
void Step8_Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glColor4f(1, 0, 0, 0.5);
glRectf(-0.5, -0.8, 0.5, 0.8);
glColor4f(0, 1, 0, 0.5);
glRectf(0.2, 0.2, 1, 1);
glutSwapBuffers();
}
运行效果:
4、工程项目下载
在Debug–x86模式下编译