`
wsqwsq000
  • 浏览: 689946 次
  • 性别: 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

    在OpenGL中,我们可以使用`glEnable(GL_BLEND)`开启混合,然后设置`glBlendFunc()`以定义源和目标颜色的组合规则。常见的阿尔法混合公式是`SRC_ALPHA`乘以源颜色加上`ONE_MINUS_SRC_ALPHA`乘以目标颜色,这样可以...

    OpenGL3.3_Blend_DiscardFragment.rar

    总之,“OpenGL3.3_Blend_DiscardFragment.rar”的内容很可能是围绕如何在OpenGL 3.3环境中有效地使用混合和丢弃片段来创建复杂视觉效果的示例或教程。这些技术对于游戏开发、科学可视化和任何需要精细控制像素渲染...

    OpenGLES demo - 7. Alpha Blend

    本文将深入探讨在OpenGL ES中实现Alpha Blend(透明混合)的技术要点。 Alpha Blend是一种图形处理技术,它允许不同不透明度的对象相互叠加,产生半透明或混合的效果。在OpenGL ES中,Alpha Blend通常涉及到颜色...

    Android OpenGL混合(Blend)半透明功能应用演示demo

    Android OpenGL混合Blend功能应用演示demo 1、Blend混合半透明功能 详解如下: https://blog.csdn.net/github_27263697/article/details/141888912 2、开发工具android studio 3、开发语言kotlin 4、混合(Blend)概念...

    multi-texture-blend.zip_blend texture opengl_opengl texture jpg_

    在这个"multi-texture-blend.zip"压缩包中,我们关注的是OpenGL的纹理混合技术,它允许开发者在一个像素上同时应用多个纹理,以创建复杂和丰富的视觉效果。这个技术特别适用于游戏、图像编辑软件和其他图形密集型...

    opengl中多边形反走样

    OpenGL中的多边形反走样是一种重要的技术,用于提高计算机图形的质量,特别是在显示复杂几何形状时。反走样(Antialiasing)的主要目的是消除或减少图像中的锯齿边缘,使得图像看起来更加平滑和自然。在OpenGL这个...

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

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

    在OpenGL中播放AVI

    要在OpenGL中播放AVI(一种常见的视频格式),我们需要借助额外的库来处理视频流,然后利用OpenGL将解码后的帧渲染到屏幕上。 这个"在OpenGL中播放AVI"的源码实现可能包括以下几个关键知识点: 1. **Video ...

    OpenGL的Alpha混合(演示程序)

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

    openGL 画直线 代码

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。它由Khronos Group维护,为开发者提供了一系列低级的图形渲染工具,包括绘制几何形状、处理光照和纹理等。在这个...

    OpenGL 射击游戏 exe

    OpenGL通过启用glEnable(GL_BLEND)并设置合适的源和目标因子,可以实现不同的混合模式,如添加、乘法或alpha混合。 选择(Selection)是OpenGL提供的一种交互方式,允许用户在场景中选择特定的对象。在射击游戏中,...

    QT opengl 透明度设置

    在QT框架中,OpenGL是一个强大的图形库,用于创建2D和3D图形。在QT5中,我们可以结合OpenGL的功能来实现复杂且高效的图形渲染。本文将深入探讨如何在QT5中利用OpenGL进行透明度设置以及对立体图形的整体颜色配置。 ...

    NeHe OpenGL中文教程.CHM相关源码1-22

    8. **混合 (08_Blend.rar)**: 混合是OpenGL中处理透明和半透明物体的关键技术,它涉及到如何将新像素与现有像素融合。这部分可能涵盖了GL_BLEND函数的使用,以及如何配置源因子和目标因子以实现不同的混合效果。 9....

    opengl源代码实例

    在"opengl源代码实例"这个压缩包中,包含了大约二十个OpenGL的源代码项目以及对应的可执行文件,这些实例可以帮助我们深入理解和学习OpenGL的工作原理。 首先,OpenGL的核心概念是顶点、图元和渲染管线。顶点是构成...

    Opengl纹理贴图详解源码

    OpenGL是计算机图形学中广泛使用的库,用于在各种操作系统上创建2D和3D图形。在本"OpenGL纹理贴图详解源码"中,我们将深入探讨如何使用OpenGL进行纹理贴图、光照处理以及碰撞检测,这些是游戏开发和可视化应用中的...

    opengl es 1.1版本

    在OpenGL ES 1.1中,主要包含了以下核心概念和知识点: 1. **固定功能管道**:这是OpenGL ES 1.1的核心,它将图形渲染过程分为多个预定义的阶段,包括顶点处理、坐标变换、光照计算、纹理映射和像素渲染等。开发者...

    OpenGL函数参考手册

    在手册中,你可以找到关于OpenGL的核心函数,它们主要分为以下几个方面: 1. **上下文管理**:OpenGL的工作始于创建一个图形上下文,这是所有渲染操作的基础。函数如`glCreateContext`、`glDeleteContext`等用于...

    opengl 融合技术

    1. **启用混合**:首先,你需要开启OpenGL的混合功能,这通过`glEnable(GL_BLEND)`完成。这样,后续绘制的对象将会使用融合函数进行颜色混合。 2. **设置融合函数**:`glBlendFunc()`函数设定源颜色和目标颜色的...

    opengl彩虹 颜色渲染

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。本实例主要探讨如何使用OpenGL实现彩虹效果,并进行颜色渲染和纹理贴图。彩虹通常由太阳光在雨滴中折射、反射和...

    qt opengl 混合半透明效果

    这篇讨论主要聚焦于在Qt中利用OpenGL实现半透明效果,同时涉及到了obj模型的加载以及mipmap纹理的应用。以下是对这些关键知识点的详细阐述: 1. **Qt与OpenGL**:Qt是一个跨平台的C++开发框架,广泛用于构建桌面、...

Global site tag (gtag.js) - Google Analytics