2011-10-01 13 views
5

W OpenGL (w szczególności OpenGL ES 2.0), czy glVertexAttribPointer musi być wywoływany za każdym razem, gdy powiązany jest nowy VBO?glVertexAttribPointer potrzebny za każdym razem, gdy wywoływany jest glBindBuffer?

Na przykład:

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

Wiem, że istnieją VAOs że nie adres konieczności wzywania glVertexAttribPointer ale zastanawiam się, czy to jest ok, aby zrobić w OpenGL?

Odpowiedz

8

Jeśli tak to:

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

Twój kod będzie działać dobrze. To, co robią wszystkie wywołania gl*Pointer, polega na sprawdzeniu, co jest przechowywane w GL_ARRAY_BUFFERw momencie, gdy funkcja nazywa się i utworzenia powiązania między tym buforem i tym atrybutem. Tak więc jedyną metodą zmiany bufora na atrybut jest wywołanie gl*Pointer.

Powiązane problemy