效果图如上:
步骤:略。
常见问题:
1、编译提示"gl/glaux.h"不存在,多发生在VS2008版本以上。
解决办法:下载包含"glaux.h"的库文件。
下载地址:http://yunpan.cn/cKZPLCcQufqRi 访问密码 ba74
2、运行时提示”text1.bmp“打开失败。
解决办法:将2个贴图文件放在项目文件夹下,如:X:...\Textures1\textures1内。
实现代码如下:
main.cpp
1 /********************************************************************** 2 3 Texture mapping with OpenGL 4 5 June, 13th, 2000 6 7 This tutorial was written by Philipp Crocoll 8 Contact: 9 philipp.crocoll@web.de 10 www.codecolony.de 11 12 Every comment would be appreciated. 13 14 If you want to use parts of any code of mine: 15 let me know and 16 use it! 17 18 *********************************************************************** 19 ESC: exit 20 21 CAMERA movement: 22 w : forwards 23 s : backwards 24 a : turn left 25 d : turn right 26 x : turn up 27 y : turn down 28 v : strafe right 29 c : strafe left 30 r : move up 31 f : move down 32 b : switch between BfC and drawing the frontfaces wired 33 ***********************************************************************/ 34 35 #pragma comment ( lib , "glaux.lib" ) 36 37 #include <gl\glut.h> 38 #include <gl\glaux.h> //Used for loading the textures 39 #include <windows.h> 40 #include "camera.h" 41 #include "textures.h" 42 43 44 CCamera Camera; 45 46 GLfloat YRotated = 0.0; 47 48 COGLTexture Tex1, Tex2; 49 50 void InitTextures(void) 51 { 52 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // S方向上的贴图模式 , 图象在表面上重复出现 53 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);// t方向上的贴图模式 , 图象在表面上重复出现 54 55 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 放大过滤, 线性过滤, 使用距离当前渲染像素中心最近的4个纹素加权平均值b 56 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); // 缩小过滤, 使用GL_NEAREST对最接近当前多边形的解析度的两个层级贴图进行采样,然后用这两个值进行线性插值 57 58 Tex1.LoadFromFile("tex1.bmp"); 59 Tex2.LoadFromFile("tex2.bmp"); 60 61 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // 纹理映射方式替换 62 63 } 64 65 void DrawCube(void) 66 { 67 //Draws a cube with two shaded, two one-colored and two textured faces 68 glBegin(GL_QUADS); 69 glColor3f(1.0,0.0,0.0); 70 //front: 71 glVertex3f(-0.5,-0.5,0.5); 72 glVertex3f(-0.5,0.5,0.5); 73 glVertex3f(0.5,0.5,0.5); 74 glVertex3f(0.5,-0.5,0.5); 75 76 //back: 77 glColor3f(0.0,0.0,1.0); 78 glVertex3f(-0.5,-0.5,-0.5); 79 glVertex3f(0.5,-0.5,-0.5); 80 glVertex3f(0.5,0.5,-0.5); 81 glVertex3f(-0.5,0.5,-0.5); 82 83 //top: 84 glColor3f(0.0,0.6,1.0); 85 glVertex3f(-0.5,0.5,-0.5); 86 glVertex3f(0.5,0.5,-0.5 ); 87 glColor3f(1.0,0.6,1.0); 88 glVertex3f(0.5,0.5,0.5); 89 glVertex3f(-0.5,0.5,0.5); 90 91 //bottom: 92 glColor3f(0.0,0.6,0.0); 93 glVertex3f(-0.5,-0.5,-0.5); 94 glColor3f(0.6,0.6,0.6); 95 glVertex3f(-0.5,-0.5,0.5); 96 glColor3f(1.0,1.0,0.3); 97 glVertex3f(0.5,-0.5,0.5); 98 glColor3f(0.0,1.0,0.0); 99 glVertex3f(0.5,-0.5,-0.5); 100 glEnd(); 101 glEnable(GL_TEXTURE_2D); 102 103 Tex1.SetActive(); 104 glBegin(GL_QUADS); 105 //left: 106 glTexCoord2f(1.0,0.0); 107 glVertex3f(-0.5,-0.5,-0.5); 108 glTexCoord2f(1.0,1.0); 109 glVertex3f(-0.5,0.5,-0.5); 110 glTexCoord2f(0.0,1.0); 111 glVertex3f(-0.5,0.5,0.5); 112 glTexCoord2f(0.0,0.0); 113 glVertex3f(-0.5,-0.5,0.5); 114 glEnd(); 115 //right: 116 Tex2.SetActive(); 117 glBegin(GL_QUADS); 118 glTexCoord2f(0.0,0.0); 119 glVertex3f(0.5,-0.5,-0.5); 120 glTexCoord2f(1.0,0.0); 121 glVertex3f(0.5,-0.5,0.5); 122 glTexCoord2f(1.0,1.0); 123 glVertex3f(0.5,0.5,0.5); 124 glTexCoord2f(0.0,1.0); 125 glVertex3f(0.5,0.5,-0.5); 126 glEnd(); 127 glDisable(GL_TEXTURE_2D); 128 129 130 } 131 132 void reshape(int x, int y) 133 { 134 if (y == 0 || x == 0) return; 135 136 glMatrixMode(GL_PROJECTION); 137 glLoadIdentity(); 138 gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0); 139 140 glMatrixMode(GL_MODELVIEW); 141 glViewport(0,0,x,y); 142 } 143 144 void Display(void) 145 { 146 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 147 glLoadIdentity(); 148 Camera.Render(); 149 glRotatef(YRotated,0.0,1.0,0.0); 150 DrawCube(); 151 152 glFlush(); 153 glutSwapBuffers(); 154 155 } 156 void KeyDown(unsigned char key, int x, int y) 157 { 158 switch (key) 159 { 160 case 27: //ESC 161 PostQuitMessage(0); 162 break; 163 case 'a': 164 Camera.RotateY(5.0); 165 Display(); 166 break; 167 case 'd': 168 Camera.RotateY(-5.0); 169 Display(); 170 break; 171 case 'w': 172 Camera.MoveForwards( -0.1 ) ; 173 Display(); 174 break; 175 case 's': 176 Camera.MoveForwards( 0.1 ) ; 177 Display(); 178 break; 179 case 'x': 180 Camera.RotateX(5.0); 181 Display(); 182 break; 183 case 'y': 184 Camera.RotateX(-5.0); 185 Display(); 186 break; 187 case 'c': 188 Camera.StrafeRight(-0.1); 189 Display(); 190 break; 191 case 'v': 192 Camera.StrafeRight(0.1); 193 Display(); 194 break; 195 case 'r': 196 Camera.Move(F3dVector(0.0,0.1,0.0)); 197 Display(); 198 break; 199 case 'f': 200 Camera.Move(F3dVector(0.0,-0.1,0.0)); 201 Display(); 202 break; 203 case 'b': 204 if (glIsEnabled(GL_CULL_FACE) == GL_TRUE) 205 { 206 glDisable(GL_CULL_FACE); // 关闭剔除操作效果 207 glPolygonMode(GL_FRONT, GL_LINE); // 模式:前面为线框形 208 glPolygonMode(GL_BACK, GL_FILL); // 模式:后面为全填充 209 } 210 else 211 { 212 glEnable(GL_CULL_FACE); // 开启剔除操作效果 213 glPolygonMode(GL_FRONT, GL_FILL); // 模式:前面为全填充 214 } 215 Display(); 216 break; 217 } 218 } 219 220 221 static long long times = 0; 222 void Idle(void) 223 { 224 times++; // 延迟 225 if(times>500000) 226 times =0; 227 if(times% 500000== 0) 228 { 229 YRotated += 0.4; 230 Display(); 231 } 232 } 233 234 int main(int argc, char **argv) 235 { 236 glutInit(&argc, argv); 237 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 238 glutInitWindowSize(300,300); 239 glutCreateWindow("Textures and BfC"); 240 glFrontFace(GL_CW); //Clockwise is front in "DrawCube()" // 顺时针为 正面 241 glCullFace(GL_BACK); // 剔除操作 242 glEnable(GL_CULL_FACE); // 开启剔除操作效果 243 glEnable(GL_DEPTH_TEST); // 开启深度测试 244 Camera.Move( F3dVector(0.0, 0.0, 3.0 )); // 镜头后退3个单位 245 Camera.MoveForwards( 1.0 ); // 镜头前移1个单位,(多余?) 246 InitTextures(); 247 glutDisplayFunc(Display); 248 glutReshapeFunc(reshape); 249 glutKeyboardFunc(KeyDown); 250 glutIdleFunc(Idle); 251 glutMainLoop(); 252 return 0; 253 }
textures.cpp
1 #include "textures.h" 2 void COGLTexture::LoadFromFile(char *filename) 3 { 4 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 5 glGenTextures(1,&ID); // 1是大小,ID是纹理名指针 6 glBindTexture( GL_TEXTURE_2D, ID); // 设置名为"ID"的对象为2D纹理群的一员 7 Image = auxDIBImageLoadA( (const char*) filename ); // 载入文件,保存数据至Image指针中 8 Width = Image->sizeX; 9 Height = Image->sizeY; 10 gluBuild2DMipmaps( GL_TEXTURE_2D, 11 3, 12 Image->sizeX, 13 Image->sizeY, 14 GL_RGB, 15 GL_UNSIGNED_BYTE, 16 Image->data); // 载入Image数据到2D纹理群,和名为"ID"的对象绑定。 17 18 19 delete Image; 20 } 21 22 void COGLTexture::SetActive() 23 { 24 glBindTexture( GL_TEXTURE_2D, ID); // 2D纹理使用名为"ID"的对象 25 } 26 27 unsigned int COGLTexture::GetID() 28 { 29 return ID; 30 }
textures.h
1 #include <GL\glaux.h> 2 3 class COGLTexture 4 { 5 public: 6 _AUX_RGBImageRec *Image; 7 unsigned int GetID(); 8 void LoadFromFile(char *filename); 9 void SetActive(); 10 int GetWidth(); 11 int GetHeight(); 12 private: 13 int Width, Height; 14 unsigned int ID; 15 };
原始代码来源: http://www.codecolony.de/