Pangolin中opengl的混合(gl_blend)
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)的更多相关文章
- 在Qt(C++)中与Python混合编程
一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读 ...
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类 ...
- asp.net 4.0+ webform 程序中集成mvc4混合应用
vs2015之后新建web站点可以很轻松的搭建mvc与webform的混合应用,vs2012下其实也可以通过简单的几部也可以实现,具体如下: 1.新建packages.config文件,里面加上必要的 ...
- IOS 中openGL使用教程3(openGL ES 入门篇 | 纹理贴图(texture)使用)
在这篇文章中,我们将学习如何在openGL中使用纹理贴图. penGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类.由于本文将以一张图片为例,因此我们为我们的纹理对象 ...
- IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)
在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...
- IOS 中openGL使用教程1(openGL ES 入门篇 | 搭建openGL环境)
OpenGL版本 iOS系统默认支持OpenGl ES1.0.ES2.0以及ES3.0 3个版本,三者之间并不是简单的版本升级,设计理念甚至完全不同,在开发OpenGL项目前,需要根据业务需求选择合适 ...
- vc中openGL的安装
安装过程: 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的.但这里我们 ...
- Qt中OpenGL的初步使用
结果预览: 一.代码5个文件 //glwidget.h #ifndef GLWIDGET_H #define GLWIDGET_H #include <QGLWidget> class G ...
随机推荐
- Lambda模式
Class TestPatterns '<<1.Self-Defining Functions-自定义函数>> Public Shared Sub SelfDefining() ...
- 新版本的body-parser中间件和morgan中间件引用问题:body-parser deprecated bodyParser和morgan deprecated morgan(options)
引用新版本的body-parser中间件和morgan中间件时,报如下问题: Fri, 09 Jan 2015 06:32:04 GMT morgan deprecated morgan(option ...
- WebService之JDK中wsimport命令
1.编写WebService类,使用@WebService注解 package test; import javax.jws.WebService; @WebService public class ...
- video标签 api
video 设置及控制:http://www.w3school.com.cn/tags/html_ref_audio_video_dom.asp video 事件:http://www.w3schoo ...
- js精准时间迭代器(定时器)
/** * 精准时间迭代器 * Create By Tujia @2017.05.22 * * 使用示例: * window.setMyInterval(function(){ * console.l ...
- Apache安全配置基线指导
搜索关键词:Apache安全配置基线指导 参考链接: windows服务器下Apache 的降权 https://www.landui.com/help/show-1749.html
- unity3d抛物线的脚本
using UnityEngine; using System.Collections; public class ProjectileTest : MonoBehaviour { public Ga ...
- 【大数据系列】hadoop2.0中的jobtracker和tasktracker哪里去了
低版本的hadoop下MapReduce处理流程 1.首先用户程序(JobClient)提交了一个job,job的信息会发送到Job Tracker,Job Tracker是Map-reduce框架的 ...
- jQuery的回调管理机制
// 对option的一个缓存,避免每次都需要createOptions,option是创建Callback对象时的传入的参数// 每个option被存入optionsCache中类似于{memory ...
- hbuilder在android手机里用chrome调试,只显示了设备名称,却没有inspect按钮
stark 通过“菜单”->“工具”->“检查设备”打开设备检查页面,只显示了设备名称,却没有inspect按钮,要怎么办 1 赞2014-10-09 22:00 ============ ...