在制作Bejeweled游戏过程中遇到的问题及解决方法 2

     在上一节里,本以为绘制图片的透明效果需要当前屏幕的显示内容作为加工条件,但是在NEHE的教程32里才发现其实没那么麻烦,关键要做两件事:
     1、在将图片的RGBA值读取到数组里后,根据其对应的mask图片,修改图片的alpha值;    
     2、函glAlphaFunc(GL_NOTEQUAL,0.0f)  (0.0f是完全透明,1.0f是完全不透明)可以保证根据参数的设置来过滤掉不满足条件的像素点,但此时必须打开混合函数glEnable(GL_BLEND),且混合函数必须设为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),即,仅仅将源图和目的图的alpha值进行混合,这样就很容易的将图片的半透明或透明部分给做出来了。
    在制作云层不断的循环飘动的时候,起初以为需要两个纹理连在一起来循环显示,其实只要做一个变量来调节纹理的映射起始坐标就可以了:
   
1 float textureScrollPos[4][2= {    {0.0f + xScroll, 0.0f + yScroll},
2                                             {1.0f + xScroll, 0.0f + yScroll},
3                                             {1.0f + xScroll, 1.0f + yScroll},
4                                             {0.0f + xScroll, 1.0f + yScroll} };
5 
6         glTexCoord2f(textureScrollPos[0][0], textureScrollPos[0][1]); glVertex3f(temp.left, temp.bottom, _view_depth);
7         glTexCoord2f(textureScrollPos[1][0], textureScrollPos[1][1]); glVertex3f(temp.right, temp.bottom, _view_depth);
8         glTexCoord2f(textureScrollPos[2][0], textureScrollPos[2][1]); glVertex3f(temp.right, temp.top, _view_depth);
9         glTexCoord2f(textureScrollPos[3][0], textureScrollPos[3][1]); glVertex3f(temp.left, temp.top, _view_depth);
    简单吧?天空里漫天星星的循环移动也是同样的方法实现的。

    当要映射的纹理仅仅是二维性的时候,即仅仅考虑屏幕的x、y像素时,应该怎么办呢?原来这时候可以用glVertex2i(GLint x, GLint y)来指定在屏幕上的坐标,但是必须切换到平行投影模式下才行。这样以来,第一篇里所写的部分内容就要修正了,因为背景等对象完全是不用考虑3d坐标的,完全可以按照当前视口的大小进行映射了!而且即使处于平行投影模式下,依然可以用glTranslatef来使其平移,不过不能在Z轴方向上看出变化罢了(平行投影当然不会了,不过可以调节其映射的2D区域来表现出放大和缩小)。
   

posted on 2009-09-08 01:42 walking snail 阅读(146) 评论(0)  编辑 收藏 引用 所属分类: 计算机图形学与OPENGL

导航

<2025年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿

随笔分类

文章分类(13)

文章档案(16)

相册

搜索

最新评论