Я смешиваю две библиотеки, использующие OpenGL :Qt и OpenSceneGraph. Я ориентируюсь на OpenGL ES 2, поэтому все делается с помощью шейдеров и вызовов, совместимых с ES 2.
Я специально использую OSG с QtDeclarative, пытаясь нарисовать OSG на QDeclarativeItem. Я делаю это так, как предложено в документации Qt :, заключая все вызовы OpenGL между beginNativePainting ()/endNativePainting ().
Это работает нормально, пока я не использую текстуры в своей сцене OpenSceneGraph. Когда я это делаю, мое окно QML "запутывается" из-за отсутствия лучшего слова. Чтобы сделать его максимально простым, моя OSG-сцена состоит из плоскости с примененной к ней текстурой. Я воссоздал сцену, используя базовые вызовы OpenGL, и проблема больше не возникает. Вот проблема, обобщенная в виде набора картинок:
На последнем скриншоте видно, что происходит что-то странное. Не беспокойтесь о черном фоне, где исходная сцена OpenGL была прозрачной, это просто OSG, использующий чистый черный цвет.Проблема в том, что другие элементы, настроенные с помощью QML (, прямоугольники )перепутались.
Изменить:Чтобы пояснить, что происходит :Все прямоугольники, которые я рисую с помощью QML, вытянуты к правому краю экрана. Я также заметил, что если я рисую прямоугольники после элемента OpenSceneGraph в QML, они не отображаются (Я не замечал этого раньше ). Я рисую пурпурно-черный прямоугольник после элемента OSG на следующих снимках экрана... обратите внимание, что он исчезает. Могут происходить и более странные вещи, но это все, что я наблюдал, играя с прямоугольниками.
До
После
Я новичок в OpenGL, поэтому не знаю, какая настройка вызова/состояния вызовет подобное. Я думаю, что OpenSceneGraph делает некоторые изменения состояния OpenGL, которые портят механизм рисования Qt. Я также знаю, что это происходит только тогда, когда OSG использует текстуры... если я не применяю текстуры в своей OSG-сцене, этого не происходит. Здесь я застрял.
Кроме того, я попытался использовать BuGLe, чтобы получить трассировку вызовов OpenGL с текстурами, включенными в OSG, и без них, чтобы увидеть, смогу ли я выяснить проблемное изменение состояния (s ). Я обнаружил несколько различий и даже некоторое глобальное состояние, которое OSG изменило (, такое как glPixelStorei ()), между ними двумя, но сброс обнаруженных изменений не дал никакой разницы. Если бы я знал, что искать, мне бы очень помогло. Если кто-то чувствует себя сумасшедшим, у меня также есть трассировка стека:
Редактировать 2: Вот разница, которая может быть полезна. Вам нужно будет прокрутить вниз, прежде чем соответствующие строки станут очевидными.http://www.mergely.com/nUEePufa/
Редактировать 3: Вау! Хорошо, этот diff немного помог мне. OSG включает VertexAttribArray 3, но не отключает его. Вызов glDisableVertexAttribArray (3 )после того, как OSG визуализирует свой кадр, похоже, частично решает проблему;больше нет растягивания прямоугольников QML. Однако прямоугольники, нарисованные после элемента OSG, по-прежнему не отображаются .