Существует два контекста: рабочий контекст и контекст визуализации. Во время установки рабочий поток создает и настраивает шейдер и VBO. Затем поток рендеринга использует VBO для создания VAO и рисования. Я ничего не вижу на экране (или старых вершин, см. Ниже).Странное поведение openGL с общим контекстом, шейдер является общим, у VBO есть проблемы
Если я разрешаю поток визуализации также создавать VBO, прежде чем он создает VAO, все работает, я вижу треугольник, созданный с помощью шейдерной программы, созданной в рабочем потоке.
Очень странная часть после того, как она работает, если я вернусь к созданию VBO в рабочем потоке, я все еще вижу треугольник, но если я изменил геометрию треугольника, он не будет обновлен, пока я не переключу его обратно на Создание VBO в потоке рендеринга.
Это невероятно странно. В обоих случаях контекст визуализации использует шейдер, созданный в рабочем контексте, но я не могу поделиться им с VBO, но когда рабочий контекст создает VBO, вершины не обновляются, а треугольник из предыдущей программы запускается.
Я на Ubuntu 16. Это происходило с glew, теперь glbinding и моим собственным скомпилированным последним glfw3 и пакетом Ubuntu.
Таким образом, создание и рисование VBO осуществляется из основного потока с помощью шейдера, созданного из рабочего потока. Если я попытаюсь создать VBO с рабочим потоком (той же функцией), я, кажется, получаю доступ к новому буферу, который имеет старые данные, когда он используется в потоке рендеринга ...
Описание того, что вы делаете самостоятельно, недостаточно для диагностики вашей проблемы. –
@NicolBolas Этого было вполне достаточно для тех, у кого есть знания. Я получил ответ через 5 минут от настоящего гуру. Объяснение прекрасно. – RobC
"* Объяснение прекрасное. *" Но в вашем описании не говорилось, что вы * не * связывали буфер в другом потоке. Из вашего описания я должен был бы догадаться, в чем проблема * может быть. Так что нет, ваше описание не было «идеальным»; ваш * исходный код * легко показал бы недостаток. –