OpenGL VBO загружается в GPU только при визуализации - PullRequest
1 голос
/ 22 января 2012

Мои 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 ]

1 голос
/ 22 января 2012

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

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

0 голосов
/ 22 января 2012

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

...