融合是将两个或两个以上的物体或图像进行叠合最后生成新物体或一张图像的过程,最主要的方法是Alpha通道技术,Alpha通道是指在24位真彩色图像上加上另外8位信息,用它来描述256级不同的透明度数值。两个物体的融合,是通过目标物体和原物体颜色的组合产生新颜色的过程。
如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。
将要画上去的颜色称为“源颜色”,受“源因子”影响;原来的颜色称为“目标颜色”,受“目标因子”影响。
在OpenGL中,要进行融合处理,首先要生成用于融合计算的两个因之,一个是源因子,一个是目标因
子。完成此功能的函数是glBlendFunc()
void glBlendFunc(GLenum sfactor,GLenum dfactor);
sfactor说明如何计算源因子; dfactor说明如何计算目标因子;
Sfactor的取值
常量 | 最终源因子 |
GL_zero | (0,0,0,0) |
GL_one | (1,1,1,1) |
GL_DST_COLOR | (Rd,Gd,Bd,Ad) |
GL_ONE_MINUS_DST_COLOR | (1,1,1,1)-( Rd,Gd,Bd,Ad) |
GL_SRC_ALPHA | (As,As,As,As) |
GL_ONE_MINUS_SRC_ALPHA | (1,1,1,1)-(As,As,As,As) |
GL_DST_ALPHA | (Ad,Ad,Ad,Ad) |
GL_ONE_MINUS_DST_ALPHA | (1,1,1,1)-(Ad,Ad,Ad,Ad) |
GL_SRC_ALPHA_SATURATE | (f,f,f,1) |
Dfactor的参数取值
常 量 | 最终目标因子 |
GL_ZERO | (0,0,0,0) |
GL_ONE | (1,1,1,1) |
GL_SRC_COLOR | (Rs,Gs,Bs,As) |
GL_ONE_MINUS_SRC_COLOR | (1,1,1,1)-(Rs,Gs,Bs,As) |
GL_SRC_ALPHA | (As,As,As,As) |
GL_ONE_MINUS_SRC_ALPHA | (1,1,1,1)-(As,As,As,As) |
GL_DST_ALPHA | (Ad,Ad,Ad,Ad) |
GL_ONE_MINUS_DST_ALPHA | (1,1,1,1)- (Ad,Ad,Ad,Ad) |
假设源物体的一个点的颜色值为(0.7,0.6,0.8,0.6),目标物体在同一个点的颜色值为(0.4,0.3,0.6,1.0);OpenGL首先获得源物体颜色向量中的Alpha值,为0.6,用它作为融合的源因子,然后用它乘以源物体的颜色向量,得(0.42,0.36,0.48,0.36);通过GL_ONE_MINUS_SRC_COLOR获得用于融合的目标因子,1-0.6=0.4,然后用它乘以目标物体的颜色向量,得(0.16,0.12,0.24,0.4);最后将两个颜色向量相加获得最终的颜色(0.58,0.48,0.72,0.76).
设融合的源因子为(Rs,Gs,Bs,As),融合的目标因子为(Rd,Gd,Bd,Ad),原物体的颜色为(Sr,Sg,Sb,Sa),
目标物体在同一点的颜色为(Dr,Dg,Db,Da),最后融合的颜色为:
(Rs*Sr+Rd*Dr,Gs*Sg+Gd*Dg,Bs*Sb+Bd*Db,As*Sa+Ad*Da)
OpenGL通过glEnable(GL_BLEND)、glDisable(GL_BLEND)启动和关闭功能
要制作三维的透明物体,简单地启动融合功能和给定融合因子是不够的,因为三维物体间有其位置的
相互关系,体现这种关系的是物体离视点的远近。
一般来说应当先画不透明的物体,因为透明物体的绘制需要OpenGL的融合功能,但是融合功能一旦启
动,就会影响整个后继物体的着色。OpenGL一旦画完不透明物体就立即将深度缓存进行屏蔽,避免了已绘制的不透明物体的深度信息被破坏。
应用OpenGL融合技术绘制三维物体的步骤:启动深度测试;绘制不透明物体;设置深度缓存为只读式,
并启动融合;绘制透明物体;恢复深度缓存的可读写属性.