2012-05-01 55 views
0

我的程序的目的是加載並顯示每個面上具有相同紋理的簡單立方體。但問題是輸出不是很好(只有4個面的紋理是正確的)。我在紋理數組中嘗試了許多座標組合,但大多數時候情況更糟。是否可以使用函數glDrawElements正確設置紋理?Coord紋理數組無法正確使用glDrawElements

#define OFFSET_BUFFER(bytes) ((GLfloat *)NULL + bytes) 

GLfloat vertices[] = 
{ 
    -1.0, -1.0, -1.0, 
    1.0, -1.0, -1.0, 
    1.0, 1.0, -1.0, 
    -1.0, 1.0, -1.0, 
    -1.0, -1.0, 1.0, 
    1.0, -1.0, 1.0, 
    1.0, 1.0, 1.0, 
    -1.0, 1.0, 1.0, 
}; 

GLubyte indices[] = 
{ 
    0, 1, 2, 3, 
    4, 7, 6, 5, 
    0, 4, 5, 1, 
    3, 2, 6, 7, 
    0, 3, 7, 4, 
    1, 5, 6, 2 
}; 

GLfloat textures[] = 
{ 
    0,0, 1,0, 1,1, 0,1, 
    0,1, 1,1, 1,0, 0,0, 
    /*//0,0, 1,0, 1,1, 0,1, 
    //0,0, 1,0, 1,1, 0,1, 
    0,1, 1,1, 1,0, 0,0, 
    0,1, 1,1, 1,0, 0,0, 
    //0,0, 1,0, 1,1, 0,1*/ 
}; 

int main(int argc, char *argv[]) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_WM_SetCaption("Texture Mapping",NULL); 
    SDL_SetVideoMode(500, 500, 32, SDL_OPENGL); 

    bool continuer = true; 
    SDL_Event event; 
    GLuint texCube; 

    glClearDepth(1.0f); 
    glClearColor(0.1f, 0.1f, 0.1f, 0.1f); 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(70.0f, (float)500.0f/(float)500.0f, 1.0f, 3000.0f); 
    glewInit(); 

    texCube = loadTexture("caisse.jpg"); 
    glBindTexture(GL_TEXTURE_2D, texCube); 

    glEnable(GL_TEXTURE_2D); 

    while (continuer) 
    { 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     SDL_WaitEvent(&event); 
     switch(event.type) 
     { 
      case SDL_QUIT: 
       continuer = false; 
     } 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     gluLookAt(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 

     //Draw Cube --------------------------------------- 

     glPushMatrix(); 
     glRotatef(45.0f, 1.0f, 1.0f, 0.0f); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glVertexPointer(3, GL_FLOAT, 0, vertices); 

     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glTexCoordPointer(2, GL_FLOAT, 0, textures); 

     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indices); 

     glDisableClientState(GL_VERTEX_ARRAY); 
     glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

     //------------------------------------------------- 

     glPopMatrix(); 

     glFlush(); 
     SDL_GL_SwapBuffers(); 
    } 

    glDisable(GL_TEXTURE_2D); 
    SDL_Quit(); 

    return 0; 
} 

回答

5

您試圖只使用8個頂點。爲了獲得正確的紋理,你必須使用12個獨立的三角形,每個三角形都帶有「正確的」紋理座標。問題是當你試圖將平面地圖繪製成與球體同胚的東西(例如,你的情況下的立方體)時,你會得到像這樣的「麻煩」。因此,將立方體分成12個三角形(是的,它們將共享座標),並使用其中一種映射方法計算紋理座標。

看到這裏映射的詳細信息:

http://local.wasp.uwa.edu.au/~pbourke/texture_colour/texturemap/

回答你的問題「是否有可能與功能glDrawElements正確設置紋理或不呢?」是「是的,但你必須改變陣列的佈局」。

更有甚者,還有已經寫在這個網站的解決方案: Problems texturing a cube

頂點和紋理的詳細布局座標放在這裏:http://blogs.msdn.com/b/dawate/archive/2011/01/20/constructing-drawing-and-texturing-a-cube-with-vertices-in-xna-on-windows-phone-7.aspx