Название: Подружить DirectX11 с Qt Отправлено: 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. Этот вариант наиболее трудоемкий, но самый наверное надежный. Очень хочу услышать ваше мнения по предложенным вариантам или услышать ваши. Спасибо за внимание! Название: Re: Подружить DirectX11 с Qt Отправлено: navrocky от Сентябрь 05, 2012, 11:19 Ну, насколько я знаю, весь QGraphicsView/Scene тебе переписывать не надо, только отдельный бэкенд для DirectX.
А по первому пункту, есть метод QWidget::render. В голову пришел такой изврат: укладываешь своё окно DirectX поверх твоих виджетов (важно, чтобы они думали, что они отображаются), далее методом render, получаешь с них картинку, ее в текстуру, рисуешь текстуру, ловишь нажатия мыши и транслируешь их в соответствующие QMouseEvent и отправляешь их вручную твоим виджетам под директ-иксовым окном. Ну и надо отлавливать у виджетов paintEvent (который приходит от метода QWidget::update) и обновлять картинку. Название: Re: Подружить DirectX11 с Qt Отправлено: vertus от Сентябрь 05, 2012, 11:56 Ну, насколько я знаю, весь QGraphicsView/Scene тебе переписывать не надо, только отдельный бэкенд для DirectX. Спасибо за инфу!А можешь сказать где бэкенд в сорсниках для OpenGL определен? Цитировать А по первому пункту, есть метод QWidget::render. Там проблема будет с тем, чтобы отправлять нужным виджитам нужные евенты. Хотя вариант интересный, думаю стоит попробывать.В голову пришел такой изврат: укладываешь своё окно DirectX поверх твоих виджетов (важно, чтобы они думали, что они отображаются), далее методом render, получаешь с них картинку, ее в текстуру, рисуешь текстуру, ловишь нажатия мыши и транслируешь их в соответствующие QMouseEvent и отправляешь их вручную твоим виджетам под директ-иксовым окном. Ну и надо отлавливать у виджетов paintEvent (который приходит от метода QWidget::update) и обновлять картинку. Название: Re: Подружить DirectX11 с Qt Отправлено: vertus от Сентябрь 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. Название: Re: Подружить DirectX11 с Qt Отправлено: navrocky от Сентябрь 05, 2012, 15:19 Ну, как минимум, есть софтварьный растеризатор, иксовый и opengl'ный. Так что я думаю всё возможно. Да и растеризаторы используются QPainter'ом.. так что это касается не только QGraphicsScene
|