Странное поведение openGL с общим контекстом, общий доступ к шейдеру, проблемы с VBO
Существует два контекста: рабочий контекст и контекст рендеринга. Во время настройки рабочий поток создает и настраивает шейдер и VBO. Затем поток рендеринга использует VBO для создания VAO и его отрисовки. Я ничего не получаю на экране (или старые вершины, см. Ниже).
Если я позволю потоку рендеринга также создать VBO до того, как он создаст VAO, все работает, я вижу треугольник, отрисованный с помощью программы шейдеров, созданной в рабочем потоке.
Действительно странная часть - после того, как это работает, если я переключаю его обратно на создание VBO в рабочем потоке, я все еще вижу треугольник, но если я изменяю геометрию треугольника, он не обновляется, пока я не переключу его обратно на создание VBO в сделать нить
Это невероятно странно. Оба способа визуализации контекста используют шейдер, созданный в рабочем контексте, но я не могу разделить VBO, но когда рабочий контекст создает VBO, вершины не обновляются, и рисуется треугольник из предыдущего запуска программы.
Я на Ubuntu 16. Это происходило с glew, теперь glbinding, и с моей собственной самой последней скомпилированной версией glfw3 и пакетом Ubuntu.
Таким образом, создание и рисование VBO выполняется из основного потока с помощью шейдера, созданного из рабочего потока. Если я пытаюсь создать VBO с рабочим потоком (та же функция), мне кажется, что я получаю доступ к новому буферу, который, как оказалось, содержит старые данные, когда он используется в потоке рендеринга...
1 ответ
Поток, который использует объект, просто должен связать его. Поток обновляет объект (рабочий поток в этом случае) должен использовать
glFlush();
чтобы убедиться, что обновление обработано и доступно для другого контекста.