2016-12-02 3 views
-2

VAO(Vertex Array Object)が頂点属性のように状態を保存すると考えられました。私はVBOを作成するとき、私は私の頂点属性を指定:OpenGLではなぜ頂点の属性を再指定しない限りバッファオブジェクトが描画されませんか?

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)nullptr); 
glEnableVertexAttribArray(0); 
// And so on 

私はglVertexAttribPointerとglEnableVertexAttribArray三回呼び出す必要があり、別のVBOをバインドする場合、それは私が私のVBOを切り替えるたびのためです。私は1つのVAOしか持っていない、決してそれを変更しない。何か間違っていますか?私は1つの頂点レイアウトだけを使用しています。私は切り替えたたびにこの情報が失われた場合、VAOの機能を理解していません。 VAOあたり1つのVBOだけですか?

答えて

1

glDraw *関数を呼び出す前にglVertexAttribPointerを再指定したくない場合は、1つではなく複数のVAOが必要です。私はVBOとVAOが何であるか混乱させていると思います。 VBOは、データを含む不活性なメモリです。 VAOには、OpenGLがメッシュを描画するために必要な情報がすべて含まれています。
- 頂点データを含むBufferオブジェクトへの参照(一般にVBO)
- 頂点インデックスを含むBufferオブジェクトへの参照です(ifあなたは)*
をglDrawElementsを使用している - それぞれについてそこで、基本的に異なる頂点のインデックス属性を使用しようとしていると、バッファオブジェクトでのレイアウトはあなたの頂点データを含む(glEnableVertexAttribArrayとglVertexAttribPointerで指定)

はあなたをメッシュしていますあなたは対応するバオを準備する必要があります:

// at scene preparation time 
glBindVertexArray(vaoA); // the following functions will only affect vaoA 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_of_meshA); 
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_of_meshA); 
foreach attrib of meshA 
    glEnableVertexAttribArray(***); 
    glVertexAttribPointer(***) 
glBindVertexArray(0) 

glBindVertexArray(vaoB); // the following functions will only affect vaoB 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_of_meshB); 
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_of_meshB); 
foreach attrib of meshB 
    glEnableVertexAttribArray(***); 
    glVertexAttribPointer(***) 
glBindVertexArray(0) 

//And now at render time: 
void render() 
{ 
    glBindVertexArray(vaoA); 
    glDrawElements(***); 

    glBindVertexArray(vaoB); 
    glDrawElements(***); 
} 

詳細については、https://www.opengl.org/wiki/Vertex_Specification

関連する問題