zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    dfssvc.exe
    我左边的公告
    再做了一个LOGO
    做一个调查,请大家帮忙
    如果年三十没有人陪我
    我喜欢这个模版
    cisvc.exe是什么服务
    IIS与SQL服务器安全加固
    终于申请到了blogs
    重发LOGO
  • 原文地址:https://www.cnblogs.com/findumars/p/7252630.html
Copyright © 2011-2022 走看看