opengl画面数据(OpenGL颜色混合)

案例引入

首先我们通过如下代码构建两个图层,它们的颜色和透明度分别为红色、0.6和蓝色、0.6,并且让它们的部分区域重叠在一起。

UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(20, 100, 150, 100)]; redView.backgroundColor = [UIColor redColor]; redView.alpha = 0.6; [self.view addSubview:redView]; UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 100)]; blueView.backgroundColor = [UIColor blueColor]; blueView.alpha = 0.6; [self.view addSubview:blueView];

效果如下:

opengl画面数据(OpenGL颜色混合)(1)

C 音视频开发学习资料:点击领取→音视频开发(资料文档 视频教程 面试题)(FFmpeg WebRTC RTMP RTSP HLS RTP)

颜色混合

我们发现在redView和blueView重叠的部分,颜色发生了变化,显示的颜色即不是红色也不是蓝色,而是红色和蓝色混合后的颜色。这种现象我们称之为“颜色混合”。

那么在OpenGL中如何实现颜色混合呢?

调用如下代码,打开颜色混合状态:

gl_Enable(GLBLEND);

调用如下代码,设置颜色混合因子:

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

用完后,记得调用如下函数关闭:

glDisable(BL_BLEND);

通过如上三句代码我们就能够在OpenGL中使用颜色混合了。

混合原理

目标颜色:已经存储在颜色缓冲区的颜色值; 源颜色:将要进入颜色缓冲区的颜色值。

OpenGL默认情况下的颜色混合公式

Cf = (Cs * S) (Cd * D);

Cf:混合后的颜色值

Cs:源颜色

Cd:目标颜色

S:源混合因子

D:目标混合因子

其中,Cs和Cd是颜色值,我们无法设置;S和D是对应的混合因子,我们可以通过以下函数设置:

glBlendFunc(GLenum S,GLenum D);

其中S和D的取值如下图:

opengl画面数据(OpenGL颜色混合)(2)

表中R、G、B、A分别表示红、绿、蓝、透明度;S、D分别表示源、目标;C表示常量颜色。

C 音视频开发学习资料:点击领取→音视频开发(资料文档 视频教程 面试题)(FFmpeg WebRTC RTMP RTSP HLS RTP)

opengl画面数据(OpenGL颜色混合)(3)

上图是OpenGL下颜色混合的默认公式的解释,其实就是简单的加减乘除运算。在OpenGL下,可以使用函数:

glbBlendEquation(Glenum mode);

可用的混合公式如下:

opengl画面数据(OpenGL颜色混合)(4)

还有常量混合颜色,默认是黑色(0.0f,0.0f,0.0f,1.0f);但也可以通过下面的公式设置

void glBlendColor(GLclampf red,GLclampf green,GLclampf blue, GLclampf alpha);

总结:

一般我们只需要使用OpenGL默认的公式就已经足够了,基本不会去修改混合公式,使用最开始介绍的三个函数开启颜色混合就能满足开发中的需求了。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页