OpenGL的混合

混合指的是对源颜色(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。

相关文章
相关标签/搜索