OpenGL融合

转自:http://kingcent.wikispaces.com/OpenGL%E8%9E%8D%E5%90%88?showComments=1




融合是将两个或两个以上的物体或图像进行叠合最后生成新物体或一张图像的过程,最主要的方法是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融合技术绘制三维物体的步骤:启动深度测试;绘制不透明物体;设置深度缓存为只读式,
并启动融合;绘制透明物体;恢复深度缓存的可读写属性.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压缩包中包含的具体内容: 对给定数据中的6个不同场景图像,进行全景图拼接操作,具体要求如下: (1) 寻找关键点,获取关键点的位置和尺度信息(DoG检测子已由KeypointDetect文件夹中的detect_features_DoG.m文件实现;请参照该算子,自行编写程序实现Harris-Laplacian检测子)。 (2) 在每一幅图像中,对每个关键点提取待拼接图像的SIFT描述子(编辑SIFTDescriptor.m文件实现该操作,运行EvaluateSIFTDescriptor.m文件检查实现结果)。 (3) 比较来自两幅不同图像的SIFT描述子,寻找匹配关键点(编辑SIFTSimpleMatcher.m文件计算两幅图像SIFT描述子间的Euclidean距离,实现该操作,运行EvaluateSIFTMatcher.m文件检查实现结果)。 (4) 基于图像中的匹配关键点,对两幅图像进行配准。请分别采用最小二乘方法(编辑ComputeAffineMatrix.m文件实现该操作,运行EvaluateAffineMatrix.m文件检查实现结果)和RANSAC方法估计两幅图像间的变换矩阵(编辑RANSACFit.m 文件中的ComputeError()函数实现该操作,运行TransformationTester.m文件检查实现结果)。 (5) 基于变换矩阵,对其中一幅图像进行变换处理,将其与另一幅图像进行拼接。 (6) 对同一场景的多幅图像进行上述操作,实现场景的全景图拼接(编辑MultipleStitch.m文件中的makeTransformToReferenceFrame函数实现该操作)。可以运行StitchTester.m查看拼接结果。 (7) 请比较DoG检测子和Harris-Laplacian检测子的实验结果。图像拼接的效果对实验数据中的几个场景效果不同,请分析原因。 已经实现这些功能,并且编译运行均不报错!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值