OpenGL学习记录——旋转立方体+文件贴图

来源:互联网 发布:血色衣冠4.0武将数据 编辑:程序博客网 时间:2024/05/16 15:25

按照NeHe的教程跑到了第五课,一切都是好的,但是从第六课开始就出现了很多问题,因为他的教程是很早之前的VS版本写的,可能到现在的VS2012就会有很多编译上面的问题,fopen函数啦,还有什么“今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的”等等,调试的很纠结,搞到最后还是没有成功。当然很大的原因就是我没有好好的扎实的学习VS,所以遇到问题的时候只能抓瞎。

于是决定不在NeHe的工程里继续编译了。重新建了一个Win32 Console Application 工程,将要实现的功能移植了过去,然后处理了fopen函数,用的还是NeHe教程中的那张图片,注意把图片放过去,是放到工程目录下,也就是你的“vcxproj”文件夹下,不是解决项目的文件夹下。

旋转的功能是用“X”、“Y”、“Z”键控制的。

编译环境是VS2012,Win8(Win8和Win7其实没差啦)。

代码如下:

#include "stdafx.h"#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h>#include <stdlib.h>GLuint texture[1];//6 textures for 6 faces of the cubeGLfloat xRot,yRot,zRot;//control cube's rotation//read bmp image fileAUX_RGBImageRec *LoadBMP(char *FileName){FILE *File = NULL;if(!FileName)return NULL;fopen_s(&File,FileName,"r");if (File){fclose(File);return auxDIBImageLoad(FileName);}return NULL;}//load the bitmap and convert it into a textureint LoadGLTextures(){int Status = FALSE;    AUX_RGBImageRec *TextureImage[1] = {NULL};memset(TextureImage,0,sizeof(void*) * 1);//set the point to NULLif (TextureImage[0] = LoadBMP("Data/NeHe.bmp"))Status = TRUE;glGenTextures(1,&texture[0]);//命名纹理对象glBindTexture(GL_TEXTURE_2D,texture[0]);//绑定纹理glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);//指定纹理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 init(){if(!LoadGLTextures())return 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;}void display(){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);glRotatef(yRot,0.0f,1.0f,0.0f);glRotatef(zRot,0.0f,0.0f,1.0f);glBindTexture(GL_TEXTURE_2D,texture[0]);glBegin(GL_QUADS); // Front Face // Bottom Left Of The Texture and Quad glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // Bottom Right Of The Texture and Quad glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // Top Right Of The Texture and Quad glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // Top Left Of The Texture and Quad 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.4f;zRot += 0.5f;glutSwapBuffers();}void reshape(GLsizei w,GLsizei h){if (0 == h)h = 1;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0f,(GLfloat)w / (GLfloat)h,1,100);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void keyboard(unsigned char key,int x,int y){switch(key){case 'x':xRot += 1.0f;glutPostRedisplay();break;case 'y':yRot += 1.0f;glutPostRedisplay();break;case 'z':zRot += 1.0f;glutPostRedisplay();break;default:break;}}int main(int argc,char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(100,100);glutCreateWindow("Texture Map");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;}

运行结果如下:


原创粉丝点击