Ich arbeite derzeit an einer OpenGl 3.3-Anwendung, die VAOs (eins pro Mesh) verwendet. Wenn ich meine VAOs separat erstelle und initialisiere, führt jeder Aufruf von glDrawElements
dazu, dass das Programm sofort ohne Fehlermeldung beendet wird. Wenn ich sie jedoch zusammen erstelle und initialisiere, ist der gleiche glDrawElements
Aufruf erfolgreich.Warum kann ich OpenGl VAO nicht separat erstellen und initialisieren?
Separate Initialisierung Code:
Chunk::Chunk(){
glGenVertexArrays(1, &m_vaoId);
glBindVertexArray(m_vaoId);
glGenBuffers(1, &m_vboId);
glGenBuffers(1, &m_eboId);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (GLvoid*)(0));
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (GLvoid*)(1*sizeof(GLfloat)));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
}
void Chunk::refreshMesh(){
/*build data into vector<GLfloat> verticies and vector<GLuint> indices...*/
//send data to GPU
glBindVertexArray(m_vaoId);
glBindBuffer(GL_ARRAY_BUFFER, m_vboId);
glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLfloat), indices.data(), GL_STATIC_DRAW);
}
Zusammengestellt Initialisierung Code:
void Chunk::refreshMesh(){
/*build data into vector<GLfloat> verticies and vector<GLuint> indices...*/
//send data to GPU
glGenVertexArrays(1, &m_vaoId);
glBindVertexArray(m_vaoId);
glGenBuffers(1, &m_vboId);
glBindBuffer(GL_ARRAY_BUFFER, m_vboId);
glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW);
glGenBuffers(1, &m_eboId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLfloat), indices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (GLvoid*)(0));
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (GLvoid*)(1*sizeof(GLfloat)));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
}
HINWEIS: Ich verwende Ubuntu 16.04 LTS, um mit g ++ 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.2), glew 1.13 und SDL2 2.0.0 zu kompilieren. Ich möchte eine separate Initialisierung durchführen, um zu ermöglichen, dass die Maschendaten periodisch aktualisiert werden, ohne einen neuen VAO usw. zu erzeugen, da ich mir vorstelle, dass eine endliche Anzahl von diesen auf jeder realen GPU gehandhabt werden kann.
'glVertexAttribPointer' verwendet den aktuell gebundenen Puffer, um die Attributzeiger zu setzen, daher müssen Sie den Puffer binden, bevor Sie' glVertexAttribPointer' aufrufen. – tkausl
@tkausl Danke, das funktioniert. Vielleicht ist es sinnvoll, es als Antwort zu geben, damit ich es annehmen kann? – john01dav