D3D中2D图片的绘制

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



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

   第一种:绘制四边形

  

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

 

第二种:点精灵

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

你可能感兴趣的:(D3D中2D图片的绘制)