OpenGL ES, слишком раннее заполнение VBO и IBO приводит к отсутствию буферов? ⇐ C++
-
Гость
OpenGL ES, слишком раннее заполнение VBO и IBO приводит к отсутствию буферов?
Существует ли правило, когда можно заполнять VBO/IBO? Потому что у меня есть объект BufferGeometry, который должен инициализировать vbo и ibo. Однако, если я использую заполненные значения при рендеринге, ничего не отображается. Связывание буферов и последующая передача одних и тех же данных волшебным образом решает проблему. Я также протестировал генерацию идентификаторов для vbo и ibo во время конструктора, а затем просто повторно заполнил буферы один раз в цикле. Это также решает проблему. Итак, похоже, что генерация vbo и ibo работает нормально, а использование glBufferData в конструкторе — нет. Я что-то упустил?
вызывается внутри цикла:
bool call = false; void RenderMesh(std::shared_ptr& сетка) { станд::строка errMsg; Материал и материал = материалы.at(mesh->getMaterialID()); BufferGeometry& Geometry = geometries.at(mesh->getGeometryID()); материал.setMVP( сетка->getModelMatrix(), activeCamera->getViewMatrix(), activeCamera->getProjectionMatrix() ); если(!вызывается) { std::vector arr; геометрия.CreateBuffers(arr); //Один раз здесь работает?? называется = правда; } glUseProgram(material.getProgram()); glBindBuffer (GL_ARRAY_BUFFER, геометрия.VBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Geometry.IBO); геометрия.LoadAttributes(материал); материал.LoadUniforms(); Ошибка GLint = glGetError(); если (ошибка!= GL_NO_ERROR) log_e("Ошибка GL: " + std::to_string(ошибка)); glDrawElements(GL_TRIANGLES, Geometry.getIndexCount(), GL_UNSIGNED_INT, nullptr); glBindBuffer (GL_ARRAY_BUFFER, 0); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); glUseProgram (0); } Эта функция вызывается один раз при инициализации, в настоящее время вызывается один раз внутри цикла в целях отладки. Если я вызываю функцию во время конструктора, у меня есть действительные идентификаторы vbo и ibo, но при привязке и последующем рисовании ничего не отображается. Однако вызов его внутри цикла один раз работает. (Примечание: раньше _mergedBuffer был mergedBuffer, изменен, чтобы я мог вызывать его из цикла без необходимости передавать действительный вектор, хранящийся внутри объекта):
void BufferGeometry::CreateBuffers(std::vector& _mergedBuffer) { std::vector mergedBuffer = атрибуты.at(ATTRIBUTE_TYPE_POSITION).dataArr; glGenBuffers(1, &VBO); glBindBuffer (GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, mergedBuffer.size() * sizeof(float), mergedBuffer.data(), GL_STATIC_DRAW); glGenBuffers(1, &IBO); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, IBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, index.size() * sizeof(uint32_t), index.data(), GL_STATIC_DRAW); glBindBuffer (GL_ARRAY_BUFFER, 0); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); Ошибка GLenum = glGetError(); если (ошибка!= GL_NO_ERROR) log_e("Ошибка GL: " + std::to_string(ошибка)); }
Существует ли правило, когда можно заполнять VBO/IBO? Потому что у меня есть объект BufferGeometry, который должен инициализировать vbo и ibo. Однако, если я использую заполненные значения при рендеринге, ничего не отображается. Связывание буферов и последующая передача одних и тех же данных волшебным образом решает проблему. Я также протестировал генерацию идентификаторов для vbo и ibo во время конструктора, а затем просто повторно заполнил буферы один раз в цикле. Это также решает проблему. Итак, похоже, что генерация vbo и ibo работает нормально, а использование glBufferData в конструкторе — нет. Я что-то упустил?
вызывается внутри цикла:
bool call = false; void RenderMesh(std::shared_ptr& сетка) { станд::строка errMsg; Материал и материал = материалы.at(mesh->getMaterialID()); BufferGeometry& Geometry = geometries.at(mesh->getGeometryID()); материал.setMVP( сетка->getModelMatrix(), activeCamera->getViewMatrix(), activeCamera->getProjectionMatrix() ); если(!вызывается) { std::vector arr; геометрия.CreateBuffers(arr); //Один раз здесь работает?? называется = правда; } glUseProgram(material.getProgram()); glBindBuffer (GL_ARRAY_BUFFER, геометрия.VBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Geometry.IBO); геометрия.LoadAttributes(материал); материал.LoadUniforms(); Ошибка GLint = glGetError(); если (ошибка!= GL_NO_ERROR) log_e("Ошибка GL: " + std::to_string(ошибка)); glDrawElements(GL_TRIANGLES, Geometry.getIndexCount(), GL_UNSIGNED_INT, nullptr); glBindBuffer (GL_ARRAY_BUFFER, 0); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); glUseProgram (0); } Эта функция вызывается один раз при инициализации, в настоящее время вызывается один раз внутри цикла в целях отладки. Если я вызываю функцию во время конструктора, у меня есть действительные идентификаторы vbo и ibo, но при привязке и последующем рисовании ничего не отображается. Однако вызов его внутри цикла один раз работает. (Примечание: раньше _mergedBuffer был mergedBuffer, изменен, чтобы я мог вызывать его из цикла без необходимости передавать действительный вектор, хранящийся внутри объекта):
void BufferGeometry::CreateBuffers(std::vector& _mergedBuffer) { std::vector mergedBuffer = атрибуты.at(ATTRIBUTE_TYPE_POSITION).dataArr; glGenBuffers(1, &VBO); glBindBuffer (GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, mergedBuffer.size() * sizeof(float), mergedBuffer.data(), GL_STATIC_DRAW); glGenBuffers(1, &IBO); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, IBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, index.size() * sizeof(uint32_t), index.data(), GL_STATIC_DRAW); glBindBuffer (GL_ARRAY_BUFFER, 0); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); Ошибка GLenum = glGetError(); если (ошибка!= GL_NO_ERROR) log_e("Ошибка GL: " + std::to_string(ошибка)); }
Мобильная версия