
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-04-04 标题【转】OpenGL ES 混合的理解分类编程 / C C / cocos2dx 标签opengl·cocos2dx【转】OpenGL ES 混合的理解混合的介绍源因子和目标因子常用参数例子在线测试本文转自【 http://blog.csdn.net/zhooker1/article/details/8600740 】有删改。混合的介绍混合是什么呢混合就是把两种颜色混在一起。具体一点就是把某一像素位置原来的颜色和将要画上去的颜色通过某种方式混在一起从而实现特殊的效果。假设我们需要绘制这样一个场景透过红色的玻璃去看绿色的物体那么可以先绘制绿色的物体再绘制红色玻璃。在绘制红色玻璃的时候利用“混合”功能把将要绘制上去的红色和原来的绿色进行混合于是得到一种新的颜色看上去就好像玻璃是半透明的。要使用OpenGL的混合功能只需要调用glEnable(GL_BLEND);即可。要关闭OpenGL的混合功能只需要调用**glDisable(GL_BLEND);**即可。注意只有在RGBA模式下才可以使用混合功能颜色索引模式下是无法使用混合功能的。源因子和目标因子前面我们已经提到混合需要把原来的颜色和将要画上去的颜色找出来经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”把原来的颜色称为“目标颜色”。**将要画上去的颜色 **源颜色原来的颜色****目标颜色OpenGL会把源颜色和目标颜色各自取出并乘以一个系数源颜色乘以的系数称为“源因子”目标颜色乘以的系数称为“目标因子”然后相加这样就得到了新的颜色。也可以不是相加新版本的OpenGL可以设置运算方式包括加、减、取两者中较大的、取两者中较小的、逻辑运算等但我们这里为了简单起见不讨论这个了下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量指红色绿色蓝色alpha值是(Rs, Gs, Bs, As)目标颜色的四个分量是(Rd, Gd, Bd, Ad)又设源因子为(Sr, Sg, Sb, Sa)目标因子为(Dr, Dg, Db, Da)。则混合产生的新颜色可以表示为(Rs*SrRd*Dr, Gs*SgGd*Dg, Bs*SbBd*Db, As*SaAd*Da)当然了如果颜色的某一分量超过了1.0则它会被自动截取为1.0不需要考虑越界的问题。源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数前者表示源因子后者表示目标因子。这两个参数可以是多种值下面介绍比较常用的几种。常用参数GL_ZERO 表示使用0.0作为因子实际上相当于不使用这种颜色参与混合运算。GL_ONE 表示使用1.0作为因子实际上相当于完全的使用了这种颜色参与混合运算。GL_SRC_ALPHA 表示使用源颜色的alpha值来作为因子。GL_DST_ALPHA 表示使用目标颜色的alpha值来作为因子。GL_ONE_MINUS_SRC_ALPHA表示用1.0减去源颜色的alpha值来作为因子。GL_ONE_MINUS_DST_ALPHA表示用1.0减去目标颜色的alpha值来作为因子。除此以外还有GL_SRC_COLOR把源颜色的四个分量分别作为因子的四个分量、GL_ONE_MINUS_SRC_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等前两个在OpenGL旧版本中只能用于设置目标因子后两个在OpenGL旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制并且支持新的GL_CONST_COLOR设定一种常数颜色将其四个分量分别作为因子的四个分量、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha值和RGB值采用不同的混合因子。但这些都不是我们现在所需要了解的。毕竟这还是入门教材不需要整得太复杂~例子如果设置了glBlendFunc(GL_ONE, GL_ZERO);则表示完全使用源颜色完全不使用目标颜色因此画面效果和不使用混合的时候一致当然效率可能会低一点点。如果没有设置源因子和目标因子则默认情况就是这样的设置。如果设置了glBlendFunc(GL_ZERO, GL_ONE);则表示完全不使用源颜色因此无论你想画什么最后都不会被画上去了。但这并不是说这样设置就没有用有些时候可能有特殊用途如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);则表示源颜色乘以自身的alpha值目标颜色乘以1.0减去源颜色的alpha值这样一来源颜色的alpha值越大则产生的新颜色中源颜色所占比例就越大而目标颜色所占比例则减小。这种情况下我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。如果设置了glBlendFunc(GL_ONE, GL_ONE);则表示完全使用源颜色和目标颜色最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0)结果为黄色。在线测试【 http://www.andersriggelsen.dk/glblendfunc.php 】