D3D视频渲染入门程序.

学习D3D必备的基础知识:
1. C/C++;
2. Win32 API基础;
3. COM( 组件对象模型)的使用;
4. 数学基础(矩阵、向量、四元数等);
5. 计算机图形学基础(三维变换,渲染,灯光等)。

一个D3D程序的基本结构:



一个基本的D3D程序,渲染显示一个空白窗口,代码如下:

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

运行结果:

展开阅读全文

没有更多推荐了,返回首页