Qt中嵌入Directx11(有句柄就可以)


最近要做個游戲場景編輯器,需要directx11配合gui框架使用,所以簡單地弄了一個directx11嵌入到Qt窗體中的程序。

 

1 建立工程

建一個Qt的工程,配置好directx的包含目錄和庫目錄(以及附加依賴項),Qt vs2013 add-in的話很方便,直接在vs2013里面加,Qt creator的話寫到pro文件里,可以選擇生成對應的ui文件,或者不生成。

 

2 代碼結構

工程的結構

 

  • D3d11RenderWidget類繼承自QWidegt,用於directx11渲染
  • MainWidget繼承自QMainWindow,是包含dx11渲染窗體的父窗體
  • Effects.fx是shader文件,VS和PS寫到一起,注意要在工程中設置排除編譯
  • main函數是程序入口
 
3 關鍵代碼
(1)dx11嵌入到Qt中就需要獲得某個widgt的句柄hwnd,所以在D3D初始化時要改一個參數,swapChainDesc.OutputWindow=(HWND)winId()
[cpp]  view plain  copy
 
 print?
  1. swapChainDesc.BufferDesc=bufferDesc;  
  2.     swapChainDesc.SampleDesc.Count=1;  
  3.     swapChainDesc.SampleDesc.Quality=0;  
  4.     swapChainDesc.BufferUsage=DXGI_USAGE_RENDER_TARGET_OUTPUT;  
  5.     swapChainDesc.BufferCount=1;  
  6.     swapChainDesc.OutputWindow=(HWND)winId();  
  7.     swapChainDesc.Windowed=TRUE;  
  8.     swapChainDesc.SwapEffect=DXGI_SWAP_EFFECT_DISCARD;  
(2)用於渲染的子widget必須設置屬性為
[cpp]  view plain  copy
 
 print?
  1. setAttribute(Qt::WA_PaintOnScreen,true);  
  2. setAttribute(Qt::WA_NativeWindow,true);  
否則渲染是亂的
(3)渲染更新借助的就是Qt的paintEvent函數,在里面再調用update()就可以實現渲染循環。(也可以設置定時器隔一定時間強制刷新,不過這樣效果不好)
[cpp]  view plain  copy
 
 print?
  1. void D3d11RenderWidget::paintEvent(QPaintEvent *event)  
  2. {  
  3.     //計算fps  
  4.     frameCount++;  
  5.     if(getTime() > 1.0f)  
  6.     {  
  7.         fps=frameCount;  
  8.         frameCount=0;  
  9.         startFPStimer();  
  10.         //設置父窗口標題顯示fps值  
  11.         parentWidget()->setWindowTitle("FPS: "+QString::number(fps));  
  12.     }  
  13.     frameTime=getFrameTime();  
  14.     //更新場景和渲染場景  
  15.     UpdateScene(frameTime);  
  16.     RenderScene();  
  17.     //保證此函數體每一幀都調用  
  18.     update();  
  19. }  
(4)必須重寫resizeEvent函數,重新設置幀緩存、深度和模板緩存以及視口,防止窗口縮放時場景被拉伸或者視口不對應
[cpp]  view plain  copy
 
 print?
  1. void D3d11RenderWidget::resizeEvent(QResizeEvent *event)  
 
4 截圖
 
 
源代碼:
csdn: demo
github: demo
 
http://blog.csdn.net/u012234115/article/details/47402277


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM