Blend 混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺序会影响到OpenGL的混合处理。

glEnable( GL_BLEND );   // 启用混合

glDisable( GL_BLEND );  // 禁用关闭混合

获得混合的信息

glGet( GL_BLEND_SRC );

glGet( GL_BLEND_DST );

glIsEnable( GL_BLEND );

glBlendFunc( GLenum sfactor , GLenum dfactor );         // 混合函数

sfactor 源混合因子

dfactor 目标混合因子

混合因子枚举

GL_DST_ALPHA

( Ad , Ad , Ad , Ad )

GL_DST_COLOR

( Rd , Gd , Bd , Ad )

GL_ONE

(1,1,1,1)

GL_ONE_MINUS_DST_ALPHA

(1,1,1,1) - (Ad,Ad,Ad,Ad)

GL_ONE_MINUS_DST_COLOR

(1,1,1,1) - (Rd,Gd,Bd,Ad)

GL_ONE_MINUS_SRC_ALPHA

(1,1,1,1) - (As,As,As,As)

GL_SRC_ALPHA

( As , As , As , As )

GL_SRC_ALPHA_SATURATE

(f,f,f,1) : f = min(As,1-Ad)

GL_ZERO

( 0 , 0 , 0 , 0 )

glBlendFunc( GL_ONE , GL_ZERO );        // 源色将覆盖目标色

glBlendFunc( GL_ZERO , GL_ONE );        // 目标色将覆盖源色

glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的

若源色为 ( 1.0 , 0.9 , 0.7 , 0.8 )

源色使用 GL_SRC_ALPHA

即 0.8*1.0 , 0.8*0.9 , 0.8*0.8 , 0.8*0.7

结果为 0.8 , 0.72 , 0.64 , 0.56

目标色为 ( 0.6 , 0.5 , 0.4 , 0.3 )

目标色使用GL_ONE_MINUS_SRC_ALPHA

即 1 - 0.8 = 0.2

0.2*0.6 , 0.2*0.5 , 0.2*0.4 , 0.2*0.3

结果为 0.12 , 0.1 , 0.08 , 0.06

由此而见,使用这个混合函数,源色的α值决定了结果颜色的百分比。

这里源色的α值为0.8,即结果颜色中源色占80%,目标色占20%。

将多边形从远至近排列,并使用以下函数

glBlendFunc( GL_SRC_ALPHA_SATURATE , GL_ONE );

glEnable( GL_POLYGON_SMOOTH );

可以优化多边形反走样;但必须有α位平面,以用来存储累加的覆盖值。

混合 3D 物体

混合 3D 物体时,基本原理和混合2D物体一样,但需要将深度检测关闭或设置为只读。

因为深度检测会剔除被遮挡的部分物体。

glEnable( GL_DEPTH_TEST );          // 启用深度缓存

glDisable( GL_DEPTH_TEST );         // 禁用深度缓存

glDepthMask( GL_FALSE );              // 深度缓存为 只读

glDepthMask( GL_TRUE );               // 深度缓存为 读/写

按以下步骤,可以在 3D 场景中使用混合和深度检测

1、使用深度检测

2、绘制不透明的物体

3、设只读 深度检测

4、绘制半透明的物体

5、设 读/写 深度检测

以下对混合算法进行测试,统一使用glBlendFunc(GL_SRC_ALPHA,GL_ONE);模式。

glClearColor(0.0f,1.0f,0.0f,0.5f);               //绿色背景(目标)、先放入帧缓冲区

glColor4f(1.0f,0.0f,0.0f,0.5f);                    //矩形颜色(源色)、片段

计算结果:

(0.5f, 1.0f,0.0f,0.75f)

绿色背景,红色矩形

   

关闭混合时                        打开混合时            叠加时颜色

结果:

1、背景色也参与混合过程;

2、利用绿色背景测试可得,RGBA中的A值对单一颜色显示没有效果,但混合和

透明是依靠A值计算的;

3、当输入颜色值为RGB时,混合计算时,A值默认为0.0。

参考博文:http://blog.csdn.net/hudfang/article/details/46726465

Pangolin中opengl的混合(gl_blend)的更多相关文章

  1. 在Qt(C++)中与Python混合编程

    一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...

  2. [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型

    [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读 ...

  3. [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

    [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran     在iOS的3D开发中常常需要导入通过3DS MAX之类 ...

  4. asp.net 4.0+ webform 程序中集成mvc4混合应用

    vs2015之后新建web站点可以很轻松的搭建mvc与webform的混合应用,vs2012下其实也可以通过简单的几部也可以实现,具体如下: 1.新建packages.config文件,里面加上必要的 ...

  5. IOS 中openGL使用教程3(openGL ES 入门篇 | 纹理贴图(texture)使用)

    在这篇文章中,我们将学习如何在openGL中使用纹理贴图. penGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类.由于本文将以一张图片为例,因此我们为我们的纹理对象 ...

  6. IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)

    在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...

  7. IOS 中openGL使用教程1(openGL ES 入门篇 | 搭建openGL环境)

    OpenGL版本 iOS系统默认支持OpenGl ES1.0.ES2.0以及ES3.0 3个版本,三者之间并不是简单的版本升级,设计理念甚至完全不同,在开发OpenGL项目前,需要根据业务需求选择合适 ...

  8. vc中openGL的安装

    安装过程: 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的.但这里我们 ...

  9. Qt中OpenGL的初步使用

    结果预览: 一.代码5个文件 //glwidget.h #ifndef GLWIDGET_H #define GLWIDGET_H #include <QGLWidget> class G ...

随机推荐

  1. 马尔科夫链蒙特卡洛(Markov chain Monte Carlo)

    (学习这部分内容大约需要1.3小时) 摘要 马尔科夫链蒙特卡洛(Markov chain Monte Carlo, MCMC) 是一类近似采样算法. 它通过一条拥有稳态分布 \(p\) 的马尔科夫链对 ...

  2. SpringMVC由浅入深day01_5注解的处理器映射器和适配器

    5 注解的处理器映射器和适配器 在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandle ...

  3. ios开发之--UIButton中imageView和titleLabel的位置调整

    在使用UIButton时,有时候需要调整按钮内部的imageView和titleLabel的位置和尺寸.在默认情况下,按钮内部的imageView和titleLabel的显示效果是图片在左文字在右,然 ...

  4. Mybatis数据库连接报错:对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾

    Mybatis数据库连接报错:对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 ============================== 蕃薯耀 ...

  5. 【Python】TF环境

    1.pip show pip 2.python -m pip install --upgrade pip 3.conda list 4.pip install tensorflow 5.pip ins ...

  6. vux ajax请求 及 跨域

    1)使用 AjaxPlugin 插件(在组件里使用) 引入插件 import { AjaxPlugin } from 'vux' 初始化 export default { components: { ...

  7. 如何删除一个CSDN上自己上传的资源

    原文地址:http://www.xuebuyuan.com/1875216.html 昨天晚上进行测试,上传了一个压缩包和大家分享,测试完成后,为了不想给被测试的公司造成伤害,决定把上传的包删除,结果 ...

  8. 第一个map reduce程序

    完成了第一个mapReduce例子,记录一下. 实验环境: hadoop在三台ubuntu机器上部署 开发在window7上进行 hadoop版本2.2.0 下载了hadoop-eclipse-plu ...

  9. async await yield

    问题:async 和yield有什么区别? 无奈只能用“书到用时方恨少”来解释这个问题了.其实也是自己从开始编程就接触的是nodejs中的async 以及await ,yield几乎.貌似好像都没使用 ...

  10. PHP 图片 平均分割

    $filename = 'D://WWW/1.jpg'; $p = 5; // Get new sizes list($width, $height) = getimagesize($filename ...