Russian Qt Forum
Ноябрь 23, 2024, 06:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подружить DirectX11 с Qt  (Прочитано 5383 раз)
vertus
Гость
« : Сентябрь 04, 2012, 16:58 »

Всем доброго времени суток!
Есть задача подружить Qt с DirectX, при чем не просто подружить, а чтобы можно было рисовать прозрачные виджеты поверх DirectX виджета.
Подобное уже реализовано на OpenGL - http://doc.qt.nokia.com/qq/qq26-openglcanvas.html.
Есть и реализация DirectX 11 виджета - http://jholewinski.org/blog/direct3d-11-with-qt-4/.
В этой реализации можно даже рисовать поверх DirectX виджета свои виджеты, но только не прозрачные.

Есть так же проект Angle Project который трансформирует вызовы OpenGL API в DirectX, и его же собираются использовать в Qt 5 для программирования Metro программ - http://qt-project.org/wiki/Qt-5-on-Windows-8-and-Metro-UI. Но нужен именно чистый DirectX, т.к. Angle скорее всего скажется на производительности. И лично я не представляю, как, например, шейдеры будут переноситься.

В связи с этим хотелось бы спросить, а как лучше на текущий момент подружить Qt (4.8.2) c DirectX?
Пока в голове вертиться два варианта:
1. Отлавливать paintEvent у всех виджетов, получать с них картинку и рисовать в качестве текстуры в Directx, а paintEvent блокировать. Но сходу реализовать не получилось, т.к. при блокировании paintEvent все рисуются ректанглы виджетов - видимо само WinApi их рисует, а не Qt.
2. Включиться в разработку Qt и написать QGraphicScene с использованием DirectX. Этот вариант наиболее трудоемкий, но самый наверное надежный.

Очень хочу услышать ваше мнения по предложенным вариантам или услышать ваши.

Спасибо за внимание!
« Последнее редактирование: Сентябрь 04, 2012, 16:59 от vertus » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Сентябрь 05, 2012, 11:19 »

Ну, насколько я знаю, весь QGraphicsView/Scene тебе переписывать не надо, только отдельный бэкенд для DirectX.

А по первому пункту, есть метод QWidget::render.

В голову пришел такой изврат: укладываешь своё окно DirectX поверх твоих виджетов (важно, чтобы они думали, что они отображаются), далее методом render, получаешь с них картинку, ее в текстуру, рисуешь текстуру, ловишь нажатия мыши и транслируешь их в соответствующие QMouseEvent и отправляешь их вручную твоим виджетам под директ-иксовым окном. Ну и надо отлавливать у виджетов paintEvent (который приходит от метода QWidget::update) и обновлять картинку.
Записан

Гугль в помощь
vertus
Гость
« Ответ #2 : Сентябрь 05, 2012, 11:56 »

Ну, насколько я знаю, весь QGraphicsView/Scene тебе переписывать не надо, только отдельный бэкенд для DirectX.

Спасибо за инфу!
А можешь сказать где бэкенд в сорсниках для OpenGL определен?

Цитировать
А по первому пункту, есть метод QWidget::render.

В голову пришел такой изврат: укладываешь своё окно DirectX поверх твоих виджетов (важно, чтобы они думали, что они отображаются), далее методом render, получаешь с них картинку, ее в текстуру, рисуешь текстуру, ловишь нажатия мыши и транслируешь их в соответствующие QMouseEvent и отправляешь их вручную твоим виджетам под директ-иксовым окном. Ну и надо отлавливать у виджетов paintEvent (который приходит от метода QWidget::update) и обновлять картинку.
Там проблема будет с тем, чтобы отправлять нужным виджитам нужные евенты. Хотя вариант интересный, думаю стоит попробывать.
Записан
vertus
Гость
« Ответ #3 : Сентябрь 05, 2012, 12:23 »

А вот и ответ по поводу своего backend для Directx - http://labs.qt.nokia.com/2011/05/31/qml-scene-graph-in-master/#comment-22420 :
Цитировать
gunnar: I was asking about writing custom rendering backend. The questing was not related directly to DirectX.
minimoog77: as opengl and glsl is part of the public api I don’t see how a DirectX renderer could be made that worked together with the rest of the system.

Речь идет о QML, но я так понимаю он тоже отрисовывается через QGraphicScene.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Сентябрь 05, 2012, 15:19 »

Ну, как минимум, есть софтварьный растеризатор, иксовый и opengl'ный. Так что я думаю всё возможно. Да и растеризаторы используются QPainter'ом.. так что это касается не только QGraphicsScene
Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 23.