关于OpenGL的六面贴图问题
前段时间在学到NeHe关于OpenGL的教程的第六讲的时候。在最后,NeHe提到了
You should now have a better understanding of texture mapping. You should be able to texture map the surface of any quad with an image of your choice. Once you feel confident with your understanding of 2D texture mapping, try adding six different textures to the cube.
中文的意思是指“现在您应该比较好的理解纹理映射(贴图)了。您应该掌握了给任意四边形表面贴上您所喜爱的图像的技术。一旦您对2D纹理映射的理解感到自信的时候,试试给立方体的六个面贴上不同的纹理。”
于是自己开始尝试LoadGLTextures()函数来增加贴图的数量,然后映射到不同的面上。
开始做的时候一直出问题。到最后才找到问题的所在,在这里给大家介绍介绍我的一点浅见,还望见笑。
1.首先要保证图片的格式。
NeHe在第六讲中明确提到要注意 “图像的宽和高必须是2的n次方;宽度和高度最小必须是64象素;并且出于兼容性的原因,图像的宽度和高度不应超过256象素。如果您的原始素材的宽度和高度不是64,128,256象素的话,使用图像处理软件重新改变图像的大小。”
还有一点必须要注意的是图片的格式问题,这点在我贴第三个图的时候遇到了,如果想在贴图,您尽量还是用BMP的格式,但是您喜欢的图片是别的格式的话,可以用Photoshop做下转换,也就是一个另存为的功夫,很easy的。
2.关于添加和改变的代码。
首先 GLuint texture[1] 和下面相应的关于GLuint texture[1] 要变为6,因为要加载6张不同的贴图。
再次 memset(TextureImage,0,sizeof(void *)*1) 变为memset(TextureImage,0,sizeof(void *)*6)。
相应的底下内存的释放要释放6个。
3.在加载的贴图中要相应的改变。
LoadBMP() 要相应的增加6个,参数是自己想加载的图片文件。
在这个相应的if语句里面加上不同贴图glTexImage2D()函数,glTexParameteri() 函数。
注意*glGenTextures(1, &texture[0]); 中的1改为6,当然你也可以一个一个的声明,但是函数取得是地址,所以最简洁的还是加入数组的首地址。
4.最后注意的就是DrawGLScene() 函数了。
在不同的面中加载不同的glBindTexture()函数就OK了。
为了方便大家交流和学习。本人在自己写的弱弱的代码包放在这里。如果有问题的可以的看下,如果您能在这个基础上写出更好的代码,表现出更好的特效,请您教下我。呵呵~我也是刚刚菜鸟级入门。
(注)这个代码包是在NeHe lesson6的基础上修改的,这样更方便您对比着学习。
NeHe原代码包(一张贴图):代码包1
修改过的代码包(六张贴图):代码包2