2011-10-01 8 views
5

OpenGL(特にOpenGL ES 2.0)では、新しいVBOがバインドされるたびにglVertexAttribPointerを呼び出す必要がありますか?私はglVertexAttribPointerを呼び出すために有するが、これはOpenGLで行うことがOKであれば、私は思ったんだけどない対処VAOsがあることを知っているglBindBufferが呼び出されるたびにglVertexAttribPointerが必要ですか?

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

:たとえば

?あなたはこれをしなかった場合

答えて

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を呼び出すことです。

関連する問題