混合

如果打开了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规范所规定的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值