masking就是一种特殊的Blending。它的效果如图:
注意,你可以通过雪花看见它后面的背景。
这节主要就是混合因子的使用,理解了混合公式这节就很容易理解了。
混合公式如下:
(RsSr + RdDr ,GsSg + GdDg ,BsSb + Bd + Db ,AsSa + AdDa)
其中(Sr ,Sg ,Sb ,Sa)为源混合因子,即后添加的片元的颜色值在混合中所占的比重。(Dr ,Dg ,Db ,Da)为目标混合因子,即先前帧缓冲中像素颜色的值灾混合中所占的比重。
源混合因子和目标混合因子通过函数glBlendFunc设置。
(Rs ,Gs , Bs ,As)是源像素的颜色值。(Rd ,Gd , Bd ,Ad)是目标像素的颜色值。
要masking一个纹理比如上面的雪花,你必须有一个雪花的纹理和一个与它对应的二值纹理:如图:。
程序处理步骤如下:
1. 绘制背景画.即透过雪花看见的纹理.
2. 开启混合,并且关闭深度测试:
glEnable(GL_BLEND); // Enable Blending
glDisable(GL_DEPTH_TEST); // Disable Depth Testing
3. 设置混合因子
glBlendFunc(GL_DST_COLOR,GL_ZERO); // Blend Screen Color With Zero (Black)
把参数带入混合公式,我们得到最终要存储在帧缓冲中的像素颜色为:
(RsRd , GsGd ,BsBd,AsAd),从中我们可以看出,如果目标像素的黑色区域混后依然为黑色,因为和0相乘结果仍然为0。如果不是黑色区域就保持原状。
4 设置目标像素。
把我们的二值图像即上面那个黑色雪花设为目标像素,通过第3步设置的混合因子,我们就得到了下图:
5 给黑色雪花贴上颜色
这里又使用了混合:glBlendFunc(GL_ONE, GL_ONE); 带入的公式得到的结果为:
(Rs + Rd ,Gs + Gd ,Bs + Bd ,As + Ad )当我们添加蓝色雪花纹理时候,雪花就变成蓝色了,因为0+Xd,还是Xd,注意这里蓝色雪花和原来的黑色雪花masking是同等大小。如果大小不一就会区分开来。
另外这一节还介绍了纹理坐标的有关知识,texture coordinate (0.3, 0.5) for instance, maps to the exact same pixel in the texture image as coordinate (1.3, 0.5), or as (12.3, -2.5)。
当roll是不断变化的,那么下面将绘制不断滚动的纹理:
glBegin(GL_QUADS);
glTexCoord
glTexCoord
glTexCoord
glTexCoord
glEnd();