рендеринг окна наложения qt над дочерним окном opengl

Я ищу некоторую информацию о рендеринге дочерних окон, в частности о взаимодействии OpenGL с GDI. Проблема, которая у меня есть, заключается в том, что в основном у меня есть два окна, во-первых, главные окна создаются в qt, а внутри qt размещается дочернее окно, которое использует средство визуализации OpenGL.

Теперь я хотел разместить наложение поверх моего окна OpenGL, поэтому я использую его для наложения окна OpenGL. Проблема, с которой я столкнулся, заключается в том, что при визуализации с помощью OpenGL графика, сгенерированная OpenGL, кажется, затемняет графическую область, включая и эффективно отменяет графику, составленную с помощью qt.

На изображении ниже синяя область - это наложение qt, на этом изображении я использую GDI (BeginPaint / EndPaint), поэтому окна, кажется, взаимодействуют нормально. То есть порядок окон кажется правильным, клиентский регион правильный. В тот момент, когда я начинаю рендерить с помощью Opengl, синяя область заменяется тем, что рендерит OpenGL.

То, что я сделал, я в основном создал для создания наложения. Я создал второй безрамочный, самый верхний QMainWindow, и как только платформа HWND была инициализирована, я переродил его. В основном я меняю новый родительский элемент окна, чтобы он был тем же родителем моего окна OpenGL.

Я полагал, что это будет делать то, что каждое окно рисуется отдельно, и диспетчер композиции рабочего стола будет создавать окончательную композицию и в основном избегает печально известного проблема с воздушным пространством, задокументированная Microsoft в их платформе WPF.


Я хотел бы знать, что может вызвать эти проблемы? На данный момент мне не хватает понимания, почему после рендеринга с помощью OpenGL пиксели наложения qt затемняются, хотя в иерархии окон должно быть сказано, чтобы они были скомпонованы. Что я мог сделать, чтобы достичь того, чего хочу?

введите описание изображения здесь


person Lawrence Kok    schedule 22.07.2020    source источник


Ответы (1)


Совместное рисование OpenGL и GDI на совместно используемом чертеже (который также включает родственные / дочерние окна без флага стиля CS_OWNDC windowclass) никогда не поддерживалось. Дело не в Qt, а в том, как взаимодействуют OpenGL и GDI.

Но более важный вопрос: Какого черта вы вообще не используете поддержку OpenGL, встроенную прямо в Qt? Начиная с Qt-5 - если она доступна - использует OpenGL для рисования всего (все элементы пользовательского интерфейса). Qt-5 упрощает смешивание материалов Qt и рисования OpenGL.

person datenwolf    schedule 22.07.2020
comment
В моем окне OpenGL установлено CS_OWNDC , я предполагаю, что окна из Qt, как вы сказали, qt использует OpenGL в качестве бэкэнда, также имеет установленный CS_OWNDC. Что касается того, почему я не использую контекст opengl из qt-, просто потому, что средство визуализации даже не находится в том же процессе. - person Lawrence Kok; 22.07.2020
comment
@LawrenceKok, ах, тогда в этом гораздо больше смысла. Что ж, IPC OpenGL можно сделать, но его правильная настройка раздражает. Может ли ваш процесс рендеринга выполнять рендеринг в текстуру на FBO? Если это так, вы можете использовать Vulkan для создания текстуры, экспортировать текстуру в процесс графического интерфейса и с любой стороны импортировать текстуру в OpenGL для рендеринга и компоновки в графический интерфейс. - person datenwolf; 22.07.2020
comment
Технически, да, я могу рендерить за кадром, но да, это может быть слишком серьезным капитальным ремонтом в архитектуре, в идеале я бы предпочел не делать этого, если действительно нет другого выбора. То, что я действительно не понимаю в этой истории, когда у меня есть контекст opengl, работающий в (плавающем / перемещаемом) окне, он может быть частично перекрыт другим окном. Я имею в виду, что мой рендерер opengl может быть заблокирован браузером, например firefox, и DWM может с этим справиться. Это действительно заставляет меня задаться вопросом, почему этот случай такой особенный, потому что в конечном итоге рендерер qt / opengl полностью изолирован. - person Lawrence Kok; 22.07.2020