#include <stdio.h> 

 #include <windows.h> 
 // Header File For Windows 

 #include <gl\gl.h> 
 // Header File For The OpenGL32 Library 

 #include <gl\glu.h> 
 // Header File For The GLu32 Library 

 #include <gl\glut.h>// Header File For The Glaux Library 

 #include<gl\GLAUX.H> 

 #include <WinGDI.h> 



 GLfloat xrot; 

 GLfloat yrot; 

 GLfloat zrot; 



 GLuint texture[1]; 



 AUX_RGBImageRec *LoadBMP(char *Filename)//放在ResizeGLScene()之前  用来加载位图 

 { 

FILE *File = NULL; 

if(!Filename) 

{ 

return NULL; 

} 

File = fopen(Filename , "r"); 

if(File) 

{ 

fclose(File); 

return auxDIBImageLoad(Filename); 

} 

return NULL; 

 } 



 int LoadGLTextures()// 载入位图(调用上面的代码)并转换成纹理 

 { 

int Status = false;//状态指示器 

 

AUX_RGBImageRec *TextureImage[1];//创建纹理的存储空间 

 

memset(TextureImage, 0, sizeof(void *)*1);//将指针设为NULL 

 

if(TextureImage[0] = LoadBMP("Data/Nehe.bmp")) 

{ 

Status = TRUE; 

 

//glGenTextures(1, &texture[0]) 告诉OpenGL我们想生成一个纹理名字(如果您想载入多个纹理,加大数字)。 

glGenTextures(1, &texture[0]);//创建纹理 

 

glBindTexture(GL_TEXTURE_2D, texture[0]); 

 

//使用来自位图数据生成的典型纹理 

glBindTexture(GL_TEXTURE_2D, texture[0]);



/*参数“0”代表图像的详细程度,通常就由它为零去了。参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据三种组分组成。 TextureImage[0]->sizeX 是纹理的宽度。如果您知道宽度,您可以在这里填入,但计算机可以很容易的为您指出此值。 TextureImage[0]->sizey 是纹理的高度。参数零是边框的值,一般就是“0”。 GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。
GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。最后... TextureImage[0]->data 告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage[0] 记录中的数据。*/

glTexImage2D(GL_TEXTURE_2D, 0 ,3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data );//创建纹理

/*下面的两行告诉OpenGL在显示图像时,当它比放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式。通常这两种情况下我都采用 GL_LINEAR 。这使得纹理从很远处到离屏幕很近时都平滑显示。使用 GL_LINEAR 需要CPU和显卡做更多的运算。如果您的机器很慢,您也许应该采用 GL_NEAREST 。过滤的纹理在放大的时候,看起来斑驳的很『译者注:马赛克啦』。您也可以结合这两种滤波方式。在近处时使用 GL_LINEAR ,远处时 GL_NEAREST 。*/

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

 

} 

 

if(TextureImage[0]) 

{ 

if(TextureImage[0]->data) 

{ 

free(TextureImage[0]->data); 

} 

free(TextureImage[0]); 

 

} 

return status; 

 

 

 } 





 int InitGL(GLvoid) 
 // 此处开始对OpenGL进行所有设置 



 { 



if (!LoadGLTextures()) 
 // 调用纹理载入子例程 



{ 



return FALSE; 
  // 如果未能载入,返回FALSE 



} 



glEnable(GL_TEXTURE_2D); 
 // 启用纹理映射 

glShadeModel(GL_SMOOTH); 
 // 启用阴影平滑 

glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
 // 黑色背景 

glClearDepth(1.0f); 
 // 设置深度缓存 

glEnable(GL_DEPTH_TEST); 
 // 启用深度测试 

glDepthFunc(GL_LEQUAL); 
 // 所作深度测试的类型 

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
 // 真正精细的透视修正 

return TRUE; 
  // 初始化 OK 

 } 



 int DraeGLScene(GLvoid) 

 { 

glCLear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glLoadIdentity(); 

glTranslatef(0.0f, 0.0f, -5.0f); 

 

glRotatef(xrot,1.0f,0.0f,0.0f); 
 // 绕X轴旋转 

glRotatef(yrot,0.0f,1.0f,0.0f); 
 // 绕Y轴旋转 

glRotatef(zrot,0.0f,0.0f,1.0f);



/*下一行代码选择我们使用的纹理。如果您在您的场景中使用多个纹理,您应该使用来 glBindTexture(GL_TEXTURE_2D, texture[ 所使用纹理对应的数字 ]) 选择要绑定的纹理。当您想改变纹理时,应该绑定新的纹理。有一点值得指出的是,您不能在 glBegin() 和 glEnd() 之间绑定纹理,必须在 glBegin() 之前或 glEnd() 之后绑定。注意我们在后面是如何使用 glBindTexture 来指定和绑定纹理的。*/
glBindTexture(GL_TEXTURE_2D, texture[0]);

/*为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。 
glTexCoord2f 的第一个参数是X坐标。 0.0f 是纹理的左侧。 0.5f 是纹理的中点, 1.0f 是纹理的右侧。 glTexCoord2f 的第二个参数是Y坐标。 0.0f 是纹理的底部。 0.5f 是纹理的中点, 1.0f 是纹理的顶部。


所以纹理的左上坐标是 X:0.0f,Y:1.0f ,四边形的左上顶点是 X: -1.0f,Y:1.0f 。其余三点依此类推。


试着玩玩 glTexCoord2f 的X,Y坐标参数。把 1.0f 改为 0.5f 将只显示纹理的左半部分,把 0.0f 改为 0.5f 将只显示纹理的右半部分。

*/ 

glBegin(GL_QUADS); 



// 前面 



glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); 
 // 纹理和四边形的左下 



glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); 
 // 纹理和四边形的右下 



glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); 
 // 纹理和四边形的右上 



glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); 
 // 纹理和四边形的左上 



// 后面 



glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
 // 纹理和四边形的右下 



glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); 
 // 纹理和四边形的右上 



glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); 
 // 纹理和四边形的左上 



glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); 
 // 纹理和四边形的左下 



// 顶面 



glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); 
 // 纹理和四边形的左上 



glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f); 
 // 纹理和四边形的左下 



glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f); 
 // 纹理和四边形的右下 



glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); 
 // 纹理和四边形的右上 



// 底面 



glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
 // 纹理和四边形的右上 



glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); 
 // 纹理和四边形的左上 



glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); 
 // 纹理和四边形的左下 



glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); 
 // 纹理和四边形的右下 



// 右面 



glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); 
 // 纹理和四边形的右下 



glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); 
 // 纹理和四边形的右上 



glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); 
 // 纹理和四边形的左上 



glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); 
 // 纹理和四边形的左下 



// 左面 



glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
 // 纹理和四边形的左下 



glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); 
 // 纹理和四边形的右下 



glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); 
 // 纹理和四边形的右上 



glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); 
 // 纹理和四边形的左上 



glEnd(); 



 xrot+=0.3f; 

yrot+=0.2f; 

zrot+=0.4f; 

return TRUE; 

 }




>002.obj : error LNK2019: 无法解析的外部符号 _auxDIBImageLoadA@4,该符号在函数 "struct _AUX_RGBImageRec * __cdecl LoadBMP(char *)" (?LoadBMP@@YAPAU_AUX_RGBImageRec@@PAD@Z) 中被引用

1>d:\users\lenovo\documents\visual studio 2010\Projects\2\Debug\2.exe : fatal error LNK1120: 1 个无法解析的外部命令

解决方法:


项目——属性——配置属性——链接器——输入——附加依赖项——OpenGL32.lib GLu32.lib 和 GLaux.lib



另付GLglaux配置方法:


(1) 把 glaux.dll、glut32.dll、glut.dll 拷贝到C:\WINDOWS\system32目录下,system32目录下应该已经有 opengl32.dll、glu32.dll了。 
(2) 把 GL.H、GLAUX.h、glu.h、glut.h 拷贝到 C:\Program Files\Microsoft Visual Studio 9.0\VC\include\gl 
(3) 把 GLAUX.LIB、Glu32.lib、glut32.lib、Opengl32.lib,glut.lib 拷贝到 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib