OpenGL学习笔记:混合

所谓混合:(glEnable(GL_BLEND)),就是把两种颜色混合在一起,通过公式或设定,达到想要的颜色效果。

只有RGBA才能使用混合,颜色索引模式无法使用混合功能。

混合的前提是,要有两个颜色(废话)。一个是已经画上去的颜色(Destination color,目标颜色),一个是将要画上去的颜色(Source color源颜色)。

计算方法,真的是法克英 easy:

源颜色乘以一个系数(源因子),目标颜色乘以一个系数(目标因子),然后相加/相减/相乘/或者其他乱七八糟,就得到最终颜色效果。这里我们假设是相加,那公式如下:

(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)

源颜色:Rs, Gs, Bs, As,

源因子:Sr, Sg, Sb, Sa

目标颜色:Rd, Gd, Bd, Ad

目标因子:Dr, Dg, Db, Da


源因子和目标因子通过glBlendFunc函数来进行设置的.

将源颜色的alpha值作为源因子,用1.0减去源颜色alpha值作为目标因子,是一种常用的方式。这时候,源颜色的alpha值相当于“不透明度”的作用。利用这一特点可以绘制出一些半透明的物体。

三维混合:
三维混合的问题:在三维空间中,如果某物体的Z轴靠近观察者,那么它会遮住后面的物体,用OpengGL的做法就是,后面的干脆不画,这就是所谓的深度缓冲测试。这样做无可厚非,但是,混合就哭了,所谓混合,是前面的颜色跟后面的颜色混合,现在,后面的那个东东不见了,混不下去了。

解决方法很简单,再绘制靠近观察者的物体的时候,想办法取消深度缓冲测试,让后面的物体也能画出来。方法如下:
1. 此时让深度缓冲区设置为只读(glDepthMask(GL_FALSE))。但注意,要先画后面的物体,再画前面的物体

2. 此时禁用深度缓冲区。但要谨慎哟,因为注意,是完全被禁用了,所有的物体都会被画出来,包括你本来不想画的

你可能感兴趣的:(OpenGL世界)