OpenGL VBO загружается в GPU только при визуализации

Мои VBO отправляются в GPU только при первом использовании, это вызывает небольшие зависания при первом рисовании объекта / группы объектов.

Я попытался загрузить данные таким образом:

glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, size, data);

и так

glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

Но результат тот же.

Если я тогда нарисую треугольник после glBufferData:

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, NULL);

тогда проблема решена, но я нахожу это решение довольно хакерским.

Есть ли лучшее решение?

(У меня есть несколько небольших VBO, содержащих по 256 вершин в каждой)

2 ответа

Решение

Что ж, вот как должны работать Буферные объекты, а именно добавлять несколько асинхронных операций. Идея состоит в том, что вы можете загрузить большую группу объектов буфера и продолжить операции OpenGL после этого, только с остановкой в ​​трубопроводе, если доступны данные, загрузка которых еще не завершена. glBufferData и glBufferSubData либо делают страницы указателя переданными им CoW, либо делают временную копию, в любом случае вы можете безопасно отбросить данные в своем процессе после возврата вызова, на стороне клиента OpenGL все еще будут храниться данные (для текущего) Процесс загрузки.

Вызов glFinish() будет блокировать до тех пор, пока операционная линия не будет полностью завершена (отсюда и название).

Попробуйте вызвать glFlush() после вашего вызова glBufferData.

Другие вопросы по тегам