2011-03-21 86 views
0

我試圖紋理水平的底部,但由於某種原因,代碼無法找到我的BMP文件,BMP文件與我的代碼在同一文件夾,所以即時通訊不知道是否它的問題與我的代碼,任何幫助將是巨大的OpenGL Texture issue

#include windows.h 
#include gl\gl.h 
#include glut.h 

#include stdlib.h 
#include iostream 

void init(void); 
void display(void); 
void keyboard(unsigned char, int, int); 
void resize(int, int); 
void drawcube(float, float, float, float, float, float, int); 


#define ROAD 0 


struct Image 
{ 
    unsigned long size_x; 
    unsigned long size_y; 
    char *data; 
}; 

typedef struct Image Image; 

const int textureCount = 1; 

Image myTextureData[textureCount]; 
GLuint theTexture[textureCount]; 


char* textureFilenames[textureCount] = {"road.bmp"}; 

int is_depth; 

int main (int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(600, 600); 
    glutInitWindowPosition(40, 40); 
    glutCreateWindow("3D World"); 
    init(); 
    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 
    glutReshapeFunc(resize); 

    glEnable(GL_TEXTURE_2D); 

    glutMainLoop(); 
    return 0; 
} 

void init(void) 
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_MODELVIEW); 

    is_depth = 1; 
} 
int imageLoader(const char *filename, Image *image) 
{ 
    FILE *file; 

    unsigned long size; 
    unsigned long i; 
    unsigned short int planes; 
    unsigned short int bpp; 

    char temp; 
    char finalName[80]; 

    glTexCoord2f(1.0, 0.0); 

    strcpy(finalName, ""); 
    strcat(finalName, filename); 

    if ((file = fopen(finalName, "rb"))==NULL) 
    { 
     printf("File Not Found : %s\n",finalName); 
     return 0; 
    } 

    fseek(file, 18, SEEK_CUR); 

    glTexCoord2f(1.0, 0.0); 

    if ((i = fread(&image->size_x, 4, 1, file)) != 1) 
    { 
     printf("Error reading width from %s.\n", finalName); 
     return 0; 
    } 

    if ((i = fread(&image->size_y, 4, 1, file)) != 1) 
    { 
     printf("Error reading height from %s.\n", finalName); 
     return 0; 
    } 

    size = image->size_x * image->size_y * 3; 

    if ((fread(&planes, 2, 1, file)) != 1) 
    { 
     printf("Error reading planes from %s.\n", finalName); 
     return 0; 
    } 

    if (planes != 1) 
    { 
     printf("Planes from %s is not 1: %u\n", finalName, planes); 
     return 0; 
    } 

    if ((i = fread(&bpp, 2, 1, file)) != 1) 
    { 
     printf("Error reading bpp from %s.\n", finalName); 
     return 0; 
    } 

    if (bpp != 24) 
    { 
     printf("Bpp from %s is not 24: %u\n", finalName, bpp); 
     return 0; 
    } 

    fseek(file, 24, SEEK_CUR); 

    image->data = (char *) malloc(size); 

    if (image->data == NULL) 
    { 
     printf("Error allocating memory for color-corrected image data"); 
     return 0; 
    } 

    if ((i = fread(image->data, size, 1, file)) != 1) 
    { 
     printf("Error reading image data from %s.\n", finalName); 
     return 0; 
    } 

    for (i=0;i<size;i+=3) 
    { 
     temp = image->data[i]; 
     image->data[i] = image->data[i+2]; 
     image->data[i+2] = temp; 
    } 
    return 1; 
} 

void textureLoader() 
{ 

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    for(int k=0; k < textureCount; k++) 
    { 
     if(!imageLoader(textureFilenames[k], &myTextureData[k])) 
      exit(1); 


     glGenTextures(1, &theTexture[k]); 

     glBindTexture(GL_TEXTURE_2D, theTexture[k]); 


     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); 
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); 

     gluBuild2DMipmaps(GL_TEXTURE_2D, 3, myTextureData[k].size_x, myTextureData[k].size_y, GL_RGB, GL_UNSIGNED_BYTE, myTextureData[k].data); 
    } 
} 
void display(void) 
{ 

    if (is_depth) 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    else 
     glClear(GL_COLOR_BUFFER_BIT); 

    textureLoader(); 

    glBegin(GL_QUADS); 
     glTexCoord2f(0.0,0.0); 
     glVertex3f(-75.0, 0.0, -400.0); 
     glTexCoord2f(0.0,1.0); 
     glVertex3f(-75.0, 0.0, 100.0); 
     glTexCoord2f(1.0,1.0); 
     glVertex3f(75.0, 0.0, 100.0); 
     glTexCoord2f(1.0,1.0); 
     glVertex3f(75.0, 0.0, -400.0); 

     drawcube(-70,15,72,8,15,28,0); 
     drawcube(-70,10,10,8,10,28,0); 
     drawcube(-70,15,-45,8,15,18,0); 
     drawcube(-70,15,-85,8,15,18,0); 
     drawcube(-70,35,-125,8,35,12,0); 
     drawcube(-70,9,-170,8,9,28,0); 
     drawcube(-70,15,-220,8,15,18,0); 
     drawcube(-70,15,-265,8,15,28,0); 
     drawcube(-70,15,-330,8,15,28,0); 
     drawcube(67,15,72,8,15,28,0); 
     drawcube(67,10,10,8,10,28,0); 
     drawcube(67,15,-45,8,15,18,0); 
     drawcube(67,15,-85,8,15,18,0); 
     drawcube(67,35,-125,8,35,12,0); 
     drawcube(67,9,-170,8,9,28,0); 
     drawcube(67,15,-220,8,15,18,0); 
     drawcube(67,15,-265,8,15,28,0); 
     drawcube(67,15,-330,8,15,28,0); 
     drawcube(-33,18,-364,25,18,10,0); 
     drawcube(25,28,-364,30,28,10,0); 
     drawcube(25,28,90,30,28,10,0); 
     drawcube(-33,18,90,25,18,10,0); 
     drawcube(0,60,-125,18,60,22,0); 
     drawcube(0,25,-225,8,25,28,0); 
     drawcube(0,25,0,8,25,28,0); 
     drawcube(-58,1,-135,4,0.5,215,0); 
     drawcube(58,1,-135,4,0.5,215,0); 
     drawcube(0,1,-345,60,0.5,4,0); 
     drawcube(0,1,75,60,0.5,4,0);   



    glEnd(); 


    glutSwapBuffers(); 
} 

void keyboard(unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 
    case 'a': 
     glTranslatef(5.0, 0.0, 0.0); 
     break; 
    case 'd': 
     glTranslatef(-5.0, 0.0, 0.0); 
     break; 
    case 'w': 
     glTranslatef(0.0, 0.0, 5.0); 
     break; 
    case 's': 
     glTranslatef(0.0, 0.0, -5.0); 
     break; 
    } 
    display(); 
} 

void resize(int width, int height) 
{ 
    if (height == 0) height = 1; 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    gluPerspective(45.0, width/height, 1.0, 400.0); 
    glTranslatef(0.0, -5.0, -150.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

void drawcube(float xc, float yc, float zc, float x_offset, float y_offset, float z_offset, int color) 
{ 

    switch(color) 
    { 
    case 1: 
     glColor3f(1.0,0.0,0.0); 
     break; 
    case 2: 
     glColor3f(0.0,1.0,0.0); 
     break; 
    case 3: 
     glColor3f(0.0,0.0,1.0); 
     break; 
    } 
    glBegin(GL_QUADS); 
     glVertex3f(xc - x_offset,yc - y_offset,zc - z_offset); 
     glVertex3f(xc + x_offset,yc - y_offset,zc - z_offset); 
     glVertex3f(xc + x_offset,yc + y_offset,zc - z_offset); 
     glVertex3f(xc - x_offset,yc + y_offset,zc - z_offset); 

     glVertex3f(xc + x_offset,yc + y_offset,zc - z_offset); 
     glVertex3f(xc + x_offset,yc + y_offset,zc + z_offset); 
     glVertex3f(xc + x_offset,yc - y_offset,zc + z_offset); 
     glVertex3f(xc + x_offset,yc - y_offset,zc - z_offset); 

     glVertex3f(xc - x_offset,yc - y_offset,zc + z_offset); 
     glVertex3f(xc - x_offset,yc - y_offset,zc - z_offset); 
     glVertex3f(xc - x_offset,yc + y_offset,zc - z_offset); 
     glVertex3f(xc - x_offset,yc + y_offset,zc + z_offset); 

     glVertex3f(xc + x_offset,yc + y_offset,zc - z_offset); 
     glVertex3f(xc - x_offset,yc + y_offset,zc - z_offset); 
     glVertex3f(xc - x_offset,yc + y_offset,zc + z_offset); 
     glVertex3f(xc + x_offset,yc + y_offset,zc + z_offset); 

     glVertex3f(xc - x_offset,yc - y_offset,zc + z_offset); 
     glVertex3f(xc + x_offset,yc - y_offset,zc + z_offset); 
     glVertex3f(xc + x_offset,yc - y_offset,zc - z_offset); 
     glVertex3f(xc - x_offset,yc - y_offset,zc - z_offset); 

     glVertex3f(xc + x_offset,yc + y_offset,zc + z_offset); 
     glVertex3f(xc - x_offset,yc + y_offset,zc + z_offset); 
     glVertex3f(xc - x_offset,yc - y_offset,zc + z_offset); 
     glVertex3f(xc + x_offset,yc - y_offset,zc + z_offset); 


    glEnd(); 
} 
+0

您提到位圖與代碼位於同一文件夾中。但是,在這種情況下,您希望位圖位於執行程序的文件夾中。你確定嗎? 你可以做的事情調試這是a)硬編碼紋理的路徑,b)使用getcwd()或chdir()(或類似的在您的平臺上),以確保您的代碼從正確的目錄運行。這兩者中的任何一個應該都會爲您提供有關您問題的更多信息。 – 2011-03-21 22:12:17

回答

0

如果您使用Visual Studio中,右鍵CLIC您的項目,設置,調試和設置您的工作目錄到你的形象代表的目錄。

如果您使用其他IDE,請查找類似的設置。

如果您從控制檯運行您的應用程序,請轉到您的映像目錄,然後從此處運行您的應用程序。使用../如果需要導航到您的應用程序。

0

代碼中的文件路徑將與您的可執行文件有關。如果您通過IDE運行程序,則IDE可以指定一個不同的「工作目錄」,文件路徑將與此相關。

要更正您的問題,請更改代碼中的路徑或移動文件系統中的文件。或者,您可以使用IDE將工作目錄設置爲與Calvin1602建議的映像相同的位置。

一個典型的設置是將數據目錄放在與您的可執行文件相同的位置,並存儲您要加載的文件。