混合指的是对源颜色(RGBA)和目标颜色的处理获得新的颜色的过程。函数
那什么叫源颜色呢?图片
好比你要绘制一张图片,那么图片上的颜色就能够称为源颜色。io
因为在绘制的时候,在帧缓冲区实际上已经有以前绘制的颜色了,这就称为目标颜色。参数
那么就要对这2种颜色进行混合处理。颜色
开启和关闭混合的方式以下:ab
glEnable( GL_BLEND );// 启用混合
glDisable( GL_BLEND );// 禁用关闭混合
混合的公式以下:
设:某个源颜色为 (Rs, Gs, Bs, As)
目的颜色为 (Rd, Gd, Bd, Ad)
源混合因子为: (Sr, Sg, Sb, Sa)
目的混合因子为: (Dr, Dg, Db, Da)
那么,最终目标颜色为:
(Rs*Sr <op> Rd*Dr, Gs*Sg <op> Gd*Dg, Bs*Sb <op> Bd*Db, As*Sa <op> Ad*Da)
其中,<op>能够是加法(+),减法(-), 逆向减法,最小值,最大值或按位逻辑操做,而且其优先级小于乘法(*)。默认的操做是相加。能够经过glBlendEquation来指定操做方式
使用混合的时候,咱们一般只须要指定混合因子:
glBlendFunc( GLenum sfactor , GLenum dfactor );// 混合函数
其中sfactor表示源因子,dfactor表示目标因子。
混合因子有以下可选参数:
one 1
zero 0
SrcColor 源的RGB值,例如(0.5,0.4,1)
SrcAlpha 源的A值, 例如0.6
DstColor 混合目标的RGB值例如(0.5,0.4,1)
DstAlpha 混合目标的A值例如0.6
OneMinusSrcColor (1,1,1) - SrcColor
OneMinusSrcAlpha 1- SrcAlpha
OneMinusDstColor (1,1,1) - DstColor
OneMinusDstAlpha 1- DstAlpha
举例:
glBlendFunc( GL_ONE , GL_ZERO ); // 源色将覆盖目标色
glBlendFunc( GL_ZERO , GL_ONE ); // 目标色将覆盖源色
glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的
若源色为 ( 1.0 , 0.9 , 0.7 , 0.8 )
源色使用 GL_SRC_ALPHA
即 0.8*1.0 , 0.8*0.9 , 0.8*0.7 , 0.8*0.8
结果为 0.8 , 0.72 , 0.56 , 0.64
目标色为 ( 0.6 , 0.5 , 0.4 , 0.3 )
目标色使用GL_ONE_MINUS_SRC_ALPHA
即 1 - 0.8 = 0.2
0.2*0.6 , 0.2*0.5 , 0.2*0.4 , 0.2*0.3
结果为 0.12 , 0.1 , 0.08 , 0.06
在这个例子中,代表源颜色占80%,目标颜色占20%。
而后咱们使用glBlendEquation()来指定混合操做,参数能够是: GL_FUNC_ADD(加), GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN, GL_MAX。