#qt #opengl #qpainter #qglwidget
#qt #opengl #qpainter #qglwidget
Вопрос:
Я использую 3-уровневую иерархию QGLWidgets для совместного использования шейдеров и данных вершин между 5 видовыми экранами OpenGL в моем CAD-подобном приложении. Корневой контекст используется для компиляции шейдеров всего приложения, контекст для каждого документа используется для совместного использования данных вершины модели, а контексты окна просмотра — это те, которые фактически выполняют рендеринг (а также содержат данные вершины сетки и другие данные для окна просмотра).).
Совместное использование шейдеров, похоже, работает нормально, как и рисование сетки, но когда дело доходит до совместного использования данных вершин, происходит сбой, и, честно говоря, я не вижу, как это должно работать…
Я создал 3D-иконку для элемента, пока контекст модели был текущим, поскольку это был первый VAO, у которого было ‘name’, равное 1. Когда я приступаю к рисованию объекта, контекст окна просмотра (который используется совместно с контекстом модели, помните) является текущим, поэтому вызывается VAO 1, но рисуется VAO 1 окна просмотра — моя красивая красная центральная линия сетки. Контексты OpenGL могут быть общими, но как вы можете указать «пространство имен», к которому принадлежит каждый элемент, поскольку имена не уникальны?
Я попытался сделать контекст модели текущим непосредственно перед вызовом модели VAO, но ни соответствующий VAO, ни окно просмотра не отображаются, я думаю, что переключение контекста во время блока QPainter::beginNativePainting () не делает OpenGL счастливым.
Мне это кажется очень простой вещью, поэтому я, должно быть, делаю что-то глупое — есть предложения?
Ответ №1:
Благодаря Альфонсу Рейнхарту на форумах OpenGL, теперь я знаю, что это потому, что VAOs не разделяются между контекстами.