OpenGL Study 6

来源:互联网 发布:贝壳网络加速器 编辑:程序博客网 时间:2024/05/17 05:16
  
Lesson08
透明度
OpenGL中的许多效果都依赖于某种类型的混合。混合是指将一个给定的象素绘制到当前屏幕上已有象素上的操作。两种颜色的混合是以它们的alpha值为基础,通过混合函数进行的。Alpha是颜色的第四个分量。在OpenGL中使用GL_RGB只能指定颜色的三个分量,而GL_RGBA则可以指定alpha值。此外,我们还要使用glColor4f()来替换glColor3f()。
许多人认为alpha值就是材质的透明度。Alpha为0.0的材质完全透明,alpha为1.0的材质完全不透明。
混合方程
(Rs×Sr + Rd×Dr, Gs×Sg + Gd×Dg, Bs×Sb + Bd×Db, As×Sa + Ad×Da)
OpenGL中根据以上等式来计算两个象素混合后的结果。其中,下标s和d表示源象素和给定象素。S和D是混合因子,表示将如何混合这两个象素。S和D通常采用如下取值,S=(As,As,As,As),而D=(1,1,1,1)-(As,As,As,As)。这样混合等式就变成:
(Rs×As + Rd×(1 - As), Gs×As + Gd×(1 - As), Bs×As + Bd×(1 - As), As×As + Ad×(1 - As))
OpenGL中的混合
        在OpenGL中使用混合和其他选项一样。现设置参数值,然后在绘制透明物体时关闭深度缓冲,因为我们要让透明物体之后的物体都能够被绘制。但这并不是混合的好方法,不过多少时间对于简单工程它都表现良好。
        正确的方法是绘制完整个场景后,再按透明物体深度值逆序绘制(即离观察者最远的最先绘制)。这是由于以不同的顺序混合两个多边形(1和2)会产生不同的结果。假设多边形1离观察者近,那么正确的方法应该是先绘制2,再绘制1。现实中从这两个多边形后面射来的光线要先穿过2,然后穿过1,最后到达观察者。因此,你需要先按透明物体的深度将它们排序,然后在整个场景以深度缓冲方式绘制完成后再处理透明物体。
在InitGL()中,添加混合参数设置:
    //full brightness,50% alpha
    glColor4f(1.0f,1.0f,1.0f,0.3f);
    
//blending function translucency based on source alpha value
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);

添加B键响应代码,控制混合开关:

                    if(keys['B'&& !bp)
                    {
                        bp
=true;
                        blend
=!blend;
                        
if(blend)
                        {
                            glEnable(GL_BLEND);
                            glDisable(GL_DEPTH_TEST);
                        }
else
                        {
                            glDisable(GL_BLEND);
                            glEnable(GL_DEPTH_TEST);
                        }
                    }
                    
if(!keys['B'])
                    {
                        bp
=false;
                    }