在上篇深度测试中我们讨论的对象都是两个不透明的图层重叠时的解决方案,那么如果我们遇到半透明的图层时应该怎么处理呢?
// 开启混合
glEnable(GL_BlEND);
首先介绍一下两个概念:
目标颜色:已经存在在颜色缓冲区里的颜色
源颜色:作为当前渲染命令结果进入颜色缓冲区的颜色
当混合功能开启后,源颜色和目标颜色的组合方式是混合方程式控制的。在默认情况下混合方程式如下:
Cf = Cs * S + Cd * D
Cf:最终计算得到的颜色
Cs:源颜色
S:源混合因子
Cd:目标颜色
D:目标混合因子
当然我们也可以自己设置混合因子:
// 设置混合因子
// S:源混合因子
// D:目标混合因子
glBlendFunc(GLenum S,GLenum D);
混合因子
下⾯通过⼀个常⻅的混合函数组合来说明问题:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
如果颜⾊缓存区已经有⼀种颜⾊红⾊(1.0f,0.0f,0.0f,0.0f),这个⽬标颜⾊Cd,
如果在这上⾯⽤⼀种alpha为0.6的蓝⾊(0.0f,0.0f,1.0f,0.6f)
Cd (⽬标颜⾊) = (1.0f,0.0f,0.0f,0.0f);
Cs (源颜⾊) = (0.0f,0.0f,1.0f,0.6f);
S = 源alpha值 = 0.6f
D = 1 - 源alpha值= 1-0.6f = 0.4f
⽅程式Cf = (Cs * S) + (Cd * D)
等价于 = (Blue * 0.6f) + (Red * 0.4f)
最终颜⾊是以原先的红⾊(⽬标颜⾊)与 后来的蓝⾊(源颜⾊)进⾏组合。源颜⾊的alpha值越⾼,添加的蓝⾊颜⾊成分越⾼,⽬标颜⾊所保留的成分就会越少。混合函数经常⽤于实现在其他⼀些不透明的物体前⾯绘制⼀个透明物体的效果。
既然我们能设置混合因子,那么混合方程式呢?
设置混合方程式
// 混合模式
glbBlendEquation(GLenum mode);
混合方程式
除了能使⽤glBlendFunc 来设置混合因⼦,还可以有更灵活的选择。
// strRGB: 源颜⾊的混合因⼦
// dstRGB: ⽬标颜⾊的混合因⼦
// strAlpha: 源颜⾊的Alpha因⼦
// dstAlpha: ⽬标颜⾊的Alpha因⼦
void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB ,GLenum strAlpha,GLenum dstAlpha);
glBlendFunc指定源和⽬标RGBA值的混合函数;但是glBlendFuncSeparate函数则允许为RGB 和Alpha 成分单独指定混合函数。
在混合因⼦表中,
GL_CONSTANT_COLOR,GL_ONE_MINUS_CONSTANT_COLOR,GL_CONSTANT_ALPHA,GL_ONE_MINUS_CONSTANT只允许混合⽅程式中引⼊⼀个常量混合颜⾊。
默认初始化为黑色,但也是可以修改的
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha );