`
wsqwsq000
  • 浏览: 675549 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

OpenGL中的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。

 

 

分享到:
评论

相关推荐

    OpenGL3.3_Blend_AlphaBlend.rar

    OpenGL3.3_Blend_AlphaBlend.rar

    OpenGL3.3_Blend_DiscardFragment.rar

    OpenGL3.3_Blend_DiscardFragment.rar

    OpenGLES demo - 7. Alpha Blend

    个人博客中关于学习Opengles的第七篇文章中讲解ALpha Blend的源代码

    BlenderReader:该程序读取 .blend 文件并在 openGL 中渲染网格。 如果你在玩游戏很方便

    这是一个 .blend 阅读器程序例如,它读取一个 .blend 文件并有可能在 openGL 中呈现它。 当你玩游戏时,它非常方便:)特征支持网格加载网格有自己的动画 ipo 完全支持多材质到网格网格顶点组对象翻译工作一次读取一个...

    opengl中多边形反走样

    opengl 反走样,对学习计算机图形学非常有用,多多支持

    multi-texture-blend.zip_blend texture opengl_opengl texture jpg_

    演示Opengl纹理混合的技术。简单明了,经过代码优化。

    OpenGL的Alpha混合(演示程序)

    此资源是演示程序,可以免费下载。 ---------------------------------------- 有很久都没有使用OpenGL了。...在OpenGL中则是这么写: glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

    gl_blend.zip_Destination_blending textures_gl blend_gl blend 例子

    opengl中的混合的例子,使用glEnable(GL_BLEND)和glBlendFunc(source, destination) 来控制混合的模式等

    OpenGL透明效果源码

    VS2015/x64演示了OpenGL透明效果,本实例是三维实体绘制透明演示

    OpenGL Shading Language, Second Edition

    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实例编程精粹 之摄像机

    OpenGL实例编程精粹,包括BasicGraphics,3DGraphics,Light,Texture,Blend,3DSLoad

    opengl的太阳系模型

    // 初始化OpenGL void InitGL(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //设置黑色背景 glClearDepth(2.0f); // 设置深度缓存 glEnable(GL_DEPTH_TEST); //启动深度测试 glDepthFunc(GL_LEQUAL); //深度...

    OpenGL+ES+.pdf

    289 ■Chapter 10: OpenGL ES 2, Shaders, and...................................................... 307 ■Index... .........................................................................................

    OpenGlDome:OpenGl的使用练习(安卓Java opengl3.0)

    项目中现有的功能模块 1,fbo文件下 使用帧长度,使用一个纹理作为帧缓冲的颜色长度 注意:安卓的纹理的原点是在左上角,fbo的纹理的原点是在左下角 2,blend文件下 混合模式的使用 3,light文件下 冯氏光照模型 ...

    openGL程序

    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-models

    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...

    GPUImage for Android.zip

    由于需要用到OpenGL ES 2.0,所以,仅能在真机中测试。可以载入本地相册的照片或者直接拍照后进行照片处理。   测试环境: Eclipse 4.2, Android 3.0 以上。 注意:测试环境并不代表适用环境。  

    cpp-opengl-lighting

    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多种效果

    实现各种各样图像滤镜(图像处理)效果,多达50多种效果,基本囊括了最常见的图像处理效果。...由于需要用到OpenGL ES 2.0,所以,仅能在真机中测试。可以载入本地相册的照片或者直接拍照后进行照片处理。

    JavaForce:Java开发框架-开源

    包括可以加载 .3ds 和 .blend 文件的 OpenGL 框架。 包括 jPhoneLite、jPBXLite、jfPaint、jfVideo Creator 等许多应用程序。 JF 是 Java/Linux 操作系统的核心:jfLinux.sf.net JF 还用于创建另一个 Minecraft ...

Global site tag (gtag.js) - Google Analytics