NeHe_Lesson8 Blending

以前我们使用glColor 3f 来指定一个顶点颜色,它代表使用GL_RGB 也就是3个颜色分量。现在你可以使用GL_RGBA 来增加一个Alpha值了。我们可以用glColor 4f () 函数代替glColor 3f () 函数。

Alpha值可以理解为材质(material) 的不透明程度, 0.0代表材质完全透明, 1.0代表材质完全不透明。

混合公式:
(Rs As + Rd (1 - As), Gs As + Gd (1 - As), Bs As + Bs (1 - As), As As + Ad (1 - As))

代码说明:
   
指定顶点以全亮度(当前颜色RGB分量全为1.0为)绘制,然后Alpha指定为0.5,表示为半透明。当使用纹理影射的时候我们怎样指定颜色呢? 很简单, 在调制的纹理模式中, 纹理的每个像素点都会与当前颜色相乘。 所以, 如果要被绘制的颜色为(0.5, 0.6, 0.4) 通过相乘我们可以得到(0.5, 0.6, 0.4, 0.5)(alpha默认值为1.0)下面代码指定

glColor 4f ( 1.0f , 1.0f , 1.0f , 0.5f );                           // Full Brightness, 50% Alpha

指定源混合因子和目标混合因子

glBlendFunc(GL_SRC_ALPHA,GL_ONE);

glEnable(GL_BLEND);          // Turn Blending On

glDisable(GL_DEPTH_TEST);//关闭深度测试,这样做是为了被遮住的三角形也能被渲染。(这是不正确的,因为如果混合的层数多了将引起错误正确方法如下)

这样做主要是为了简化,教程主要说明混合的原理。正确的方法是在整个场景绘制完之后再绘制所有的透明 (alpha < 1.0) 多边形, 而且要按照由远及近的深度顺序, 这是由于事实上按照不同的顺序混合两个(12)多边形会得到不同的结果。 假如多边形1距离我们最近, 那么正确的方法是先绘制多边形2 然后是多边形1 如果你看着它, 那么真实情况就是它们后面的光首先经过多边形2 然后经过多边形1 最后到达你的眼睛。 所以, 你需要按照深度将透明的多边形进行排序, 开着深度缓存并在整个场景绘制完毕之后再绘制它们, 否则将得到不正确的结果

你可能感兴趣的:(Blend)