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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: qt и direct3d  (Прочитано 2110 раз)
whats_up_doc
Гость
« : Ноябрь 15, 2010, 12:14 »

код виджета следующий:
Код
C++ (Qt)
#ifndef _D3D_WIDGET_H_
#define _D3D_WIDGET_H_
 
#include <QtGui/QWidget>
#include <d3d9.h>
 
#pragma comment(lib, "d3d9.lib")
 
class d3d_widget: public QWidget{
 
 Q_OBJECT
 
private:
 IDirect3D9* m_pD3D;
 IDirect3DDevice9* m_pD3DDevice;
 
public:
 d3d_widget(QWidget* _parent);
 ~d3d_widget();
 
 bool init_d3d(HWND _wnd);
 
public slots:
 bool render();
 
private:
 void paintEvent(QPaintEvent* pEvent);
 QPaintEngine* paintEngine();
};
 
#endif
 
#include "d3d_widget.h"
 
d3d_widget::d3d_widget(QWidget* _parent): QWidget(_parent){
 setAttribute(Qt::WA_OpaquePaintEvent, true);
 setAttribute(Qt::WA_NoSystemBackground, true);
 setAttribute(Qt::WA_PaintOnScreen, true);
}
 
d3d_widget::~d3d_widget(){
 
}
 
bool d3d_widget::init_d3d(HWND _wnd){
 m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
 if(!m_pD3D)
   return false;
 D3DPRESENT_PARAMETERS d3dpp;
 ZeroMemory( &d3dpp, sizeof(d3dpp) );
 d3dpp.Windowed = true;
 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
   d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
   d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.EnableAutoDepthStencil = TRUE;
   d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
 
 HRESULT hrResult = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, _wnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pD3DDevice);
 if (FAILED(hrResult)){
   return false;
 }
 return true;
}
 
bool d3d_widget::render(){
 if(m_pD3DDevice == 0)
   return false;
 m_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0);
 if(SUCCEEDED(m_pD3DDevice->BeginScene()))
   m_pD3DDevice->EndScene();
 m_pD3DDevice->Present(0, 0, 0, 0);
 return true;
}
 
void d3d_widget::paintEvent(QPaintEvent* pEvent){
 Q_UNUSED(pEvent);
 render();
}
 
QPaintEngine* d3d_widget::paintEngine(){
 return 0;
}
 

при запуске приложения, вместо жёлтого цвета, которым я очищаю буферы, виден стандартный цвет окна qt, причём при репэинте происходит мигание, тоесть сначала отображается буфер директ 3д, а затем qt его затирает, кто нибудь знает, как решить проблему?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 15, 2010, 12:20 »

Чего-то с установкой атрибутов.

Qt::WA_PaintOnScreen - ... Note: This flag is only supported on X11 and it disables double buffering. ...

Ups - извиняйте, влез в тему не разобравшись - как оказалось для D3D только так и делают
« Последнее редактирование: Ноябрь 15, 2010, 13:21 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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