易码技术论坛

 找回密码
 加入易码
搜索
查看: 1943|回复: 1

[教程] D3D9教程1的程序注释的翻译[原创]

[复制链接]
发表于 2008-6-23 22:27:04 | 显示全部楼层 |阅读模式
\Samples\C++\Direct3D\Tutorials\Tut03_Matrices

  1. //-----------------------------------------------------------------------------
  2. // File: Matrices.cpp
  3. //目的:介绍3D几何学中的4*4矩阵的使用
  4. //我们可以转换他,旋转他,伸缩他。。
  5. //在这个教程中,我们将介绍D3DX的使用
  6. //我们将学会D3DX最有用的矩阵使用
  7. //需要连接上 d3dx9.lib.
  8. // 微软公司(c) Microsoft Corporation.
  9. //翻译:Bill(c) [url=http://hi.baidu.com/probill/]http://hi.baidu.com/probill/[/url]
  10. //转载请注明出处 :-)
  11. //-----------------------------------------------------------------------------
  12. #include <Windows.h>
  13. #include <mmsystem.h>
  14. #include <d3dx9.h>
  15. #pragma warning( disable : 4996 ) // 禁用4996警告
  16. #include <strsafe.h>
  17. #pragma warning( default : 4996 )


  18. //-----------------------------------------------------------------------------
  19. // 全局变量
  20. //-----------------------------------------------------------------------------
  21. LPDIRECT3D9 g_pD3D = NULL; // 创建D3D设备
  22. LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 创建渲染
  23. LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 顶点缓冲

  24. // 自定义顶点类型
  25. struct CUSTOMVERTEX
  26. {
  27. FLOAT x, y, z; // 顶点的3D位置
  28. DWORD color; //顶点颜色
  29. };

  30. // 自定义定点
  31. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

  32. //-----------------------------------------------------------------------------
  33. // Name: InitD3D()
  34. // 目的:初始化 Direct3D
  35. //-----------------------------------------------------------------------------
  36. HRESULT InitD3D( HWND hWnd )
  37. {
  38. // 创建 D3D
  39. if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
  40. return E_FAIL;

  41. // 填充D3DDevice结构
  42. D3DPRESENT_PARAMETERS d3dpp;
  43. ZeroMemory( &d3dpp, sizeof(d3dpp) );
  44. d3dpp.Windowed = TRUE;
  45. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  46. d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

  47. // 创建D3DDevice
  48. if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  49. D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  50. &d3dpp, &g_pd3dDevice ) ) )
  51. {
  52. return E_FAIL;
  53. }

  54. // 不使用平面剔除,使我们可以看见背面
  55. g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

  56. // 不使用光照
  57. g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

  58. return S_OK;
  59. }


  60. //-----------------------------------------------------------------------------
  61. // Name: InitGeometry()
  62. // 目的: 初始化几何数据
  63. //-----------------------------------------------------------------------------
  64. HRESULT InitGeometry()
  65. {
  66. // 初始化顶点数据
  67. CUSTOMVERTEX g_Vertices[] =
  68. {
  69. { -1.0f,-1.0f, 0.0f, 0xffff0000, },
  70. { 1.0f,-1.0f, 0.0f, 0xff0000ff, },
  71. { 0.0f, 1.0f, 0.0f, 0xffffffff, },
  72. };

  73. // 创建顶点缓冲区
  74. if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
  75. 0, D3DFVF_CUSTOMVERTEX,
  76. D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
  77. {
  78. return E_FAIL;
  79. }

  80. //填入顶点数据
  81. VOID* pVertices;
  82. if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
  83. return E_FAIL;
  84. memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
  85. g_pVB->Unlock();

  86. return S_OK;
  87. }



  88. //-----------------------------------------------------------------------------
  89. // Name: Cleanup()
  90. // 目的:清理资源
  91. //-----------------------------------------------------------------------------
  92. VOID Cleanup()
  93. {
  94. if( g_pVB != NULL )
  95. g_pVB->Release();

  96. if( g_pd3dDevice != NULL )
  97. g_pd3dDevice->Release();

  98. if( g_pD3D != NULL )
  99. g_pD3D->Release();
  100. }


  101. //-----------------------------------------------------------------------------
  102. // Name: SetupMatrices()
  103. // 目的:设置世界、视角、投影矩阵
  104. //-----------------------------------------------------------------------------
  105. VOID SetupMatrices()
  106. {
  107. // 我们的物体绕Y轴旋转
  108. D3DXMATRIXA16 matWorld;

  109. //设置旋转矩阵去产生360度的旋转

  110. UINT iTime = timeGetTime() % 1000;
  111. FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
  112. D3DXMatrixRotationY( &matWorld, fAngle );
  113. g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

  114. // 设置观察矩阵
  115. // 一个视点、一个目标点、一个上坐标(确定Y轴用的)
  116. D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
  117. D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
  118. D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
  119. D3DXMATRIXA16 matView;
  120. D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
  121. g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

  122. // 设置投影矩阵,把3D投影到2D

  123. D3DXMATRIXA16 matProj;
  124. D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
  125. g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
  126. }

  127. //-----------------------------------------------------------------------------
  128. // Name: Render()
  129. // 目的:渲染场景
  130. //-----------------------------------------------------------------------------
  131. VOID Render()
  132. {
  133. // 清空缓冲
  134. g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

  135. // Begin the scene
  136. if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
  137. {
  138. // Setup the world, view, and projection matrices
  139. SetupMatrices();

  140. // Render the vertex buffer contents
  141. g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
  142. g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  143. g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );

  144. // End the scene
  145. g_pd3dDevice->EndScene();
  146. }

  147. // Present the backbuffer contents to the display
  148. g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  149. }

  150. //-----------------------------------------------------------------------------
  151. // Name: MsgProc()
  152. // Desc: window' 消息处理
  153. //-----------------------------------------------------------------------------
  154. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  155. {
  156. switch( msg )
  157. {
  158. case WM_DESTROY:
  159. Cleanup();
  160. PostQuitMessage( 0 );
  161. return 0;
  162. }

  163. return DefWindowProc( hWnd, msg, wParam, lParam );
  164. }




  165. //-----------------------------------------------------------------------------
  166. // Name: WinMain()
  167. // Desc: 程序入口
  168. //-----------------------------------------------------------------------------
  169. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
  170. {
  171. // 注册窗口
  172. WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  173. GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  174. "D3D Tutorial", NULL };
  175. RegisterClassEx( &wc );

  176. // 创建窗口
  177. HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 03: Matrices",
  178. WS_OVERLAPPEDWINDOW, 100, 100, 256, 256,
  179. NULL, NULL, wc.hInstance, NULL );

  180. // Initialize Direct3D
  181. if( SUCCEEDED( InitD3D( hWnd ) ) )
  182. {
  183. // 初始化几何数据
  184. if( SUCCEEDED( InitGeometry() ) )
  185. {
  186. // Show the window
  187. ShowWindow( hWnd, SW_SHOWDEFAULT );
  188. UpdateWindow( hWnd );

  189. // Enter the message loop
  190. MSG msg;
  191. ZeroMemory( &msg, sizeof(msg) );
  192. while( msg.message!=WM_QUIT )
  193. {
  194. if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  195. {
  196. TranslateMessage( &msg );
  197. DispatchMessage( &msg );
  198. }
  199. else
  200. Render();
  201. }
  202. }
  203. }

  204. UnregisterClass( "D3D 教程", wc.hInstance );
  205. return 0;
  206. }
复制代码
发表于 2008-6-26 09:42:37 | 显示全部楼层
讲解原理比翻译注释更有意义
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-28 23:50 , Processed in 0.009895 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表