DX中灯光和材质续

 假如设置这样的顶点格式:

  1. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ)//灵活顶点格式
  2. struct CUSTOMVERTEX 
  3. {
  4.     D3DXVECTOR3 position;
  5. };

 

他告诉我们,顶点是未进行坐标转换和光照处理的,须我没手动处理,如果我们未处理会是怎样呢?

 

1 什么都不做:

  1. /******************************************************
  2. FileName: CTDUIMessage.h   - TDOnline/UISystem
  3. Author: lsm   Version:        Date: 08/10/28
  4. Description: Manage message,include accept/post message etc.
  5. History:
  6. <author>  <time>  <version>  <note>
  7. ******************************************************/
  8. /*-------------Head------------*/
  9. #include "assert.h"
  10. #include "d3dx9.h"
  11. #pragma warning(disable : 4996)
  12. #include "strsafe.h"
  13. #pragma warning(disable : 4996)
  14. LPDIRECT3D9                g_pD3DObj   = NULL; //D3D 对象
  15. LPDIRECT3DDEVICE9          g_pD3DDev   = NULL; //D3D 设备
  16. LPDIRECT3DVERTEXBUFFER9    g_pVerBuf   = NULL; //顶点缓冲区
  17. TCHAR g_AppName[] = TEXT("D3D");//类名
  18. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ)//灵活顶点格式
  19. struct CUSTOMVERTEX 
  20. {
  21.     D3DXVECTOR3 position;
  22. };
  23. /*---------------End------------*/
  24. /*==========================================
  25. Function name: InitD3D
  26. Description: 初始化D3D对象
  27. ==========================================*/
  28. HRESULT InitD3D(HWND hWnd)
  29. {
  30.     if((g_pD3DObj = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)//创建3D对象
  31.     {
  32.         assert(false);
  33.         return E_FAIL;
  34.     }
  35.     D3DDISPLAYMODE devMode;
  36.     if (FAILED(g_pD3DObj->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &devMode)))//获得显卡信息
  37.     {
  38.         assert(false);
  39.         return E_FAIL;
  40.     }
  41.     D3DPRESENT_PARAMETERS d3dpp;
  42.     ZeroMemory(&d3dpp, sizeof(d3dpp));
  43.     d3dpp.Windowed               = true;
  44.     d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
  45.     d3dpp.EnableAutoDepthStencil = true;
  46.     d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  47.     d3dpp.BackBufferFormat       = D3DFMT_UNKNOWN;
  48.     
  49.     if(FAILED(g_pD3DObj->CreateDevice(
  50.                                       D3DADAPTER_DEFAULT,
  51.                                       D3DDEVTYPE_HAL,
  52.                                       hWnd,
  53.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  54.                                       &d3dpp,
  55.                                       &g_pD3DDev
  56.                                       )))
  57.     {
  58.         assert(false);
  59.         return E_FAIL;
  60.     }
  61.     g_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  62.     g_pD3DDev->SetRenderState(D3DRS_ZENABLE, true);
  63.     g_pD3DDev->SetRenderState(D3DRS_LIGHTING, true);
  64.     //g_pD3DDev->SetRenderState(D3DRS_AMBIENT, 0x00202020);
  65.     return S_OK;
  66. }
  67. /*==========================================
  68. Function name: InitVBuf
  69. Description: 填充顶点缓冲区
  70. ==========================================*/
  71. HRESULT InitVBuf()
  72. {
  73.     if (FAILED(g_pD3DDev->CreateVertexBuffer(
  74.                                              3*sizeof(CUSTOMVERTEX),
  75.                                              0,
  76.                                              D3DFVF_CUSTOMVERTEX,
  77.                                              D3DPOOL_DEFAULT,
  78.                                              &g_pVerBuf,
  79.                                              NULL
  80.                                              )))
  81.     {
  82.         return E_FAIL;
  83.     }
  84.     CUSTOMVERTEX *vertices;
  85.     if (FAILED(g_pVerBuf->Lock(0, 0, (void**)&vertices, 0)))//锁住内存
  86.     {
  87.         return E_FAIL;
  88.     }
  89.     vertices[0].position = D3DXVECTOR3(-1.0f,-1.0f, 0.0f);//四个点
  90.     vertices[2].position = D3DXVECTOR3( 1.0f,-1.0f, 0.0f);
  91.     vertices[1].position = D3DXVECTOR3( 1.0f, 1.0f, 0.0f);
  92.     g_pVerBuf->Unlock();
  93.     return S_OK;
  94. }
  95. /*==========================================
  96. Function name: ChangeWorld
  97. Description: 坐标变换和设置摄像机
  98. ==========================================*/
  99. HRESULT ChangeWorld()
  100. {
  101.     D3DXMATRIXA16 matWorld;
  102.     D3DXMatrixIdentity(&matWorld);
  103.     g_pD3DDev->SetTransform(D3DTS_WORLD, &matWorld);
  104.     D3DXMATRIXA16 matView;
  105.     D3DXMatrixIdentity(&matView);
  106.     D3DXVECTOR3 eyeVec (0.0f, 0.0f, -4.0f);
  107.     D3DXVECTOR3 lookVec(0.0f, 0.0f,  0.0f);
  108.     D3DXVECTOR3 upVec  (0.0f, 1.0f,  0.0f);
  109.     D3DXMatrixLookAtLH(&matView, &eyeVec, &lookVec, &upVec);
  110.     g_pD3DDev->SetTransform(D3DTS_VIEW, &matView);
  111.     D3DXMATRIXA16 matProj;
  112.     D3DXMatrixIdentity(&matProj);
  113.     D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
  114.     g_pD3DDev->SetTransform(D3DTS_PROJECTION, &matProj);
  115.     return S_OK;
  116. }
  117. /*==========================================
  118. Function name: ChangeWorld
  119. Description: 设置
  120. ==========================================*/
  121. HRESULT SetUpLightAndMatrial()
  122. {
  123.     D3DMATERIAL9 d3dMat;
  124.     ZeroMemory(&d3dMat, sizeof(D3DMATERIAL9));
  125.     d3dMat.Ambient.a = d3dMat.Diffuse.a =1.0f; 
  126.     d3dMat.Ambient.r = d3dMat.Diffuse.r =0.0f; 
  127.     d3dMat.Ambient.g = d3dMat.Diffuse.g =1.0f; 
  128.     d3dMat.Ambient.b = d3dMat.Diffuse.b =1.0f;
  129.     g_pD3DDev->SetMaterial(&d3dMat);
  130.     return S_OK;
  131. }
  132. /*==========================================
  133. Function name: Cleanup
  134. Description: 释放对象
  135. ==========================================*/
  136. VOID Cleanup()
  137. {
  138.     if (g_pVerBuf != NULL)
  139.     {
  140.         g_pVerBuf->Release();
  141.     }
  142.     if (g_pD3DDev != NULL)
  143.     {
  144.         g_pD3DDev->Release();
  145.     }
  146.     if (g_pD3DObj != NULL)
  147.     {
  148.         g_pD3DObj->Release();
  149.     }
  150. }
  151. /*==========================================
  152. Function name: Render
  153. Description: 负责渲染
  154. ==========================================*/
  155. VOID Render()
  156. {
  157.     if (g_pD3DDev == NULL)
  158.     {
  159.         return ;
  160.     }
  161.     g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255),1.0f, 0);
  162.     if (SUCCEEDED(g_pD3DDev->BeginScene()))
  163.     {
  164.         //SetUpLightAndMatrial();//注意没使用
  165.         //ChangeWorld();
  166.         g_pD3DDev->SetStreamSource(0, g_pVerBuf, 0, sizeof(CUSTOMVERTEX));
  167.         g_pD3DDev->SetFVF(D3DFVF_CUSTOMVERTEX);
  168.         g_pD3DDev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
  169.         g_pD3DDev->EndScene();
  170.     }
  171.     g_pD3DDev->Present(NULL, NULL, NULL, NULL);
  172. }
  173. /*==========================================
  174. Function name: MsgProc
  175. Description: 负责消息循环
  176. ==========================================*/
  177. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  178. {
  179.     switch(msg)
  180.     {
  181.     case WM_DESTROY:
  182.         Cleanup();
  183.         PostQuitMessage(0);
  184.         return 0;
  185.     }
  186.     return DefWindowProc(hWnd, msg, wParam, lParam);
  187. }
  188. /*==========================================
  189. Function name: WinMain
  190. Description: 程序启动函数
  191. ==========================================*/
  192. INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
  193. {
  194.     WNDCLASSEX wc = {
  195.                    sizeof(WNDCLASSEX), 
  196.                    CS_CLASSDC, 
  197.                    MsgProc, 
  198.                    0L, 
  199.                    0L, 
  200.                    GetModuleHandle(NULL),
  201.                    NULL,
  202.                    NULL,
  203.                    NULL,
  204.                    NULL,
  205.                    g_AppName,
  206.                    NULL
  207.                    };
  208.     RegisterClassEx(&wc);
  209.     HWND hWnd = CreateWindow(
  210.                              g_AppName, 
  211.                              TEXT("D3D Tutorial 1"), 
  212.                              WS_OVERLAPPEDWINDOW, 
  213.                              100, 
  214.                              100, 
  215.                              300, 
  216.                              300,
  217.                              NULL, 
  218.                              NULL, 
  219.                              wc.hInstance, 
  220.                              NULL 
  221.                              );
  222.     if (hWnd == NULL)
  223.     {
  224.         return -1;
  225.     }
  226.     if(SUCCEEDED(InitD3D(hWnd)))
  227.     {
  228.         if(SUCCEEDED(InitVBuf()))
  229.         {
  230.             ShowWindow(hWnd, SW_SHOWDEFAULT);
  231.             UpdateWindow(hWnd);
  232.             MSG msg;
  233.             ZeroMemory(&msg, sizeof(msg));
  234.             while (msg.message != WM_QUIT)
  235.             {
  236.                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  237.                 {
  238.                     TranslateMessage(&msg);
  239.                     DispatchMessage(&msg);
  240.                 }
  241.                 else
  242.                 {
  243.                     Render();
  244.                 }
  245.             }
  246.         }
  247.     }
  248.     UnregisterClass(g_AppName, wc.hInstance);
  249.     return 0;
  250. }

 

上面即不进行坐标变换也不进行光照处理,结果屏幕右下角部分显示一个黑色的三角形

 

2 添加坐标变换:

  1. /*==========================================
  2. Function name: ChangeWorld
  3. Description: 坐标变换和设置摄像机
  4. ==========================================*/
  5. HRESULT ChangeWorld()
  6. {
  7.     D3DXMATRIXA16 matWorld;
  8.     D3DXMatrixIdentity(&matWorld);
  9.     g_pD3DDev->SetTransform(D3DTS_WORLD, &matWorld);
  10.     D3DXMATRIXA16 matView;
  11.     D3DXMatrixIdentity(&matView);
  12.     D3DXVECTOR3 eyeVec (0.0f, 0.0f, -4.0f);
  13.     D3DXVECTOR3 lookVec(0.0f, 0.0f,  0.0f);
  14.     D3DXVECTOR3 upVec  (0.0f, 1.0f,  0.0f);
  15.     D3DXMatrixLookAtLH(&matView, &eyeVec, &lookVec, &upVec);
  16.     g_pD3DDev->SetTransform(D3DTS_VIEW, &matView);
  17.     D3DXMATRIXA16 matProj;
  18.     D3DXMatrixIdentity(&matProj);
  19.     D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
  20.     g_pD3DDev->SetTransform(D3DTS_PROJECTION, &matProj);
  21.     return S_OK;
  22. }

 

结果三角形变小了,显然是经过了坐标变换,然后投影到屏幕上来。

 

3 添加材质:

  1. /*==========================================
  2. Function name: SetUpLightAndMatrial
  3. Description: 设置
  4. ==========================================*/
  5. HRESULT SetUpLightAndMatrial()
  6. {
  7.     D3DMATERIAL9 d3dMat;
  8.     ZeroMemory(&d3dMat, sizeof(D3DMATERIAL9));
  9.     d3dMat.Ambient.a = d3dMat.Diffuse.a =1.0f; 
  10.     d3dMat.Ambient.r = d3dMat.Diffuse.r =0.0f; 
  11.     d3dMat.Ambient.g = d3dMat.Diffuse.g =1.0f; 
  12.     d3dMat.Ambient.b = d3dMat.Diffuse.b =1.0f;
  13.     g_pD3DDev->SetMaterial(&d3dMat);
  14.     return S_OK;
  15. }

 

设置环境光颜色

  1. g_pD3DDev->SetRenderState(D3DRS_AMBIENT, 0x00202020);

现在我们的三角形有颜色

 

4 添加光照:

添加光照比较麻烦些,须在以下几点改改

(1)修改顶点格式:

  1. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL)//灵活顶点格式
  2. struct CUSTOMVERTEX 
  3. {
  4.     D3DXVECTOR3 position;
  5.     D3DXVECTOR3 normal;//添加法线
  6. };

 

(2)修改顶点数据:

  1.     vertices[0].position = D3DXVECTOR3(-1.0f,-1.0f, 0.0f);//四个点
  2.     vertices[0].normal   = D3DXVECTOR3(-1.0f,-1.0f, -2.0f); 
  3.     vertices[2].position = D3DXVECTOR3( 1.0f,-1.0f, 0.0f);
  4.     vertices[0].normal   = D3DXVECTOR3(-1.0f,-1.0f, -2.0f); 
  5.     vertices[1].position = D3DXVECTOR3( 1.0f, 1.0f, 0.0f);
  6.     vertices[0].normal   = D3DXVECTOR3(-1.0f,-1.0f, -2.0f); 

(3)添加灯光

  1.     D3DLIGHT9 d3dlight;
  2.     ZeroMemory(&d3dlight, sizeof(D3DLIGHT9));
  3.     d3dlight.Type = D3DLIGHT_DIRECTIONAL;//平行光
  4.     d3dlight.Direction = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
  5.     d3dlight.Diffuse.r = 1.0f;
  6.     d3dlight.Diffuse.g = 1.0f;
  7.     d3dlight.Diffuse.b = 0.0f;
  8.     d3dlight.Range     = 1000.0f;
  9.     g_pD3DDev->SetLight(0, &d3dlight);
  10.     g_pD3DDev->LightEnable(0, true);

 

现在三角形又是另外一种颜色

 

附整个代码:

  1. /******************************************************
  2. FileName: CTDUIMessage.h   - TDOnline/UISystem
  3. Author: lsm   Version:        Date: 08/10/28
  4. Description: Manage message,include accept/post message etc.
  5. History:
  6. <author>  <time>  <version>  <note>
  7. ******************************************************/
  8. /*-------------Head------------*/
  9. #include "assert.h"
  10. #include "d3dx9.h"
  11. #pragma warning(disable : 4996)
  12. #include "strsafe.h"
  13. #pragma warning(disable : 4996)
  14. LPDIRECT3D9                g_pD3DObj   = NULL; //D3D 对象
  15. LPDIRECT3DDEVICE9          g_pD3DDev   = NULL; //D3D 设备
  16. LPDIRECT3DVERTEXBUFFER9    g_pVerBuf   = NULL; //顶点缓冲区
  17. TCHAR g_AppName[] = TEXT("D3D");//类名
  18. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL)//灵活顶点格式
  19. struct CUSTOMVERTEX 
  20. {
  21.     D3DXVECTOR3 position;
  22.     D3DXVECTOR3 normal;//添加法线
  23. };
  24. /*---------------End------------*/
  25. /*==========================================
  26. Function name: InitD3D
  27. Description: 初始化D3D对象
  28. ==========================================*/
  29. HRESULT InitD3D(HWND hWnd)
  30. {
  31.     if((g_pD3DObj = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)//创建3D对象
  32.     {
  33.         assert(false);
  34.         return E_FAIL;
  35.     }
  36.     D3DDISPLAYMODE devMode;
  37.     if (FAILED(g_pD3DObj->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &devMode)))//获得显卡信息
  38.     {
  39.         assert(false);
  40.         return E_FAIL;
  41.     }
  42.     D3DPRESENT_PARAMETERS d3dpp;
  43.     ZeroMemory(&d3dpp, sizeof(d3dpp));
  44.     d3dpp.Windowed               = true;
  45.     d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
  46.     d3dpp.EnableAutoDepthStencil = true;
  47.     d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  48.     d3dpp.BackBufferFormat       = D3DFMT_UNKNOWN;
  49.     
  50.     if(FAILED(g_pD3DObj->CreateDevice(
  51.                                       D3DADAPTER_DEFAULT,
  52.                                       D3DDEVTYPE_HAL,
  53.                                       hWnd,
  54.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  55.                                       &d3dpp,
  56.                                       &g_pD3DDev
  57.                                       )))
  58.     {
  59.         assert(false);
  60.         return E_FAIL;
  61.     }
  62.     g_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  63.     g_pD3DDev->SetRenderState(D3DRS_ZENABLE, true);
  64.     g_pD3DDev->SetRenderState(D3DRS_LIGHTING, true);
  65.     //g_pD3DDev->SetRenderState(D3DRS_AMBIENT, 0x00202020);
  66.     return S_OK;
  67. }
  68. /*==========================================
  69. Function name: InitVBuf
  70. Description: 填充顶点缓冲区
  71. ==========================================*/
  72. HRESULT InitVBuf()
  73. {
  74.     if (FAILED(g_pD3DDev->CreateVertexBuffer(
  75.                                              3*sizeof(CUSTOMVERTEX),
  76.                                              0,
  77.                                              D3DFVF_CUSTOMVERTEX,
  78.                                              D3DPOOL_DEFAULT,
  79.                                              &g_pVerBuf,
  80.                                              NULL
  81.                                              )))
  82.     {
  83.         return E_FAIL;
  84.     }
  85.     CUSTOMVERTEX *vertices;
  86.     if (FAILED(g_pVerBuf->Lock(0, 0, (void**)&vertices, 0)))//锁住内存
  87.     {
  88.         return E_FAIL;
  89.     }
  90.     vertices[0].position = D3DXVECTOR3(-1.0f,-1.0f, 0.0f);//四个点
  91.     vertices[0].normal   = D3DXVECTOR3(-1.0f,-1.0f, -2.0f); 
  92.     vertices[2].position = D3DXVECTOR3( 1.0f,-1.0f, 0.0f);
  93.     vertices[0].normal   = D3DXVECTOR3(-1.0f,-1.0f, -2.0f); 
  94.     vertices[1].position = D3DXVECTOR3( 1.0f, 1.0f, 0.0f);
  95.     vertices[0].normal   = D3DXVECTOR3(-1.0f,-1.0f, -2.0f); 
  96.     g_pVerBuf->Unlock();
  97.     return S_OK;
  98. }
  99. /*==========================================
  100. Function name: ChangeWorld
  101. Description: 坐标变换和设置摄像机
  102. ==========================================*/
  103. HRESULT ChangeWorld()
  104. {
  105.     D3DXMATRIXA16 matWorld;
  106.     D3DXMatrixIdentity(&matWorld);
  107.     g_pD3DDev->SetTransform(D3DTS_WORLD, &matWorld);
  108.     D3DXMATRIXA16 matView;
  109.     D3DXMatrixIdentity(&matView);
  110.     D3DXVECTOR3 eyeVec (0.0f, 0.0f, -4.0f);
  111.     D3DXVECTOR3 lookVec(0.0f, 0.0f,  0.0f);
  112.     D3DXVECTOR3 upVec  (0.0f, 1.0f,  0.0f);
  113.     D3DXMatrixLookAtLH(&matView, &eyeVec, &lookVec, &upVec);
  114.     g_pD3DDev->SetTransform(D3DTS_VIEW, &matView);
  115.     D3DXMATRIXA16 matProj;
  116.     D3DXMatrixIdentity(&matProj);
  117.     D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
  118.     g_pD3DDev->SetTransform(D3DTS_PROJECTION, &matProj);
  119.     return S_OK;
  120. }
  121. /*==========================================
  122. Function name: SetUpLightAndMatrial
  123. Description: 设置
  124. ==========================================*/
  125. HRESULT SetUpLightAndMatrial()
  126. {
  127.     D3DMATERIAL9 d3dMat;
  128.     ZeroMemory(&d3dMat, sizeof(D3DMATERIAL9));
  129.     d3dMat.Ambient.a = d3dMat.Diffuse.a =1.0f; 
  130.     d3dMat.Ambient.r = d3dMat.Diffuse.r =0.0f; 
  131.     d3dMat.Ambient.g = d3dMat.Diffuse.g =1.0f; 
  132.     d3dMat.Ambient.b = d3dMat.Diffuse.b =1.0f;
  133.     g_pD3DDev->SetMaterial(&d3dMat);
  134.     D3DLIGHT9 d3dlight;
  135.     ZeroMemory(&d3dlight, sizeof(D3DLIGHT9));
  136.     d3dlight.Type = D3DLIGHT_DIRECTIONAL;//平行光
  137.     d3dlight.Direction = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
  138.     d3dlight.Diffuse.r = 1.0f;
  139.     d3dlight.Diffuse.g = 1.0f;
  140.     d3dlight.Diffuse.b = 0.0f;
  141.     d3dlight.Range     = 1000.0f;
  142.     g_pD3DDev->SetLight(0, &d3dlight);
  143.     g_pD3DDev->LightEnable(0, true);
  144.     return S_OK;
  145. }
  146. /*==========================================
  147. Function name: Cleanup
  148. Description: 释放对象
  149. ==========================================*/
  150. VOID Cleanup()
  151. {
  152.     if (g_pVerBuf != NULL)
  153.     {
  154.         g_pVerBuf->Release();
  155.     }
  156.     if (g_pD3DDev != NULL)
  157.     {
  158.         g_pD3DDev->Release();
  159.     }
  160.     if (g_pD3DObj != NULL)
  161.     {
  162.         g_pD3DObj->Release();
  163.     }
  164. }
  165. /*==========================================
  166. Function name: Render
  167. Description: 负责渲染
  168. ==========================================*/
  169. VOID Render()
  170. {
  171.     if (g_pD3DDev == NULL)
  172.     {
  173.         return ;
  174.     }
  175.     g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255),1.0f, 0);
  176.     if (SUCCEEDED(g_pD3DDev->BeginScene()))
  177.     {
  178.         SetUpLightAndMatrial();//注意没使用
  179.         ChangeWorld();
  180.         g_pD3DDev->SetStreamSource(0, g_pVerBuf, 0, sizeof(CUSTOMVERTEX));
  181.         g_pD3DDev->SetFVF(D3DFVF_CUSTOMVERTEX);
  182.         g_pD3DDev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
  183.         g_pD3DDev->EndScene();
  184.     }
  185.     g_pD3DDev->Present(NULL, NULL, NULL, NULL);
  186. }
  187. /*==========================================
  188. Function name: MsgProc
  189. Description: 负责消息循环
  190. ==========================================*/
  191. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  192. {
  193.     switch(msg)
  194.     {
  195.     case WM_DESTROY:
  196.         Cleanup();
  197.         PostQuitMessage(0);
  198.         return 0;
  199.     }
  200.     return DefWindowProc(hWnd, msg, wParam, lParam);
  201. }
  202. /*==========================================
  203. Function name: WinMain
  204. Description: 程序启动函数
  205. ==========================================*/
  206. INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
  207. {
  208.     WNDCLASSEX wc = {
  209.                    sizeof(WNDCLASSEX), 
  210.                    CS_CLASSDC, 
  211.                    MsgProc, 
  212.                    0L, 
  213.                    0L, 
  214.                    GetModuleHandle(NULL),
  215.                    NULL,
  216.                    NULL,
  217.                    NULL,
  218.                    NULL,
  219.                    g_AppName,
  220.                    NULL
  221.                    };
  222.     RegisterClassEx(&wc);
  223.     HWND hWnd = CreateWindow(
  224.                              g_AppName, 
  225.                              TEXT("D3D Tutorial 1"), 
  226.                              WS_OVERLAPPEDWINDOW, 
  227.                              100, 
  228.                              100, 
  229.                              300, 
  230.                              300,
  231.                              NULL, 
  232.                              NULL, 
  233.                              wc.hInstance, 
  234.                              NULL 
  235.                              );
  236.     if (hWnd == NULL)
  237.     {
  238.         return -1;
  239.     }
  240.     if(SUCCEEDED(InitD3D(hWnd)))
  241.     {
  242.         if(SUCCEEDED(InitVBuf()))
  243.         {
  244.             ShowWindow(hWnd, SW_SHOWDEFAULT);
  245.             UpdateWindow(hWnd);
  246.             MSG msg;
  247.             ZeroMemory(&msg, sizeof(msg));
  248.             while (msg.message != WM_QUIT)
  249.             {
  250.                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  251.                 {
  252.                     TranslateMessage(&msg);
  253.                     DispatchMessage(&msg);
  254.                 }
  255.                 else
  256.                 {
  257.                     Render();
  258.                 }
  259.             }
  260.         }
  261.     }
  262.     UnregisterClass(g_AppName, wc.hInstance);
  263.     return 0;
  264. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值