2014/09/19

(转载自:http://blog.csdn.net/rabbit729/article/details/6388703)

想要在D3D中加载2D图片可以使用如下两种方法(我只想到这两种方法,如果有其他方法,请指教)。第一种就是把图片以纹理方式加载,然后以此为纹理绘制一个四边形即可;第二种就是使用2D点精灵,不解释,你懂得;下面分别给出两种方法的代码:

第一种:绘制四边形

[cpp]  view plain copy
  1. #include <d3dx9.h>
  2. //-----------------------------------------------------------------------------
  3. // Desc: 全局变量
  4. //-----------------------------------------------------------------------------
  5. LPDIRECT3D9             g_pD3D       = NULL;    //Direct3D对象
  6. LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;    //Direct3D设备对象
  7. LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL;    //顶点缓冲区对象
  8. LPDIRECT3DTEXTURE9      g_pTex       = NULL;    //纹理
  9. //-----------------------------------------------------------------------------
  10. // Desc: 顶点结构
  11. //-----------------------------------------------------------------------------
  12. struct CUSTOMVERTEX
  13. {
  14. FLOAT x, y, z, rhw;
  15. FLOAT u, v;
  16. };
  17. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1)  //顶点格式
  18. //-----------------------------------------------------------------------------
  19. // Desc: 初始化Direct3D
  20. //-----------------------------------------------------------------------------
  21. HRESULT InitD3D( HWND hWnd )
  22. {
  23. //创建Direct3D对象, 该对象用于创建Direct3D设备对象
  24. if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
  25. return E_FAIL;
  26. //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
  27. D3DPRESENT_PARAMETERS d3dpp;
  28. ZeroMemory( &d3dpp, sizeof(d3dpp) );
  29. d3dpp.Windowed = TRUE;
  30. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  31. d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
  32. //创建Direct3D设备对象
  33. if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  34. D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  35. &d3dpp, &g_pd3dDevice ) ) )
  36. {
  37. return E_FAIL;
  38. }
  39. //加载纹理
  40. if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, L"Water lilies.jpg", &g_pTex)))
  41. {
  42. return E_FAIL;
  43. }
  44. return S_OK;
  45. }
  46. //-----------------------------------------------------------------------------
  47. // Desc: 创建并填充顶点缓冲区
  48. //-----------------------------------------------------------------------------
  49. HRESULT InitVB()
  50. {
  51. //顶点数据
  52. CUSTOMVERTEX vertices[] =
  53. {
  54. { 100.0f, 100.0f, 0.5f, 1.0f, 0.f, 0.f },
  55. { 400.0f, 100.0f, 0.5f, 1.0f, 1.f, 0.f},
  56. { 400.0f, 400.0f, 0.5f, 1.0f, 1.f, 1.f},
  57. { 100.0f, 100.0f, 0.5f, 1.0f, 0.f, 0.f },
  58. { 400.0f, 400.0f, 0.5f, 1.0f, 1.f, 1.f},
  59. { 100.0f, 400.0f, 0.5f, 1.0f, 0.f, 1.f},
  60. };
  61. //创建顶点缓冲区
  62. if( FAILED( g_pd3dDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX),
  63. 0, D3DFVF_CUSTOMVERTEX,
  64. D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
  65. {
  66. return E_FAIL;
  67. }
  68. //填充顶点缓冲区
  69. VOID* pVertices;
  70. if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
  71. return E_FAIL;
  72. memcpy( pVertices, vertices, sizeof(vertices) );
  73. g_pVB->Unlock();
  74. return S_OK;
  75. }
  76. //-----------------------------------------------------------------------------
  77. // Desc: 释放创建的对象
  78. //-----------------------------------------------------------------------------
  79. VOID Cleanup()
  80. {
  81. //释放纹理
  82. if(g_pTex != NULL)
  83. {
  84. g_pTex->Release();
  85. }
  86. //释放顶点缓冲区对象
  87. if( g_pVB != NULL )
  88. g_pVB->Release();
  89. //释放Direct3D设备对象
  90. if( g_pd3dDevice != NULL )
  91. g_pd3dDevice->Release();
  92. //释放Direct3D对象
  93. if( g_pD3D != NULL )
  94. g_pD3D->Release();
  95. }
  96. //-----------------------------------------------------------------------------
  97. // Desc: 渲染图形
  98. //-----------------------------------------------------------------------------
  99. VOID Render()
  100. {
  101. //清空后台缓冲区
  102. g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
  103. //开始在后台缓冲区绘制图形
  104. if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
  105. {
  106. //在后台缓冲区绘制图形
  107. g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
  108. g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  109. g_pd3dDevice->SetTexture(0, g_pTex);
  110. g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );
  111. //结束在后台缓冲区绘制图形
  112. g_pd3dDevice->EndScene();
  113. }
  114. //将在后台缓冲区绘制的图形提交到前台缓冲区显示
  115. g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  116. }
  117. //-----------------------------------------------------------------------------
  118. // Desc: 消息处理
  119. //-----------------------------------------------------------------------------
  120. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  121. {
  122. switch( msg )
  123. {
  124. case WM_DESTROY:
  125. Cleanup();
  126. PostQuitMessage( 0 );
  127. return 0;
  128. }
  129. return DefWindowProc( hWnd, msg, wParam, lParam );
  130. }
  131. //-----------------------------------------------------------------------------
  132. // Desc: 入口函数
  133. //-----------------------------------------------------------------------------
  134. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCELPSTRINT )
  135. {
  136. //注册窗口类
  137. WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  138. GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  139. L"ClassName", NULL };
  140. RegisterClassEx( &wc );
  141. //创建窗口
  142. HWND hWnd = CreateWindow( L"ClassName", L"顶点缓冲区",
  143. WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
  144. GetDesktopWindow(), NULL, wc.hInstance, NULL );
  145. //初始化Direct3D
  146. if( SUCCEEDED( InitD3D( hWnd ) ) )
  147. {
  148. //创建并填充顶点缓冲区
  149. if( SUCCEEDED( InitVB() ) )
  150. {
  151. //显示窗口
  152. ShowWindow( hWnd, SW_SHOWDEFAULT );
  153. UpdateWindow( hWnd );
  154. //进入消息循环
  155. MSG msg;
  156. ZeroMemory( &msg, sizeof(msg) );
  157. while( msg.message!=WM_QUIT )
  158. {
  159. if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  160. {
  161. TranslateMessage(&msg);
  162. DispatchMessage(&msg);
  163. }
  164. else
  165. {
  166. Render();  //渲染图形
  167. }
  168. }
  169. }
  170. }
  171. UnregisterClass(L"ClassName", wc.hInstance);
  172. return 0;
  173. }

第二种:点精灵

[cpp]  view plain copy
  1. #include <d3dx9.h>
  2. //-----------------------------------------------------------------------------
  3. // Desc: 全局变量
  4. //-----------------------------------------------------------------------------
  5. LPDIRECT3D9             g_pD3D       = NULL;    //Direct3D对象
  6. LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;    //Direct3D设备对象
  7. LPDIRECT3DTEXTURE9      g_pTex       = NULL;    //纹理
  8. LPD3DXSPRITE            g_pSprite    = NULL;    //点精灵
  9. //-----------------------------------------------------------------------------
  10. // Desc: 初始化Direct3D
  11. //-----------------------------------------------------------------------------
  12. HRESULT InitD3D( HWND hWnd )
  13. {
  14. //创建Direct3D对象, 该对象用于创建Direct3D设备对象
  15. if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
  16. return E_FAIL;
  17. //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
  18. D3DPRESENT_PARAMETERS d3dpp;
  19. ZeroMemory( &d3dpp, sizeof(d3dpp) );
  20. d3dpp.Windowed = TRUE;
  21. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  22. d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
  23. //创建Direct3D设备对象
  24. if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  25. D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  26. &d3dpp, &g_pd3dDevice ) ) )
  27. {
  28. return E_FAIL;
  29. }
  30. // 创建点精灵
  31. if (FAILED(D3DXCreateSprite( g_pd3dDevice, &g_pSprite )))
  32. {
  33. return E_FAIL;
  34. }
  35. //加载纹理
  36. if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, L"Water lilies.jpg", &g_pTex)))
  37. {
  38. return E_FAIL;
  39. }
  40. return S_OK;
  41. }
  42. //-----------------------------------------------------------------------------
  43. // Desc: 释放创建的对象
  44. //-----------------------------------------------------------------------------
  45. VOID Cleanup()
  46. {
  47. //释放纹理
  48. if(g_pTex != NULL)
  49. {
  50. g_pTex->Release();
  51. }
  52. //释放点精灵
  53. if (g_pSprite != NULL)
  54. {
  55. g_pSprite->Release();
  56. }
  57. //释放Direct3D设备对象
  58. if( g_pd3dDevice != NULL )
  59. g_pd3dDevice->Release();
  60. //释放Direct3D对象
  61. if( g_pD3D != NULL )
  62. g_pD3D->Release();
  63. }
  64. //-----------------------------------------------------------------------------
  65. // Desc: 渲染图形
  66. //-----------------------------------------------------------------------------
  67. VOID Render()
  68. {
  69. //清空后台缓冲区
  70. g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
  71. //开始在后台缓冲区绘制图形
  72. if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
  73. {
  74. if ( SUCCEEDED( g_pSprite->Begin(D3DXSPRITE_ALPHABLEND) ) )
  75. {
  76. g_pSprite->Draw(g_pTex, NULL, NULL, NULL, 0xffffffff);
  77. g_pSprite->End();
  78. }
  79. //结束在后台缓冲区绘制图形
  80. g_pd3dDevice->EndScene();
  81. }
  82. //将在后台缓冲区绘制的图形提交到前台缓冲区显示
  83. g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  84. }
  85. //-----------------------------------------------------------------------------
  86. // Desc: 消息处理
  87. //-----------------------------------------------------------------------------
  88. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  89. {
  90. switch( msg )
  91. {
  92. case WM_DESTROY:
  93. Cleanup();
  94. PostQuitMessage( 0 );
  95. return 0;
  96. }
  97. return DefWindowProc( hWnd, msg, wParam, lParam );
  98. }
  99. //-----------------------------------------------------------------------------
  100. // Desc: 入口函数
  101. //-----------------------------------------------------------------------------
  102. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCELPSTRINT )
  103. {
  104. //注册窗口类
  105. WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  106. GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  107. L"ClassName", NULL };
  108. RegisterClassEx( &wc );
  109. //创建窗口
  110. HWND hWnd = CreateWindow( L"ClassName", L"顶点缓冲区",
  111. WS_OVERLAPPEDWINDOW, 200, 100, 800, 600,
  112. GetDesktopWindow(), NULL, wc.hInstance, NULL );
  113. //初始化Direct3D
  114. if( SUCCEEDED( InitD3D( hWnd ) ) )
  115. {
  116. //创建并填充顶点缓冲区
  117. if( SUCCEEDED( TRUE ) )
  118. {
  119. //显示窗口
  120. ShowWindow( hWnd, SW_SHOWDEFAULT );
  121. UpdateWindow( hWnd );
  122. //进入消息循环
  123. MSG msg;
  124. ZeroMemory( &msg, sizeof(msg) );
  125. while( msg.message!=WM_QUIT )
  126. {
  127. if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  128. {
  129. TranslateMessage(&msg);
  130. DispatchMessage(&msg);
  131. }
  132. else
  133. {
  134. Render();  //渲染图形
  135. }
  136. }
  137. }
  138. }
  139. UnregisterClass(L"ClassName", wc.hInstance);
  140. return 0;
  141. }

D3D中2D图片的绘制两种方法相关推荐

  1. D3D中2D图片的绘制

    想要在D3D中加载2D图片可以使用如下两种方法(我只想到这两种方法,如果有其他方法,请指教).第一种就是把图片以纹理方式加载,然后以此为纹理绘制一个四边形即可:第二种就是使用2D点精灵,不解释,你懂得 ...

  2. android获取位图字节数,Android中获取图片尺寸大小两种方法

    两种方法  建议用第二种 private void getPictureSize(String path) { /*第一种直接把bitmap加载到内存中,通过对bitmap的测量, 得出宽高,由于这个 ...

  3. opencv中遍历图片数据的两种方法

    方法一: IplImage *pImg = ...; int nWidth = pImg->width; int nHeight = pImg->height; int nChannels ...

  4. qt 加载 图片旋转_QT 实现图片旋转的两种方法

    第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...

  5. android 图片叠加xml,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // ...

  6. pytorch加载自己的图片数据集的两种方法

    目录 ImageFolder 加载数据集 使用pytorch提供的Dataset类创建自己的数据集. Dataset加载数据集 接下来我们就可以构建我们的网络架构: 训练我们的网络: 保存网络模型(这 ...

  7. android 画布叠加,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(Vi ...

  8. java 图片压缩100k_Java 实现图片压缩的两种方法

    问题背景. 典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示. 如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了. 用户上传的原图可能由于清晰度较高而体 ...

  9. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

最新文章

  1. Fragment 之间传递数据
  2. 模拟儿童学习多语言,Deepmind让DL看视频就学会翻译
  3. 磁珠,电感,零欧电阻之间的区别
  4. vdi voi idv区别_VDI桌面虚拟化和IDV桌面虚拟化到底有哪些不同
  5. Jquery中设置表格的悬浮和选中时行的背景颜色
  6. 海量数据库的查询优化及分页算法方案 1
  7. 2020,PyTorch真的赶上TensorFlow了吗?
  8. 在安装keepalived出现问题:需要:libmysqlclient.so.18
  9. 将一正整数序列{K1,K2,…,K9}重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描
  10. oracle:用户购买平台案例分析与优化
  11. java中判斷主鍵重複
  12. unity 序列帧动画 UGUI GPU版
  13. Android连接大华条码秤区位码转换
  14. 基于vue3.0的ionic中文开发文档
  15. 分布式日志收集(ELK)
  16. dll 不是 PML.NET callable问题解决办法
  17. 信安实验-RSA(备课)
  18. 快速提取Word文档中的所有图片
  19. iCheck组件使用方法总结
  20. 浅谈 什么是封装、继承与多态?

热门文章

  1. 数学奥赛狂砍10题!Meta发布全新定理证明器:AI即将接管数学?
  2. China Looks To The Sea For Water
  3. Dapper入门使用
  4. flex布局——最后一行左对齐的实现方式(css功能实现)
  5. python实训总结泰坦尼克号_Python-数据清洗与分析案例之泰坦尼克号(一)
  6. 画布Canvas在线生成支付宝收款码
  7. 微信小程序 页面路由 实现页面切换
  8. 什么是human synapsin promoter?
  9. 供应链金融区块链应用
  10. 创建Python3虚拟环境失败问题跟进