2012-04-30 39 views
5

मेरे कार्यक्रम का उद्देश्य 2 अलग-अलग बनावट के साथ 2 क्वाड प्रदर्शित करना है। समस्या यह है कि लोड किया गया सबसे पुराना बनावट दो क्वाड (केवल texQuadB) पर सेट है। मैंने texQuadA और texQuadB द्वारा buf [3] के दो कॉल को प्रतिस्थापित करने का प्रयास किया लेकिन यह काम नहीं करता है। मुझे एक विशिष्ट VBO के साथ बनावट को बांधने का सही तरीका नहीं मिल रहा है।वीबीओ के साथ बाध्यकारी बनावट सही ढंग से काम नहीं करती है

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

उत्तर

7

ओपनजीएल एक राज्य मशीन है। एक बनावट बाध्यकारी उस राज्य का हिस्सा निर्धारित कर रहा है। जब बनावट सक्षम होती है, तो ओपनजीएल ज्यामिति को आकर्षित करने के लिए वर्तमान बनावट स्थिति (आपके द्वारा बाध्य अंतिम बनावट) का उपयोग करेगा। क्वाड ए खींचने से पहले, texQuadA बांधें। क्वाड बी खींचने से पहले, texQuadB को बांधें:

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

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

वीबीओ इस मामले में असंबंधित नहीं हैं।

+0

हां बेशक यह एक बेवकूफ पोस्ट लॉल था। त्वरित उत्तर के लिए बहुत बहुत धन्यवाद। अलविदा। – user1364743

1

वीबीओ के बनावट वस्तुओं के साथ कोई बातचीत नहीं है। एक वीबीओ बाध्यकारी इसे एक बनावट से संबद्ध नहीं करता है।

यह चुनने के लिए कि आप किस बनावट का उपयोग करना चाहते हैं, जिसे आप ड्रॉइंग कमांड को कॉल करने से पहले glbindTexture कहते हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^