OpenGL关于颜色混合

264 阅读2分钟

混合

我们把OpenGL渲染时会把颜色值存在颜色缓存区中,每个⽚段的深度值也是放在深度缓冲区。当深度缓冲区被关闭时,新的颜色将简单的覆盖原来颜色缓冲区存在的颜色值,当深度缓冲区再次打开时,新的颜⾊⽚段只是当它们比原来的值更接近邻近的裁剪平面才会替换原来的颜色⽚段。

组合颜色

  • 目标颜色:已经存储在颜色缓冲区的颜色值
  • 源颜色:作为当前渲染命令结果进入颜色缓冲区的颜色值
  • 当混合功能被启动时,源颜色和目标颜色的组合⽅式是混合方程式控制的。在默认情况下,混合方程式如下所示:
Cf = (Cs * S) + (Cd * D)
Cf : 最终计算参数的颜色 
Cs : 源颜色
Cd : ⽬标颜色 
S  : 源混合因子 
D  : ⽬标混合因子

设置混合因子

glBlendFunc(GLenum S, GLenum D);
S: 源混合因子
D: 目标混合因子

image.png 表中R、G、B、A 分别代表 红、绿、蓝、alpha。 表中下标S、D,分别代表源、目标

表中C 代表常量颜⾊(默认⿊⾊)

案例

下⾯通过一个常见的混合函数组合来说明问题:

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值越高,添加的蓝⾊颜⾊成分越高,目标颜色所保留的成分就会越少。混合函数经常⽤于实现在其他一些不透明的物体前⾯绘制一个透明物体的效果。

改变组合方程式

  • 默认混合方程式:Cf = (Cs * S)+(Cd * D)
  • 实际上远不止这一种混合方程式,我们可以从5个不同的方程式中进行选择
  • 选择混合方程式的函数:glbBlendEquation(GLenum mode);

image.png

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_CONSTANT_COLOR, GL_CONSTANT_ALPHA, CL_ONE_MINUS_CONSTANT值允许混合方程式中引进一个常量混合颜色。
  • 常量混合颜色,默认初始化为黑色,但是还是可以修改这个常量混合颜色。
void glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);