OpenGL混合
在OpenGL中,混合(Blending)是一种将多个图形片段(像素)合成到帧缓冲区的过程。混合通常用于实现半透明效果、阴影、粒子效果和其他图形特效。
混合原理
OpenGL渲染时会把颜色值存在颜色缓冲区中,每个片段的深度值放在深度缓冲区。
当深度缓冲区关闭时,新的颜⾊只是简单覆盖原来颜色,缓存区存储新的颜⾊色值。
当深度缓冲区打开时,新的⽚段,只有当它们的距离比原来的片段距离更接近邻近的摄像机时才会在颜色缓存区存储新的颜⾊色值。如果新片段包含半透明区域,并且openGL开启了混合,那么新片段将和颜色缓冲区的颜色和alpha值,通过混合方程式,混合在一起生成新的颜色和alpha值。
混合方程
openGL标准混合方程式的形式为:
C_result = (C_source * S) + (C_destination * D)
- C_result 是最终的颜色值
- C_source 是新像素的颜色值
- C_destination 是已存储像素的颜色值
- S:源混合因⼦子
- D:⽬标混合因⼦
这里的alpha属于一个颜色值中的一个通道。
混合因子的设置
openGL可以分别设定源混合因⼦和⽬标混合因⼦
// S:源混合因⼦
// D:⽬标混合因子
glBlendFunc(GLenum S,GLenum D);
S和D的枚举参考如下:
表中R、G、B、A 分别代表 红、绿、蓝、alpha。
表中下标S、D,分别代表源混合因⼦、目标混合因⼦
表中C代表常量颜色(默认⿊色)glBlendFunc指定源和⽬标RGBA值的混合函数;
glBlendFuncSeparate函数可以为RGB和Alpha单独指定混合函数。在混合因子列表中
GL_CONSTANT_COLOR
、GL_ONE_MINUS_CONSTANT_COLOR
、GL_CONSTANT_ALPHA
、GL_ONE_MINUS_CONSTANT
允许混合方程式中引⼊⼀个常量量混合颜色(看下文)。
当然openGL还有其他混合方程式:
可以通过选择混合⽅方程式的函数更换混合方程式,方程式里面的参数意义和上述一致:
glbBlendEquation(GLenum mode);
标准混合方程式的例子
下⾯通过一个例子来说明标准的混合函数组合的使用方法:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
如果颜⾊缓充区已经有一种颜⾊:红⾊(1.0f,0.0f,0.0f,0.0f),这个就是⽬标颜色C_destination,如果在这上面用一种alpha为0.6的:蓝色(0.0f,0.0f,1.0f,0.6f)来混合,蓝色就是源颜色。
C_destination (⽬标颜色) = (1.0f,0.0f,0.0f,0.0f);
C_source (源颜色) = (0.0f,0.0f,1.0f,0.6f);
S = 源alpha值 = 0.6f;
D = 1 - 源alpha值 = 1-0.6f = 0.4f;
那么带入标准方程:
C_result = (Blue * 0.6f) + (Red * 0.4f)
最终色C_result是以原先的红色(目标颜色)与后来的蓝色(源颜色)进⾏组合。源颜色的alpha值越高,添加的蓝色颜⾊成分越高,目标颜色所保留的成分就会越少。
启用或者禁用混合:
要在OpenGL中启用混合,可以使用以下步骤:
- 启用混合功能:使用
glEnable(GL_BLEND)
启用混合。 - 选择混合方程式:使用
glBlendFunc
来选择适当的混合方程式。 - 渲染:渲染图形并触发混合。
当然要禁用混合,可以使用glDisable(GL_BLEND)。
常量混合颜色
常量混合颜⾊: 默认初始化为⿊⾊(0.0f,0.0f,0.0f,0.0f),但是可以通过openGL API修改这个常量混合颜色值,这个函数在启用混合(glEnable(GL_BLEND)
)之后调用。。
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha);
使用glBlendColor函数后,常量颜色将在混合操作中生效,与新的片段颜色进行混合。这通常是通过混合方程式和混合因子来定义:
glBlendEquation(GL_FUNC_ADD); // 设置混合方程式为加法
glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR); // 设置混合因子,将常量颜色与新片段颜色混合
上述示例,GL_CONSTANT_COLOR表示常量颜色,GL_ONE_MINUS_CONSTANT_COLOR表示新片段颜色的补充。混合操作将常量颜色与新片段颜色按照混合因子的定义进行混合,生成最终的颜色。
本文系作者 @何健源 原创发布在思维代码站点。未经许可,禁止转载。
暂无评论数据