转自:http://kingcent.wikispaces.com/OpenGL%E8%9E%8D%E5%90%88?showComments=1
如果一个像素的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) |
常 量 | 最终目标因子 |
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) |
设融合的源因子为(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融合技术绘制三维物体的步骤:启动深度测试;绘制不透明物体;设置深度缓存为只读式,
并启动融合;绘制透明物体;恢复深度缓存的可读写属性.