在上一节里,本以为绘制图片的透明效果需要当前屏幕的显示内容作为加工条件,但是在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区域来表现出放大和缩小)。