Как я могу выследить эти вызовы OpenGL, которые искажают объекты в моей сцене?

Я смешиваю две библиотеки, использующие OpenGL :Qt и OpenSceneGraph. Я ориентируюсь на OpenGL ES 2, поэтому все делается с помощью шейдеров и вызовов, совместимых с ES 2.

Я специально использую OSG с QtDeclarative, пытаясь нарисовать OSG на QDeclarativeItem. Я делаю это так, как предложено в документации Qt :, заключая все вызовы OpenGL между beginNativePainting ()/endNativePainting ().

Это работает нормально, пока я не использую текстуры в своей сцене OpenSceneGraph. Когда я это делаю, мое окно QML "запутывается" из-за отсутствия лучшего слова. Чтобы сделать его максимально простым, моя OSG-сцена состоит из плоскости с примененной к ней текстурой. Я воссоздал сцену, используя базовые вызовы OpenGL, и проблема больше не возникает. Вот проблема, обобщенная в виде набора картинок:

  • Движок QtDeclarative использует OpenGL для рисования. Я создал простую страницу QML:

enter image description here

  • Я создаю простую сцену, используя OpenGL напрямую. Это плоскость с нарисованной на ней текстурой.

enter image description here

  • Сейчас пытаюсь настроить ту же сцену в OSG... одинаковые шейдеры и т.д.

enter image description here

На последнем скриншоте видно, что происходит что-то странное. Не беспокойтесь о черном фоне, где исходная сцена OpenGL была прозрачной, это просто OSG, использующий чистый черный цвет.Проблема в том, что другие элементы, настроенные с помощью QML (, прямоугольники )перепутались.

Изменить:Чтобы пояснить, что происходит :Все прямоугольники, которые я рисую с помощью QML, вытянуты к правому краю экрана. Я также заметил, что если я рисую прямоугольники после элемента OpenSceneGraph в QML, они не отображаются (Я не замечал этого раньше ). Я рисую пурпурно-черный прямоугольник после элемента OSG на следующих снимках экрана... обратите внимание, что он исчезает. Могут происходить и более странные вещи, но это все, что я наблюдал, играя с прямоугольниками.

До enter image description here

После enter image description here

Я новичок в 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, по-прежнему не отображаются .

7
задан Nicol Bolas 9 July 2012 в 02:49
поделиться