2012-03-11 3 views
0

OpenGLのキューブの6つのファックスに6種類のテクスチャを適用しますが、結果は正しく表示されません。私は私のディスクから6枚のbmp画像を読み込み、そのサイズはすべて256 * 256です。私はSOIL(Simple OpenGL Image Library:これはここからダウンロードできます:http://nehe.gamedev.net/tutorial/lesson_06_texturing_update/47002/)を使ってテクスチャを構築するためのbmp画像をロードしました。キューブの6つの面に異なるテクスチャを適用しますが、何かが間違っています

今私はここに私のコードをリスト:

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

を右結果は次のようになります:

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

でし

#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; 
} 

これは、実行後の結果であります誰かがなぜ私に言いますか?私のコードで何か間違っていますか?

答えて

5

実際にはいくつかのバグがあります。最初のバグは、"Ferrary.bmp"と入力したときフェラーリのスペルミスがあり、キューブに1つの顔が欠落しているということです。あなたの2番目のバグは、LoadGLTexturesが常に0を返すことです。私はあなたがStatus1に初期化しようとしていると思いますが、0ではありません。

Statusが正しく初期化され、間違ったBMPを読み込んでいるため、LoadGLTextures関数が失敗し、0を返します。これにより、を呼び出す前にinit関数が終了し、その後にもglShadeModelになることがあります。残りの初期化関数をすべてスキップするので、間違った視点も得られます。これは、戻り値initを調べたことがなく、失敗したという事実を見逃したという3番目のバグにつながります。

ストーリーのモラル:常に1つの戻り値をチェックして、診断エラーメッセージを表示してください。

+0

ありがとうございます。私の誤りは、間違って変数Statusを0に初期化することです。私はとても不注意です~~~ – XiaJun

関連する問題