2012-03-11 36 views
0

现在,我将六种不同的纹理应用于OpenGL中六个立方体的传真,但结果看起来不正确。我从我的磁盘加载了6个bmp图片,它们的大小都是256 * 256。并且我使用了SOIL(简单的OpenGL图像库:可以在这里下载:http://nehe.gamedev.net/tutorial/lesson_06_texturing_update/47002/)加载bmp图片来构建纹理。对立方体的六个面应用不同的纹理,但有些错误

现在我在这里列出我的代码:

#include <GL/glut.h> 
#include <stdio.h> 
#include <stdlib.h> 

#include "SOIL.h" 

GLuint texture[6];//6 textures for 6 faces of the cube 

GLfloat xRot,yRot,zRot;//control cube's rotation 

//load the bitmap and convert it into a texture 
int LoadGLTextures() 
{ 
int Status = 0; 
char *bmpFile[6] =   {"BmpFile/Ferrary.bmp","BmpFile/Honda.bmp","BmpFile/Hust.bmp", 
    "BmpFile/Lamborghini.bmp","BmpFile/NeHe.bmp","BmpFile/Porsche.bmp"}; 
for (int i = 0;i < 6;++i) 
{ 
    texture[i] = SOIL_load_OGL_texture(
     bmpFile[i], 
     SOIL_LOAD_AUTO, 
     SOIL_CREATE_NEW_ID, 
     SOIL_FLAG_INVERT_Y); 
    printf("texture[%d]: %d\n",i,texture[i]); 
    if(texture[i] == 0) 
     Status = 0; 
    glBindTexture(GL_TEXTURE_2D,texture[i]); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
} 

return Status; 
} 

int init() 
{ 
glEnable(GL_TEXTURE_2D); 
if(!LoadGLTextures()) 
    return 0; 
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 1; 
} 

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); 

//glRotatef(45,1.0f,0.0f,0.0f); 
//glRotatef(45,0.0f,1.0f,0.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); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D,texture[1]); 
glBegin(GL_QUADS); 
// Back Face 
// 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); 
// Bottom Left Of The Texture and Quad 
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D,texture[2]); 
glBegin(GL_QUADS); 
// Top Face 
// Top Left Of The Texture and Quad 
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); 
// 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); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D,texture[3]); 
glBegin(GL_QUADS); 
// Bottom Face 
// 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); 
// 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); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D,texture[4]); 
glBegin(GL_QUADS); 
// Right face 
// 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); 
// Bottom Left Of The Texture and Quad 
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D,texture[5]); 
glBegin(GL_QUADS); 
// Left 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); 
glEnd(); 

/*xRot += 0.3f; 
yRot += 0.4f; 
zRot += 0.5f;*/ 

glutSwapBuffers(); 
} 

void reshape(int w,int h) 
{ 
if (0 == h) 
    h = 1; 

glViewport(0,0,(GLsizei)w,(GLsizei)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; 
} 

这是结果运行后:

http://hi.csdn.net/attachment/201203/11/2712336_1331434358OPyZ.jpg

正确的结果应该是:

http://hi.csdn.net/attachment/201203/11/2712336_1331434425901v.jpg

莫非有人告诉我为什么?是索姆在我的代码错了吗?

回答

5

你实际上有几个错误。第一个错误是,当您在"Ferrary.bmp"中输入时,拼写错误的法拉利,这就是为什么您的立方体缺少一张脸。你的第二个错误是LoadGLTextures总是返回0。我想你的意思是将Status初始化为1,而不是0

因此,两者都是因为Status已正确初始化并且您加载错误的BMP,您的LoadGLTextures函数失败并返回0。这会导致您的init功能在拨打LoadGLTextures后退出,甚至在达到glShadeModel之前。由于它会跳过所有其他的初始化函数,因此您也会看到不正确的视角。这会导致你的第三个错误,那就是你从未检查过init的返回值,因此错过了它失败的事实。

道德故事:总是检查每一个返回值并打印诊断错误消息。

+0

非常感谢。我的错是我错误地将变量状态初始化为0.我真的很粗心~~~ – XiaJun 2012-03-11 07:51:14

相关问题