一、DXUT框架

为了方便我们使用D3D,在这里DXUT框架(基于DX9).我们只需要设置一系列的回调函数就可以很好的使用D3D,节省了很多代码。使用这个框架,我们只需要知道每个回调函数的作用,在回调函数中写上处理代码即可。

#include "DXUT.h"
#include "DXUTgui.h"
/*-----------------------------------------------------------
*************************************************************
*D3D相关回调函数
*************************************************************
------------------------------------------------------------*/
//1.D3d设备创建成功后回调
HRESULT CALLBACK OnD3D9CreateDevice(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext);
//2.重置D3d设备成功后回调
HRESULT CALLBACK OnD3D9ResetDevice(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext);
//3.主消息处理和传递函数
LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext);
//4.主渲染函数,主要是显示部分
void CALLBACK OnD3D9FrameRender(IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext);
//5.D3d设备丢失后回调,如显卡突然损坏了
void CALLBACK OnD3D9LostDevice(void* pUserContext);
//6.D3d设备销毁(释放)后回调,如关闭程序
void CALLBACK OnD3D9DestroyDevice(void* pUserContext);
//7.键盘事件回调
void CALLBACK OnKeyboard(UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext);
//8.Dialog上的按钮等响应(这个是CDXUTDialog部分的,不属于框架)
void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext);
//9.鼠标事件
void CALLBACK OnMouse(bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta, int xPos, int yPos, void* pUserContext);
//Main 入口函数
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{// Enable run-time memory check for debug builds.// TODO: 在此放置代码。// Set DXUT callbacksDXUTSetCallbackMsgProc(MsgProc);DXUTSetCallbackKeyboard(OnKeyboard);DXUTSetCallbackMouse(OnMouse);DXUTSetCallbackD3D9DeviceCreated(OnD3D9CreateDevice);DXUTSetCallbackD3D9DeviceReset(OnD3D9ResetDevice);DXUTSetCallbackD3D9DeviceLost(OnD3D9LostDevice);DXUTSetCallbackD3D9DeviceDestroyed(OnD3D9DestroyDevice);DXUTSetCallbackD3D9FrameRender(OnD3D9FrameRender);InitAppUI();DXUTInit(true, true, NULL); // Parse the command line, show msgboxes on error, no extra command line paramsDXUTSetCursorSettings(true, true);DXUTCreateWindow(L"拼接程序(DX9)");DXUTCreateDevice(true, 440, 280);DXUTMainLoop(); // Enter into the DXUT render loopreturn DXUTGetExitCode();
}

对于ID3D开头的类,大多数情况下是以指针的形式使用,在使用完成后一定要记得Safe Release,否则容易内存泄漏。

#define SAFE_RELEASE(p)      { if (p) { (p)->Release(); (p)=NULL; } }

二、基本的设置窗口和程序全屏

拼接程序需要设置很多参数,就需要一个设置界面,在全屏状态下通过点击按钮和改变参数来调整拼接的效果,我使用的是CDXUTDialog,例如程序在启动之前需要设置屏幕(投影机)的排列方式

//CDXUTDialogResourceManager  g_DlgResManager;                //对话框管理器(针对所有的)
//CDXUTDialog                 g_BasicSetDlg;                  //设置对话框
void InitAppUI()
{g_BasicSetDlg.Init(&g_DlgResManager);g_BasicSetDlg.SetCallback(OnGUIEvent);//g_BasicSetDlg.AddStatic(IDC_STATIC_SCREENWIDTH, L"单个屏幕宽(像素):", 80, 30, 125, 22);g_BasicSetDlg.AddStatic(IDC_STATIC_SCREENHEIGHT, L"单个屏幕高(像素):", 80, 70, 125, 22);g_BasicSetDlg.AddEditBox(IDC_EDIT_SCREENWIDTH, L"1920", 230, 25, 125, 35);g_BasicSetDlg.AddEditBox(IDC_EDIT_SCREENHEIGHT, L"1080", 230, 65, 125, 35);//g_BasicSetDlg.AddStatic(IDC_STATIC_SCREENROWS, L"屏幕排列-行:", 80, 110, 125, 22);g_BasicSetDlg.AddStatic(IDC_STATIC_SCREENCOLS, L"屏幕排列-列:", 80, 150, 125, 22);g_BasicSetDlg.AddEditBox(IDC_EDIT_SCREENROWS, L"1", 230, 105, 125, 35);g_BasicSetDlg.AddEditBox(IDC_EDIT_SCREENCOLS, L"1", 230, 145, 125, 35);//BTNg_BasicSetDlg.AddButton(IDC_BTN_CONFIRM, L"确认", 80, 220, 80, 30);g_BasicSetDlg.AddButton(IDC_BTN_CANCEL, L"取消", 280, 220, 80, 30);}

全屏状态

//移动界面::SetWindowLong(DXUTGetHWND(), GWL_STYLE, WS_EX_TOPMOST | WS_POPUP);  //设置样式::SetWindowPos(DXUTGetHWND(), HWND_NOTOPMOST, 0, 0, g_BasicSet.Width*g_BasicSet.Cols, g_BasicSet.Height*g_BasicSet.Rows, SWP_SHOWWINDOW);//移动位置

设置观察点

void SetTransformAndState()
{LPDIRECT3DDEVICE9 pd3dDevice = DXUTGetD3D9Device();//初始化位置D3DXMATRIX Ortho2D;D3DXMATRIX Identity;//设置观看方式永远位于屏幕中心D3DXMatrixIdentity(&Identity);D3DXMatrixOrthoLH(&Ortho2D, AllScreenWidth, AllScreenHeight, 1.0f, 1000.0f);pd3dDevice->SetTransform(D3DTS_PROJECTION, &Ortho2D);pd3dDevice->SetTransform(D3DTS_VIEW, &Identity);//D3DXMatrixRotationY(&Identity, 1);pd3dDevice->SetTransform(D3DTS_WORLD, &Identity);//设置材质?不知道干啥D3DMATERIAL9 mtrl;::ZeroMemory(&mtrl, sizeof(mtrl));mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);pd3dDevice->SetMaterial(&mtrl);// Set the ambient lightpd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));}

投影机拼接融合技术--DXUT框架相关推荐

  1. 投影机拼接融合技术--介绍

    一.准备知识和技术 ----使用语言:C++ ----使用框架:DXUT(D3D) ----涉及知识:C++基础编程,OpenGL,音视频播放等 --------------------------- ...

  2. PCL三维点云拼接融合技术

    转自:https://blog.csdn.net/dcba2014/article/details/71859375?locationNum=2&fps=1 本例使用pcd格式点云文件进行配准 ...

  3. 多模态融合技术综述和应用

    文章目录 多模态技术基础 1,多模态融合架构(神经网络模型的基本结构形式) 1.1联合架构 1.2协同架构 1.3编解码架构(自监督) 2,多模态融合方法 2.1早期融合 2.2 晚期融合 2.3混合 ...

  4. 目标检测中特征融合技术(YOLO v4)(下)

    目标检测中特征融合技术(YOLO v4)(下) ASFF:自适应特征融合方式 ASFF来自论文:<Learning Spatial Fusion for Single-Shot Object D ...

  5. 目标检测中特征融合技术(YOLO v4)(上)

    目标检测中特征融合技术(YOLO v4)(上) 论文链接:https://arxiv.org/abs/1612.03144 Feature Pyramid Networks for Object De ...

  6. 图像拼接和图像融合技术

    from: OpenCV探索之路(二十四)图像拼接和图像融合技术 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所 ...

  7. javaweb开发要学习的所有技术和框架总结

    javaweb开发要学习的所有技术和框架总结: 前端技术: HTML, CSS, JAVASCRIPT, JQUERY, AJAX HTML "超文本"就是指页面内可以包含图片.链 ...

  8. 合成孔径成像算法与实现_MIMO OFDM宽幅SAR成像仿真与图像融合技术

    在之前的<UWB OFDM信号产生,MIMO-SAR显优势>一文中,我们曾介绍了正交频分复用(OFDM)信号的产生原理及在雷达应用中的优势.本文将在此基础上介绍MIMO OFDM宽幅SAR ...

  9. 基于GPU的多相机拼接全景技术

     全景视频拼接关键技术 一.原理介绍 图像拼接(Image Stitching)是一种利用实景图像组成全景空间的技术,它将多幅图像拼接成一幅大尺度图像或360度全景图,图像拼接技术涉及到计算机视觉 ...

最新文章

  1. k means聚类算法_一文读懂K-means聚类算法
  2. 我国机器视觉企业体量偏小,上游零部件占利润大头
  3. AprilTag程序的获取
  4. 洛谷 P4475 巧克力王国 解题报告
  5. jmeter 自定义参数_jmeter参数化并在jenkins上执行
  6. Linux学习:gcc 编译其他常用参数
  7. 拥抱.NET Core系列:MemoryCache 缓存域
  8. 决策树可视化保姆级教程
  9. Servlet使用适配器模式进行增删改查案例(Emp.java)
  10. hadoop可以解决什么问题_快速解决皮带机轴磨损问题可以这样做
  11. 朵朵糖故事机器人怎么更新_“故事贩卖机”专栏创始人温酒的新作,奇幻世界的暖心物语很治愈...
  12. java将所有的字符串转换为大写或小写
  13. asp.net 数据绑定 使用eval 时候报 “字符文本中的字符太多” 问题解决
  14. 社会我张哥,人狠话不多。
  15. sklearn——model_selection——knn手写识别系统+iris分类
  16. 原生 JavaScript 实现扫雷
  17. Axure 8.1.0.3388授权码
  18. hazy的零碎知识点(防遗忘)
  19. 程序员常用英语积累---持续更新
  20. 程序员学历不好是硬伤?苹果公司 50% 员工没大学学历

热门文章

  1. 危难中拯救华为:08机往事
  2. DIV+CSS实现圆角边框
  3. cocos2d-x 中的pvr.ccz压缩图片的使用方法
  4. 软件测评师--第14小时 易用性测试
  5. dvorak在win 和Linux中文输入法的日常用法
  6. 央视影音 服务器暂时无法连接服务器,央视影音APP播放不了怎样办 打开不知道决办法...
  7. android中怎么实现点击按钮进行页面的跳转
  8. css设置图标居左_「css图片居中」css - 常用 垂直/水平居中 + 左右布局 - seo实验室...
  9. Android6.0添加usb转网口
  10. 输电线路巡检机器人PPT_110kV架空输电线路巡检机器人视频图像传输