深度缓存与混合的关系

OpenGL中的颜色混合可以为场景带来想透明这样的效果。利用透明,我们可以模拟水、窗户、玻璃等能够被我们看穿的物体。设置颜色的函数glColor4f()的最后一个参数是alpha值,颜色混合中,alpha值代表透明度,0.0表示完全透明(根本看不到物体),1.0表示完全不透明。

为了在OpenGL中启用混合,要调用带有GL_BLEND参数的glEnable()函数,然后调用glBlendFunc()来定义源和目标的混合因子。要想达到透明效果,可以将GL_SRC_ALPHA混合因子应用到源,而将GL_ONE_MINUS_SRC_ALPHA混合因子应用于目标。

在3D中,为了保证场景被正确的绘制和混合,还需要注意做一些事情,最重要的就是用下面的方法打开深度检测:

glEnable(GL_DEPTH_TEST);

启用深度检测是为了将位于物体后面的物体隐藏起来。现在的问题就来了:深度检测根据像素点到屏幕的距离来判断的,这有当前颜色所在的物体比原来的物体离屏幕近时,新的颜色才会取代原来的颜色。一旦有颜色取代发生,新的像素的深度缓存值就会被存入深度缓存中,这样便能隐藏被遮住的物体了。

当绘制场景时,如要进行正确的混合,就要涉及到深度缓存的打开与关闭。为此,现在深度缓存正常的情况下绘制所有不透明的物体,然后将深度缓存设置成只读,这样将不透明物体的深度缓存保护起来。在深度缓存为只读状态时,绘制透明物体就不会影响到不透明物体了。透明物体也会进行深度检测,位于不透明物体后面的物体也不会被绘制,而位于透明物体后面但在不透明物体前面,透明物体就会与不透明物体进行混合。(注意:如果不进行这些操作,将无法看到透明效果,因为不透明物体位于透明物体后面时,将会被隐藏,这就达不到预期的透明效果了。)


转自http://hi.baidu.com/719343891/blog/item/c78b5870607f9e118601b047.html/cmtid/c650daacd40e27c37dd92a29

你可能感兴趣的:(c,Blend)