原因
颜色缓冲区存储着像素点的颜色信息,当深度缓冲区开启时,当该像素点深度小于原来的深度时的颜色信息就会被替换为新的颜色信息。当我们的颜色携带透明度信息时,就需要用到混合。
混合颜色
目标颜色
已经存储在颜色缓存区的颜色值
源颜色
作为当前渲染命令结果进入颜色缓存区的颜色值
当混合功能被启动时,源颜色和⽬标颜色的组合方式是混合方程式控制的。在默认情况下,混合⽅方程式如下所示:
Cf = (Cs * S) + (Cd * D)
Cf :最终计算参数的颜色
Cs : 源颜色
Cd :目标颜色
S:源混合因子
D:⽬标混合因子
使用
开启混合
glEnable(GL_BlEND)
设置混合因子
glBlendFunc(GLenum S,GLenum D)
S:源混合因⼦子
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)
更改组合方式
选择混合⽅程式的函数:
glbBlendEquation(GLenum mode)
glBlendFuncSeparate函数
除了能使用glBlendFunc 来设置混合因子,还可以有更灵活的选择
void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB ,GLenum strAlpha,GLenum dstAlpha);
strRGB: 源颜色的混合因子
dstRGB: ⽬标颜色的混合因子
strAlpha: 源颜色的Alpha因子
dstAlpha: ⽬标颜色的Alpha因子
glBlendFunc
指定源和⽬标 RGBA
值的混合函数;
glBlendFuncSeparate
函数则允许为RGB
和 Alpha
成分单独指定混合函数
GL_CONSTANT_COLOR、GL_ONE_MINUS_CONSTANT_COLOR、GL_CONSTANT_ALPHA、GL_ONE_MINUS_CONSTANT
值允许混合方程式中引入一个常量混合颜色。
常量混合颜色,默认初始化为⿊色(0.0f,0.0f,0.0f,0.0f)
修改常量混合颜色
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha )