2011-10-01 15 views
5

ओपनजीएल (विशेष रूप से ओपनजीएल ईएस 2.0) में, glVertexAttribPointer प्रत्येक बार एक नया वीबीओ बंधे जाने की आवश्यकता है?GlVertexAttribPointer हर बार glBindBuffer कहा जाता है?

उदाहरण के लिए:

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer1); 

glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertexStruct), (void*)offsetof(vertexStruct,position)); 
glEnableVertexAttribArray(ATTRIB_POSITION); 
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexStruct), (void*)offsetof(vertexStruct,color); 
glEnableVertexAttribArray(ATTRIB_COLOR); 

glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, (void*)0); 

// If vertexBuffer2 has the exact same attributes as vertexBuffer1 
// is this legal or do the calls to glVertexAttribPointer (and glEnableVertexAttribArray) 
// required again? 

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer2); 
glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, (void*)0); 

मुझे पता है कि VAOs कि glVertexAttribPointer कॉल करने के लिए नहीं होने को संबोधित कर रहे है कि लेकिन अगर यह ओपन में क्या करना ठीक है मैं सोच रहा हूँ?

उत्तर

8

आप इस किया है:

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer1); 

glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertexStruct), (void*)offsetof(vertexStruct,position)); 
glEnableVertexAttribArray(ATTRIB_POSITION); 
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexStruct), (void*)offsetof(vertexStruct,color); 
glEnableVertexAttribArray(ATTRIB_COLOR); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, (void*)0); 

आपका कोड ठीक काम करेगा। gl*Pointer कॉलों में से सभी को GL_ARRAY_BUFFERमें संग्रहीत किया जाता है, जब फ़ंक्शन को कहा जाता है, और उस बफर और उस विशेषता के बीच एक सहयोग बनाते हैं। तो एक विशेषता के लिए कौन सा बफर उपयोग किया जाता है, इसे बदलने का एकमात्र तरीका gl*Pointer पर कॉल करना है।

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