OpenGL中的混合,其实并没有想象中的那么简单,初学时只是简单理解到混合是   源X源混合因子+目标X目标混合因子,然而通过写程序,发现,并没有达到想象的效果,代码如下

 glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);

glColor4f(
1,0,0,0.1);
glRectf(
-2,-2,0,0);

glColor4f(
0,0,1,0.5);
glRectf(
-1,-1,1,1);

初学时最容易犯的错误是认为,第一个红色的矩形是glBlendFunc函数中第二个参数指定的目标片段,而紧接着绘制的是glBlendFunc的第一个参数所指定的源片段,然后运行出混合效果,然而运行后,你会发现,两个矩形都比原来的真实颜色暗(这里的“原来”是指,注释掉以上代码前两行后的运行结果),此时可以怀疑,是否是GL_SRC_ALPHA影响了两个矩形,换句话说,两个矩形在这里是否应该都是作为源片段!!!

通过将glBlendFunc的第一个参数改成GL_ZERO,发现,两个矩形都消失了,此时可以断定,二者都是源片段。

 glColor4f(1,0,0,0.1);
glRectf(
-2,-2,0,0);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);

glColor4f(
0,0,1,0.5);
glRectf(
-1,-1,1,1);

将代码改成这样后,按说在启用混合前先把第一个矩形绘制进缓存中后,此时第一个矩形应该就是混合函数中的目标片段了,然后再绘制第二个矩形,理所应当,这个矩形该是源片段,然而,运行后发现,此结果和上面的运行结果一样,两个矩形此时仍然都是源片段。

为什么呢???因为没有在混合结束是加上glDisable(GL_BLEND),由于OpenGL是一个状态机,在启用混合功能后,如果没有禁止,那么他将一直起作用,所以之前第一个绘制的矩形在循环渲染中,将一直被当做新画的矩形,和第二个矩形一起,作为源片段,导致二者会同时变暗,所以只有在以上代码加上glDisable(GL_BLEND)之后,才能正确的执行混合效果

posted on 2011-07-22 17:00  apapaxionga  阅读(1141)  评论(0编辑  收藏  举报