DirectX 3D 基本框架(一)

給出DirectX 3D 應用程序的基本框架,顯示一個空白窗口。若要寫出相關例程,只需修改相關函數即可。我已經加了詳細註釋。

 

頭文件:

  1. //////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // File: d3dUtility.h
  4. // by tianzhihen 
  5. // 2008.10.9
  6. // MSVC++ 8.0
  7. //////////////////////////////////////////////////////////////////////////////////////////////////
  8. #ifndef __d3dUtilityH
  9. #define __d3dUtilityH
  10. #include <d3dx9.h>
  11. //#include <string>
  12. namespace d3d
  13. {
  14.     bool InitD3D(
  15.         HINSTANCE hInstance,    //應用程序實例
  16.         int width, int height,  //後備緩衝寬/高
  17.         bool windowed,          //顯示模式(窗口/全屏)
  18.         D3DDEVTYPE deviceType,  //設備類型(HAL/REF)
  19.         IDirect3DDevice9** device   //指向設備(顯卡)接口地址的指針
  20.         );
  21.     //進入消息循環
  22.     int EnterMsgLoop(
  23.         bool (*ptr_display)(float timeDelta));
  24.     //回調函數
  25.     LRESULT CALLBACK WndProc(
  26.         HWND hwnd,
  27.         UINT msg,
  28.         WPARAM wParam,
  29.         LPARAM lParam
  30.         );
  31.     template<class T> void Release(T t)
  32.     {
  33.         if (t)
  34.         {
  35.             t->Release();
  36.             t = 0;
  37.         }
  38.     }
  39.     template<class T> void Delete(T t)
  40.     {
  41.         if (t)
  42.         {
  43.             delete t;
  44.             t = 0;
  45.         }
  46.     }
  47. }
  48. #endif

其實現文件:

  1. //////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // File: d3dUtility.cpp
  4. // by tianzhihen 
  5. // 2008.10.9
  6. // MSVC++ 8.0
  7. //////////////////////////////////////////////////////////////////////////////////////////////////
  8. #include "d3dUtility.h"
  9. bool d3d::InitD3D(HINSTANCE hInstance, 
  10.                   int width, int height, 
  11.                   bool windowed, 
  12.                   D3DDEVTYPE deviceType,
  13.                   IDirect3DDevice9** device )
  14. {
  15.     //
  16.     //創造應用程序窗口
  17.     //
  18.     //初始化windows窗口類
  19.     WNDCLASS wc;
  20.     wc.style         = CS_HREDRAW | CS_VREDRAW;
  21.     wc.lpfnWndProc   = (WNDPROC)d3d::WndProc; 
  22.     wc.cbClsExtra    = 0;
  23.     wc.cbWndExtra    = 0;
  24.     wc.hInstance     = hInstance;
  25.     wc.hIcon         = LoadIcon(0, IDI_APPLICATION);
  26.     wc.hCursor       = LoadCursor(0, IDC_ARROW);
  27.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  28.     wc.lpszMenuName  = 0;
  29.     wc.lpszClassName = "Direct3D9App";
  30.     //註冊窗口類
  31.     if (!RegisterClass(&wc))
  32.     {
  33.         ::MessageBox(0,"RegisterClass() - FAILED",0,0);
  34.         return false;
  35.     }
  36.     
  37.     //創建窗口並返回其句柄
  38.     HWND hwnd = 0;
  39.     hwnd = ::CreateWindow("Direct3D9App""Direct3D9App"
  40.         WS_EX_TOPMOST,
  41.         0, 0, width, height,
  42.         0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/); 
  43.     if( !hwnd )
  44.     {
  45.         ::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
  46.         return false;
  47.     }
  48.     //顯示/更新 窗口
  49.     ::ShowWindow(hwnd,SW_SHOW);
  50.     ::UpdateWindow(hwnd);
  51.     //
  52.     // Init D3D
  53.     //
  54.     HRESULT hr = 0;
  55.     //獲取IDirect3D9 的指針(第1步)
  56.     IDirect3D9* d3d9 = 0;
  57.     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
  58.     if (!d3d9)
  59.     {
  60.         ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
  61.         return false;
  62.     }
  63.     //校驗頂點運算(第2步)
  64.     //獲取設備性能
  65.     D3DCAPS9 caps;
  66.     d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, //指定默認顯示卡
  67.         deviceType,     //指定設備類型
  68.         &caps /*返回已初始化的設備性能結構實例*/);
  69.     int vp = 0;
  70.     if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
  71.         vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;   //支持硬件頂點運算
  72.     else
  73.         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;   //不支持硬件頂點運算
  74.     //填充D3DPRESENT_PARAMETERS 結構(第3步)
  75.     D3DPRESENT_PARAMETERS d3dpp;
  76.     d3dpp.BackBufferWidth            = width;
  77.     d3dpp.BackBufferHeight           = height;
  78.     d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
  79.     d3dpp.BackBufferCount            = 1;
  80.     d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
  81.     d3dpp.MultiSampleQuality         = 0;
  82.     d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD; //指定交換鏈中的緩存的頁面置換方式
  83.     d3dpp.hDeviceWindow              = hwnd;
  84.     d3dpp.Windowed                   = windowed;
  85.     d3dpp.EnableAutoDepthStencil     = true
  86.     d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
  87.     d3dpp.Flags                      = 0;
  88.     d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //默認刷新頻率
  89.     d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;   //立即提交(後備緩衝)
  90.     //創建設備(第4步)
  91.     hr = d3d9->CreateDevice(
  92.         D3DADAPTER_DEFAULT, //默認顯示卡
  93.         deviceType, //設備類型(HAL/REF)
  94.         hwnd,   //窗口句柄
  95.         vp,     //指定頂點運算方式
  96.         &d3dpp, //present parameters
  97.         device  //返回創建的設備接口的地址
  98.         );
  99.     if(FAILED(hr))
  100.     {
  101.         //如果創建失敗,重設深度緩存的像素格式,再創建一次。
  102.         d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  103.         hr = d3d9->CreateDevice(
  104.             D3DADAPTER_DEFAULT, //默認顯示卡
  105.             deviceType, //設備類型(HAL/REF)
  106.             hwnd,   //窗口句柄
  107.             vp,     //指定頂點運算方式
  108.             &d3dpp, //present parameters
  109.             device  //返回創建的設備接口的地址
  110.             );
  111.         if (FAILED(hr))
  112.         {
  113.             d3d9->Release();
  114.             ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
  115.             return false;
  116.         }
  117.     }
  118.     d3d9->Release();
  119.     return true;
  120. }
  121. int d3d::EnterMsgLoop(bool (*ptr_display)(float timeDelta))
  122. {
  123.     //
  124.     //消息循環
  125.     //
  126.     MSG msg;
  127.     ::ZeroMemory(&msg,sizeof(MSG));
  128.     static float lastTime = (float)timeGetTime(); 
  129.     while (msg.message!=WM_QUIT)
  130.     {
  131.         if (::PeekMessage(&msg,0,0,0,PM_REMOVE))
  132.         {
  133.             ::TranslateMessage(&msg);
  134.             ::DispatchMessage(&msg);
  135.         }
  136.         else
  137.         {
  138.             float currTime = (float)timeGetTime();
  139.             float timeDelta = (currTime - lastTime)*0.001f;
  140.             ptr_display(timeDelta);
  141.             lastTime = currTime;
  142.         }
  143.     }
  144.     return msg.wParam;
  145. }

主程序文件:

  1. //////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // File: d3dUtility.cpp
  4. // by tianzhihen 
  5. // 2008.10.9
  6. // MSVC++ 8.0
  7. //////////////////////////////////////////////////////////////////////////////////////////////////
  8. #include "d3dUtility.h"
  9. //
  10. //  全局變量
  11. //
  12. IDirect3DDevice9* Device = 0;
  13. //
  14. // 框架函數
  15. //
  16. bool Setup()
  17. {
  18.     return true;
  19. }
  20. void Cleanup()
  21. {
  22. }
  23. bool Display(float timeDelta)
  24. {
  25.     if (Device)
  26.     {
  27.         Device->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0x00000000,1.0f,0);
  28.         Device->Present(0,0,0,0);
  29.     }
  30.     return true;
  31. }
  32. //
  33. // WndProc
  34. //
  35. LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
  36. {
  37.     switch(msg)
  38.     {
  39.     case WM_DESTROY:
  40.         ::PostQuitMessage(0);
  41.         break;
  42.     case WM_KEYDOWN:
  43.         if(wParam == VK_ESCAPE)
  44.             ::DestroyWindow(hwnd);
  45.         break;
  46.     }
  47.     return ::DefWindowProc(hwnd,msg,wParam,lParam);
  48. }
  49. //
  50. //  WinMain
  51. //
  52. int WINAPI WinMain(HINSTANCE hInstance,
  53.                    HINSTANCE hPrevInstance, 
  54.                    LPSTR lpCmdLine,
  55.                    int nShowCmd )
  56. {
  57.     //程序入口地址
  58.     //初始化D3D
  59.     if (!d3d::InitD3D(hInstance,640,480,true,D3DDEVTYPE_HAL,&Device))
  60.     {
  61.         ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
  62.         return 0;
  63.     }
  64.     //分配資源
  65.     if (!Setup())
  66.     {
  67.         ::MessageBox(0, "Setup() - FAILED", 0, 0);
  68.         return 0;
  69.     }
  70.     //進入消息循環
  71.     d3d::EnterMsgLoop(Display);
  72.     //清理資源
  73.     Cleanup();
  74.     Device->Release();
  75.     return 0;
  76. }

 

發佈了126 篇原創文章 · 獲贊 10 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章