D3D初學入門一(配置開發環境及繪製D3D視窗)

來源:互聯網
上載者:User

  最近一直接觸的都是C#的東東,好久沒寫C++代碼了,怕手生忘記了,打算寫寫C++的代碼。寫什麼好呢?想來想去,以前的工作學過接觸了些OpenGL,那我就學習一下D3D吧。原以為D3D的中文入門資料會很多的,結果找了半天也沒找到合適的。哎,隨便將就著學吧。

  既然是來興趣學一下,我可不想去下個超大的DirectX安裝包,所以首先,當然得找到lib庫和標頭檔啦,我在GameRes遊戲開發資源網上找到了,只有3.2M,呵呵,夠小吧。地址如下:

  DirectX9.0C SDK library

  下載下來解壓後,假設解壓到d:/codelib/dx9csdk下吧, 首先得把INC和lib目錄加到VC的搜尋路徑上去。

  我用VS2005, 選擇菜單Tools - Option - Projects and Solutions - VC++ Directories

 

  

  然後,接下來就可以開始寫代碼了。

  我們採用Win32API來建立視窗,為了重用代碼,建立視窗使用了我部落格裡介紹的一個類KWindow,請見:

  一個基於Win32的完全物件導向的視窗類別

  我們建立一個類,叫做KD3DWindow把,從KWindow繼承。

  其UML圖如下所示:

  KWindow的內容請看我部落格上的前一篇文章吧。

  KD3DWindow.h的內容如下所示:

  1. #include "KWindow.h"
  2. #include <D3D8.H>
  3. #pragma comment(lib, "D3d8.lib")   //連結庫
  4. class KD3DWindow : public KWindow
  5. {
  6. private:
  7.     void OnKeyDown(WPARAM wParam, LPARAM lParam);
  8.     void OnDraw(HDC hDC);
  9.     void GetWndClassEx(WNDCLASSEX & wc);
  10.     
  11.     //D3D相關
  12.     void Render();
  13.     void Cleanup();
  14.     HRESULT InitD3D( HWND hWnd );
  15. public:   
  16.     KD3DWindow();
  17.     ~KD3DWindow();
  18.        virtual bool CreateEx(DWORD dwExStyle,
  19.         LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
  20.         int x, int y, int nWidth, int nHeight, HWND hParent,
  21.         HMENU hMenu, HINSTANCE hInst);
  22. private:
  23.     LPDIRECT3D8             g_pD3D      ; // 用來建立D3D裝置
  24.     LPDIRECT3DDEVICE8       g_pd3dDevice ; // D3D裝置
  25. };

  KD3DWindow.cpp內容如下:

  1. // KD3DWindow.cpp: implementation of the KD3DWindow class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "KD3DWindow.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. #include <windows.h>
  10. #include <assert.h>
  11. #include <tchar.h>
  12. #include "KWindow.h"
  13. const TCHAR szHint[]    = _T("Press ESC to quit.");
  14. void KD3DWindow::GetWndClassEx( WNDCLASSEX & wc )
  15. {
  16.     memset(& wc, 0, sizeof(wc));
  17.     
  18.     wc.cbSize        = sizeof(WNDCLASSEX);
  19.     wc.style         = 0;
  20.     wc.lpfnWndProc   = WindowProc;
  21.     wc.cbClsExtra    = 0;
  22.     wc.cbWndExtra    = 0;
  23.     wc.hInstance     = NULL;
  24.     wc.hIcon         = NULL;
  25.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  26.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  27.     wc.lpszMenuName  = NULL;
  28.     wc.lpszClassName = NULL;
  29.     wc.hIconSm       = NULL;
  30. }
  31. void KD3DWindow::OnDraw( HDC hDC )
  32. {
  33.     //先用D3D裝置渲染
  34.     Render();
  35.     //用Windows API在螢幕上繪圖
  36.     TextOut(hDC, 0, 0, szHint, lstrlen(szHint));
  37. }
  38. void KD3DWindow::OnKeyDown( WPARAM wParam, LPARAM lParam )
  39. {
  40.     if (wParam==VK_ESCAPE )
  41.     {
  42.         PostMessage(m_hWnd, WM_CLOSE, 0, 0);
  43.     }
  44. }
  45. // 初始化D3D
  46. HRESULT KD3DWindow::InitD3D( HWND hWnd )
  47. {
  48.     //如果還沒有視窗,返回失敗啦
  49.     if( m_hWnd == NULL)
  50.         return E_FAIL;
  51.     // 建立D3D對象
  52.     if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
  53.         return E_FAIL;
  54.     // 擷取當前的顯示模式
  55.     D3DDISPLAYMODE d3ddm;
  56.     if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
  57.         return E_FAIL;
  58.     D3DPRESENT_PARAMETERS d3dpp; 
  59.     ZeroMemory( &d3dpp, sizeof(d3dpp) );
  60.     d3dpp.Windowed = TRUE;              // 視窗模式
  61.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   // 設定交換模式
  62.     d3dpp.BackBufferFormat = d3ddm.Format;      // 設定背景緩衝區格式為當前左面格式
  63.     // 建立D3D裝置
  64.     // 第一個參數:使用預設的顯卡
  65.     // 第二個參數:請求使用硬體抽象層(HAL)
  66.     // 第三個參數:視窗控制代碼
  67.     // 第四個參數:使用軟體處理頂點
  68.     // 第五個參數:建立的參數
  69.     // 第六個參數:建立的D3D裝置指標
  70.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 
  71.                       D3DDEVTYPE_HAL, 
  72.                       hWnd,
  73.                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  74.                       &d3dpp, 
  75.                       &g_pd3dDevice ) ) )
  76.     {
  77.         return E_FAIL;
  78.     }
  79.     return S_OK;
  80. }
  81. // 釋放D3D
  82. void KD3DWindow::Cleanup()
  83. {
  84.     if( g_pd3dDevice != NULL) 
  85.         g_pd3dDevice->Release();
  86.     if( g_pD3D != NULL)
  87.         g_pD3D->Release();
  88. }
  89. // 渲染
  90. void KD3DWindow::Render()
  91. {
  92.     if( NULL == g_pd3dDevice )
  93.         return;
  94.     // 清除背景為蘭色
  95.     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
  96.     // 繪製情境
  97.     g_pd3dDevice->BeginScene();
  98.     // 這裡繪製你需要的東西
  99.     // 結束繪製
  100.     g_pd3dDevice->EndScene();
  101.     // 顯示到螢幕上
  102.     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  103. }
  104. KD3DWindow::KD3DWindow()
  105. {
  106. }
  107. KD3DWindow::~KD3DWindow()
  108. {
  109.     Cleanup();
  110. }
  111. bool KD3DWindow::CreateEx(DWORD dwExStyle,
  112.         LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
  113.         int x, int y, int nWidth, int nHeight, HWND hParent,
  114.         HMENU hMenu, HINSTANCE hInst)
  115. {
  116.     //建立視窗
  117.     bool bRet = KWindow::CreateEx(dwExStyle,lpszClass,lpszName,dwStyle,x,y,nWidth,nHeight,hParent,hMenu,hInst);
  118.     //初始化D3D裝置
  119.     if( InitD3D(m_hWnd) != S_OK)
  120.         bRet = false;
  121.     return bRet;
  122. }

  代碼關鍵地方都有注釋,也很好理解的。

  然後就是主函數如何調用了,請看:

  1. int APIENTRY WinMain(HINSTANCE hInstance,
  2.                      HINSTANCE hPrevInstance,
  3.                      LPSTR     lpCmdLine,
  4.                      int       nCmdShow)
  5. {
  6.     // TODO: Place code here.
  7.     KD3DWindow win;
  8.     //KHelloWindow win; 
  9.     win.CreateEx(0, _T("Hello"), _T("Hello"), WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN)/4, GetSystemMetrics(SM_CYSCREEN)/4,
  10.         GetSystemMetrics(SM_CXSCREEN)/2,
  11.         GetSystemMetrics(SM_CYSCREEN)/2,
  12.         NULL, NULL, hInstance);
  13.     win.ShowWindow(nCmdShow);
  14.     win.UpdateWindow();
  15.     return win.MessageLoop();
  16. }

  編譯運行後,可以看到程式既有D3D渲染的背景情境,也有Win32 GDI繪製的文字。如下所示:

本文來自
http://blog.csdn.net/zxcred

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.