2017-01-11 7 views
-2

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

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

Очень странная часть после того, как она работает, если я вернусь к созданию VBO в рабочем потоке, я все еще вижу треугольник, но если я изменил геометрию треугольника, он не будет обновлен, пока я не переключу его обратно на Создание VBO в потоке рендеринга.

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

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

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

+0

Описание того, что вы делаете самостоятельно, недостаточно для диагностики вашей проблемы. –

+0

@NicolBolas Этого было вполне достаточно для тех, у кого есть знания. Я получил ответ через 5 минут от настоящего гуру. Объяснение прекрасно. – RobC

+0

"* Объяснение прекрасное. *" Но в вашем описании не говорилось, что вы * не * связывали буфер в другом потоке. Из вашего описания я должен был бы догадаться, в чем проблема * может быть. Так что нет, ваше описание не было «идеальным»; ваш * исходный код * легко показал бы недостаток. –

ответ

0

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

glFlush();

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