2011-03-29 172 views
0

我嘗試2個紋理應用到我的水平的代碼編譯,但水平出來完全地白,OpenGL紋理

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

typedef struct Image Image; 

const int textureCount = 2; 

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

char* textureFilenames0[textureCount] = {"road.bmp"}; 
char* textureFilenames1[textureCount] = {"building.bmp"}; 

質地裝載機類

void textureLoader() 
{ 

    /*glPixelStorei(GL_UNPACK_ALIGNMENT, 1);*/ 

    glGenTextures(2, theTexture); 


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

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

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

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

回答

1

你打電話

glEnable(GL_TEXTURE_2D); 

glTexCoord2glTexCoordPointer

另外,請在上傳數據前嘗試設置紋理參數。

最後,使用循環時,你需要在一個陣列中所有的文件名,如

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

或者你可以擺脫循環,寫

char* textureFilenames0 = "road.bmp"; 
char* textureFilenames1 = "building.bmp"; 

但也有不textureCount文件裏面有道路位圖。

+0

處理配對,但程序如何知道要調用哪個文件以及我在哪裏調用glEnable(GL_TEXTURE_2D); – rich 2011-03-29 15:06:43

+0

@rich:你現在的代碼是錯誤的。您需要綁定紋理#k,然後加載文件#k。現在你正在將file0#k加載到紋理#0中,你的循環尋找兩個文件名,只有一個文件名,所以你最終使用了一個NULL指針並且在你的紋理之上加載了一個不存在的文件。我不知道你的紋理加載器在傳遞NULL文件名時會做什麼。在繪製紋理幾何體之前,需要完成「glEnable(GL_TEXTURE_2D)」。 – 2011-03-29 15:21:14

+0

您可以使用glBindTexture(GL_TEXTURE_2D,a_texture_ID)來告訴OpenGL使用哪個紋理。不幸的是,在上面的代碼中,使用glGenTextures分配的紋理ID似乎置於單個索引全局變量中。技術上來說,textureLoader應該返回紋理的值,以便稍後在渲染時綁定它。 – datenwolf 2011-03-29 15:21:31