SweetDream
高歌一壶新酿酒,醉抱青山不必归。
 

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 ,BsBdAsAd),从中我们可以看出,如果目标像素的黑色区域混后依然为黑色,因为和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);                         

glTexCoord2f(0.0f, -roll+0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);    // Bottom Left

glTexCoord2f(3.0f, -roll+0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);    // Bottom Right

glTexCoord2f(3.0f, -roll+3.0f); glVertex3f( 1.1f,  1.1f,  0.0f);    // Top Right

glTexCoord2f(0.0f, -roll+3.0f); glVertex3f(-1.1f,  1.1f,  0.0f);    // Top Left

glEnd();               

posted on 2006-03-06 11:49  SweetDream  阅读(378)  评论(0编辑  收藏  举报