2012-04-30 12 views
5

lo scopo del mio programma è di visualizzare 2 quad con 2 trame diverse. Il problema è che la texture più vecchia caricata è impostata sui due quad (solo texQuadB). Ho provato a sostituire i due call di buf [3] di texQuadA e texQuadB ma non funziona. Non riesco a trovare il modo giusto per legare una trama con uno specifico VBO.Il binding della trama con VBO non funziona correttamente

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

GLfloat verticesQuadA[12] = 
{ 
    -1.0f, 0.0f, 1.0f, 
    -1.0f, 1.0f, 1.0f, 
    0.0f, 1.0f, 1.0f, 
    0.0f, 0.0f, 1.0f, 
}; 

GLfloat verticesQuadB[12] = 
{ 
    0.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 
    1.0f, 0.0f, 1.0f, 
}; 

GLfloat colors[12] = 
{ 
    1.0f, 0.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 
    1.0f, 0.0f, 1.0f, 
}; 

GLfloat texture[8] = 
{ 
    0.0f, 0.0f, 
    1.0f, 0.0f, 
    1.0f, 1.0f, 
    0.0f, 1.0f 
}; 

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 buf[4]; 
    GLuint texQuadA, texQuadB; 

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

    texQuadA = loadTexture("caisse.jpg"); 
    texQuadB = loadTexture("metal.jpg"); 

    //glBindTexture(GL_TEXTURE_2D, texQuadA); 
    //glBindTexture(GL_TEXTURE_2D, texQuadB); 

    glGenBuffers(4, buf); 

    glBindBuffer(GL_ARRAY_BUFFER, buf[0]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticesQuadA), verticesQuadA, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, buf[1]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticesQuadB), verticesQuadB, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, buf[2]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, buf[3]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(texture), texture, GL_STATIC_DRAW); 

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

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glEnable(GL_TEXTURE_2D); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

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

     //Draw Quad A --------------------------------------- 

     glBindBuffer(GL_ARRAY_BUFFER, buf[0]); 
     glVertexPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0)); 

     glBindBuffer(GL_ARRAY_BUFFER, buf[2]); 
     glColorPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0)); 

     glBindBuffer(GL_ARRAY_BUFFER, buf[3]); 
     glTexCoordPointer(2, GL_FLOAT, 0, OFFSET_BUFFER(0)); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glEnableClientState(GL_COLOR_ARRAY); 
     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

     glDrawArrays(GL_QUADS, 0, 4); 

     glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
     glDisableClientState(GL_COLOR_ARRAY); 
     glDisableClientState(GL_VERTEX_ARRAY); 

     //Draw Quad B --------------------------------------- 

     glBindBuffer(GL_ARRAY_BUFFER, buf[1]); 
     glVertexPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0)); 

     glBindBuffer(GL_ARRAY_BUFFER, buf[2]); 
     glColorPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0)); 

     glBindBuffer(GL_ARRAY_BUFFER, buf[3]); 
     glTexCoordPointer(2, GL_FLOAT, 0, OFFSET_BUFFER(0)); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glEnableClientState(GL_COLOR_ARRAY); 
     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

     glDrawArrays(GL_QUADS, 0, 4); 

     glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
     glDisableClientState(GL_COLOR_ARRAY); 
     glDisableClientState(GL_VERTEX_ARRAY); 

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

     glFlush(); 
     SDL_GL_SwapBuffers(); 
    } 
    glDeleteBuffers(3, buf); 
    glDisable(GL_TEXTURE_2D); 
    SDL_Quit(); 

    return 0; 
} 

risposta

7

OpenGL è una macchina a stati. Legare una trama è l'impostazione di parte di quello stato. Quando le trame sono abilitate, OpenGL utilizzerà lo stato attuale della trama (l'ultima trama vincolata) quando si traccerà la geometria. Prima di disegnare Quad A, associare texQuadA. Prima di disegnare Quad B, associare texQuadB:

glBindTexture(GL_TEXTURE_2D, texQuadA); 
// Draw Quad A 

glBindTexture(GL_TEXTURE_2D, texQuadB); 
// Draw Quad B 

I VBO non sono correlati in questo caso.

+0

Sì, certo che era uno stupido post lol. Grazie mille per la risposta rapida. Ciao. – user1364743

1

I VBO non hanno alcuna interazione con gli oggetti texture. Associare un VBO non lo associa a una trama.

Per selezionare quale trama si desidera utilizzare per il disegno, si chiami glBindTexture prima di utilizzare i comandi di disegno che lo utilizzano.

Problemi correlati