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。
相关推荐
OpenGL3.3_Blend_AlphaBlend.rar
OpenGL3.3_Blend_DiscardFragment.rar
个人博客中关于学习Opengles的第七篇文章中讲解ALpha Blend的源代码
这是一个 .blend 阅读器程序例如,它读取一个 .blend 文件并有可能在 openGL 中呈现它。 当你玩游戏时,它非常方便:)特征支持网格加载网格有自己的动画 ipo 完全支持多材质到网格网格顶点组对象翻译工作一次读取一个...
opengl 反走样,对学习计算机图形学非常有用,多多支持
演示Opengl纹理混合的技术。简单明了,经过代码优化。
此资源是演示程序,可以免费下载。 ---------------------------------------- 有很久都没有使用OpenGL了。...在OpenGL中则是这么写: glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
opengl中的混合的例子,使用glEnable(GL_BLEND)和glBlendFunc(source, destination) 来控制混合的模式等
VS2015/x64演示了OpenGL透明效果,本实例是三维实体绘制透明演示
Blend Modes Section 19.7. Convolution Section 19.8. Summary Section 19.9. Further Information Chapter 20. RealWorldz Section 20.1. Features Section 20.2. RealWorldz Internals Section 20.3. ...
OpenGL实例编程精粹,包括BasicGraphics,3DGraphics,Light,Texture,Blend,3DSLoad
// 初始化OpenGL void InitGL(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //设置黑色背景 glClearDepth(2.0f); // 设置深度缓存 glEnable(GL_DEPTH_TEST); //启动深度测试 glDepthFunc(GL_LEQUAL); //深度...
289 ■Chapter 10: OpenGL ES 2, Shaders, and...................................................... 307 ■Index... .........................................................................................
项目中现有的功能模块 1,fbo文件下 使用帧长度,使用一个纹理作为帧缓冲的颜色长度 注意:安卓的纹理的原点是在左上角,fbo的纹理的原点是在左下角 2,blend文件下 混合模式的使用 3,light文件下 冯氏光照模型 ...
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_BLEND); glEnable(GL_TEXTURE_2D); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float vertices[5][3]={{0.0f,0.8f,...
cpp-opengl-模型 用法: git submodule init git submodule update mkdir build cd build cmake .. make cd .. ./build/emdconv models/skybox.blend skybox.emd ./build/models WASD +鼠标-移动相机 Z / X...
由于需要用到OpenGL ES 2.0,所以,仅能在真机中测试。可以载入本地相册的照片或者直接拍照后进行照片处理。 测试环境: Eclipse 4.2, Android 3.0 以上。 注意:测试环境并不代表适用环境。
cpp-opengl-lighting 用法: git submodule init git submodule update mkdir build cd build cmake .. make cd .. ./build/emdconv models/skybox.blend skybox.emd ./build/lightingWASD +鼠标-移动相机M-启用/...
实现各种各样图像滤镜(图像处理)效果,多达50多种效果,基本囊括了最常见的图像处理效果。...由于需要用到OpenGL ES 2.0,所以,仅能在真机中测试。可以载入本地相册的照片或者直接拍照后进行照片处理。
包括可以加载 .3ds 和 .blend 文件的 OpenGL 框架。 包括 jPhoneLite、jPBXLite、jfPaint、jfVideo Creator 等许多应用程序。 JF 是 Java/Linux 操作系统的核心:jfLinux.sf.net JF 还用于创建另一个 Minecraft ...