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);
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 ;
}
{
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 ;
}