如果打开了OpenGL的混合功能,那么下层的颜色值就不会被清除。
glEnable(GL_BLEND);
在打开混合功能的情况下,新的颜色会与已经存在的颜色值在颜色缓冲区中进行混合。
我们已经了解,通常情况下OpenGL渲染时会把颜色值放在颜色缓冲区中。
已经存在的颜色值:已经存储在颜色缓冲区中得颜色值叫做目标颜色,这个颜色值包含了单独的红、绿、蓝成分以及一个可选的alpha值。
源颜色: 作为当前渲染命令的结果进入颜色缓冲区的颜色值。也可以包含3种或4种颜色成分(红、绿、蓝和可选的alpha成分)
请注意,任意情况下只要我们忽略alpha值,OpenGL都会将它设为 1.0。
Cf = (Cs * S)+ (Cd * D)
Cs 是源颜色 = (0.0f,0.0f,1.0f,0.6f)
Cd 是目标颜色 = (1.0f,0.0f,0.0f,0.0f)
S 混合因子 GL_SRC_ALPHA 【RGB混合因子 As,As,As Alpha混合因子 As】 源alpha值=0.6
D 混合因子 GL_ONE_MINUS_SRC_ALPHA 【RGB混合因子 (1,1,1)- (As,As,As) Alpha混合因子 1-As】 1减去源alpha值 = 1.0 - 0.6 = 0.4
cf = (Blue * 0.6) + *(Red * 0.4)
最终的颜色是原来的红色(目标颜色)与后来的蓝色(源颜色)进行缩放后的组合。源颜色的alpha值越高,添加的源颜色成分就越多,目标保留的成分就越少。
混合因子都是枚举值,而不是可以直接指定的实际值。P82 表3.3 颜色是用浮点数表示的。因此,对它们进行加减甚至乘法都是完全合法的。
------------------- 改变混合方程式
这是默认的混合方程式 Cf = (Cs * S)+ (Cd * D)【GL_FUNC_ADD】,
还有 Cf = (Cs * S)- (Cd * D)【GL_FUNC_SUBTRACT】
P84 表3.4 就是可用的混合方程模式
可以通过 下面的函数进行选择
void glBlendEquation(GLenum mode);
void glBlendFuncSeparete(GLenum srcRGB,GLenum dstRGB,GLenum srcAlpha,GLenum dstAlpha);
这个函数允许为RGB 和 Alpha 成分单独指定混合函数。
另将 GL*CONSTANT* 作为参数时 (比如 GL_ONE_MINUS_CONSTANT_ALPHA),
需要使用glBlendColor()指定一个常量(constant)颜色
void glBlenColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
设置执行混合操作时使用的常量颜色的红,绿,蓝和alpha值(Rc, Gc, Bc, Ac)
------------ 抗锯齿
OpenGL混合功能的另一个用途是抗锯齿。在绝大多数情况下,一个独立的渲染片段将会映射到计算机屏幕的一个像素
这些像素是正方形的(或者说近似正方形),通常可以相当清楚地看到两种颜色的分界。它们通常被称为锯齿。
为了消除图元之间的锯齿状边缘,OpenGL使用混合功能来混合片段的颜色,也就是把像素的目标颜色与周围像素的颜色进行混合。从本质上,在任何图元的边缘上,像素颜色会稍微延伸到相邻的像素。
开启抗锯齿功能,必须启用混合功能,设置混合函数,需要设置混合方程式为GL_ADD,这是默认的设置
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
// 选择调用对点、直线和(或)多边形(任何实心图元)进行抗锯齿处理。
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);
glHint 的作用是实现抗锯齿的算法很多种,,选择速度最快的算法(GL_FASTEST)或则效果最好的算法(GL_NOCEST).
------------ 多重采样
抗锯齿处理,点和直线的平滑处理是得到广泛支持的,多边形的平滑处理并没有在所有平台都得到实现。即使在可以使用GL_POLYGON_SMOOTH的时候,使用也不方便。这是因为抗锯齿是基于混合操作的,这就需要从前到后所有图元进行排序,这是非常麻烦的。
多重采样(multisampling),可以用来解决这个问题。已经包含了颜色、深度和模板值的帧缓冲区就会添加一个额外的缓冲区。所有的图元在每个像素上都进行了多次采样,其结果就存储在这个缓冲区中。每次当这个像素进行更新时,这些采样值进行解析,以产生一个单独的值。这是自动的。这些处理会带来额外的内存和处理器开销。因此,有些OpenGL实现并不支持多渲染环境中得多重采样。
为了进行多重采样,首先必须一个支持多重采样帧缓冲区的渲染环境。正在不同平台可能各不相同。
glEnable(GL_MULTISAMPLE);
或
glDisable(GL_MULTISAMPLE);
开启或关闭多重采样
关于多重采样注意,当它被启用时,点、直线和多边形的平滑特效都将被忽略(如果这些特性被启用的话)。当绘制点和直线时,可以关闭多重采样,在绘制其他实心几何图形时在打开多重采样。
状态排序,打开或关闭不同的OpenGL特性将会修改驱动程序的内部状态,这种状态的改变可能会对渲染的性能造成影响。对性能敏感的程序员需要相同状态的几何图形就可以在一起绘制。这种状态排序是在游戏中常用的提高速度的方法之一。
多重采样缓冲区在默认情况下使用片段的RGB值,并不包括颜色的alpha成分。可以通过glEnable来修改这个行为
GL_SAMPLE_ALPHA_TO_COVERAGE ------- 使用alpha值
GL_SAMPLE_ALPHA_TO_ON -------将alpha值设为1并使用它
GL_SAMPLE_COVERAGE --------使用glSampleCoverage 所设置的值。它允许指定一个特定的值。它是与片段覆盖值进行按位与操作的结果。
这种多多重采样的优化,因不同的OpenGL实现而异,不是严格OpenGL规范所规定的。