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

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Qt中嵌入Directx11(有句柄就可以)的主要内容,如果未能解决你的问题,请参考以下文章

带有 Directx 11 的 WPF

VB获取窗口句柄的详细教程

将ue4程序嵌入qt界面显示

将ue4程序嵌入qt界面显示

对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

WPF中主窗体中怎么嵌入一个子窗体