OpenGL实战教程(9) -- 第八站:颜色混合

混合用来实现半透明。但其实它也是十分灵活的,通过不同的设置得到不同的混合结果,产生一些有趣或者奇怪的图象。
混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
注意:只有在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模式下编译

下载项目源文件

发布了30 篇原创文章 · 获赞 9 · 访问量 912

猜你喜欢

转载自blog.csdn.net/x879014419/article/details/105222481