2011-10-01 16 views
5

OpenGL'de (özellikle OpenGL ES 2.0), yeni bir VBO her bağlandığında glVertexAttribPointer çağrılması gerekiyor mu? ÖrneğinglVertexAttribPointer her zaman ihtiyacı glBindBuffer denir?

:

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

Ben glVertexAttribPointer aramak zorunda değil adrese VAOs olduğunu biliyoruz ama bu OpenGL'de yapmak Tamam olup olmadığını merak ediyorum? Bunu yaparsanız

cevap

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

Kodunuz sadece iyi çalışacak. gl*Pointer numaralı çağrıların tümü, işlevin işlevini çağırdığı anda GL_ARRAY_BUFFER'da saklanana bakıp, bu arabelleğin ve özniteliğin arasında bir ilişki oluşturun. Yani tamponun bir özellik için kullanılmasını değiştirmenin tek yolu, gl*Pointer'u aramaktır.