案例引入
首先我们通过如下代码构建两个图层,它们的颜色和透明度分别为红色、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];
效果如下:
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的取值如下图:
表中R、G、B、A分别表示红、绿、蓝、透明度;S、D分别表示源、目标;C表示常量颜色。
C++音视频开发学习资料:点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
上图是OpenGL下颜色混合的默认公式的解释,其实就是简单的加减乘除运算。在OpenGL下,可以使用函数:
glbBlendEquation(Glenum mode);
可用的混合公式如下:
还有常量混合颜色,默认是黑色(0.0f,0.0f,0.0f,1.0f);但也可以通过下面的公式设置
void glBlendColor(GLclampf red,GLclampf green,GLclampf blue, GLclampf alpha);
总结:
一般我们只需要使用OpenGL默认的公式就已经足够了,基本不会去修改混合公式,使用最开始介绍的三个函数开启颜色混合就能满足开发中的需求了。
本文暂时没有评论,来添加一个吧(●'◡'●)