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(ошибка)); }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
OpenGL ES, слишком раннее заполнение VBO и IBO приводит к отсутствию буферов?
Гость » » в форуме C++ - 0 Ответы
- 37 Просмотры
-
Последнее сообщение Гость
-
-
-
Qt и OpenGL: невозможно инициализировать VBO или VAO openGL после первого вызова PaintGL?
Anonymous » » в форуме C++ - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Qt и OpenGL: невозможно инициализировать OpenGL VBO или VAO после первого вызова PaintGL?
Anonymous » » в форуме C++ - 0 Ответы
- 36 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Растворение полигонов в Python приводит к отсутствию некоторых полигонов.
Anonymous » » в форуме Python - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Встраивание OpenCV в статическую библиотеку приводит к отсутствию функций
Anonymous » » в форуме C++ - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-