OpenGL Study 6

  
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 ;
                    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值