Странное поведение openGL с общим контекстом, общий доступ к шейдеру, проблемы с VBO

Существует два контекста: рабочий контекст и контекст рендеринга. Во время настройки рабочий поток создает и настраивает шейдер и VBO. Затем поток рендеринга использует VBO для создания VAO и его отрисовки. Я ничего не получаю на экране (или старые вершины, см. Ниже).

Если я позволю потоку рендеринга также создать VBO до того, как он создаст VAO, все работает, я вижу треугольник, отрисованный с помощью программы шейдеров, созданной в рабочем потоке.

Действительно странная часть - после того, как это работает, если я переключаю его обратно на создание VBO в рабочем потоке, я все еще вижу треугольник, но если я изменяю геометрию треугольника, он не обновляется, пока я не переключу его обратно на создание VBO в сделать нить

Это невероятно странно. Оба способа визуализации контекста используют шейдер, созданный в рабочем контексте, но я не могу разделить VBO, но когда рабочий контекст создает VBO, вершины не обновляются, и рисуется треугольник из предыдущего запуска программы.

Я на Ubuntu 16. Это происходило с glew, теперь glbinding, и с моей собственной самой последней скомпилированной версией glfw3 и пакетом Ubuntu.

Таким образом, создание и рисование VBO выполняется из основного потока с помощью шейдера, созданного из рабочего потока. Если я пытаюсь создать VBO с рабочим потоком (та же функция), мне кажется, что я получаю доступ к новому буферу, который, как оказалось, содержит старые данные, когда он используется в потоке рендеринга...

1 ответ

Решение

Поток, который использует объект, просто должен связать его. Поток обновляет объект (рабочий поток в этом случае) должен использовать

glFlush();

чтобы убедиться, что обновление обработано и доступно для другого контекста.

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