render_dx9.cpp
上传用户:gzqinmao
上传日期:2022-07-13
资源大小:472k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include "Gut.h"
  2. #include "render_data.h"
  3. bool InitResourceDX9(void)
  4. {
  5. // 获得Direct3D 9设备
  6. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  7. Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 0.1f, 100.0f);
  8. // 设置视角转换矩阵
  9. device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *) &projection_matrix);
  10. // 关闭光照
  11. device->SetRenderState(D3DRS_LIGHTING, FALSE);
  12. // 改变三角形正面的法线
  13. device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  14. int num_vertices = sizeof(g_pyramid_vertices)/sizeof(Vertex_VC);
  15. // 把RGBA的颜色数据转换成DX9 BGRA格式
  16. for ( int i=0; i<num_vertices; i++ )
  17. {
  18. unsigned char temp = g_pyramid_vertices[i].m_RGBA[0];
  19. g_pyramid_vertices[i].m_RGBA[0] = g_pyramid_vertices[i].m_RGBA[2];
  20. g_pyramid_vertices[i].m_RGBA[2] = temp;
  21. }
  22. num_vertices = sizeof(g_road_vertices)/sizeof(Vertex_VC);
  23. for ( int i=0; i<num_vertices; i++ )
  24. {
  25. unsigned char temp = g_road_vertices[i].m_RGBA[0];
  26. g_road_vertices[i].m_RGBA[0] = g_road_vertices[i].m_RGBA[2];
  27. g_road_vertices[i].m_RGBA[2] = temp;
  28. }
  29. return true;
  30. }
  31. bool ReleaseResourceDX9(void)
  32. {
  33. return true;
  34. }
  35. // 使用DirectX 9来绘图
  36. void RenderFrameDX9(void)
  37. {
  38. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  39. // `清除画面`
  40. device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
  41. // `开始下绘图指令`
  42. device->BeginScene(); 
  43. // `设置数据格式`
  44. // `D3DFVF_XYZ = 使用3个浮点数来记录位置`
  45. // `D3DFVF_DIFFUSE = 使用32bits整数类型来记录BGRA颜色`
  46. device->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE); 
  47. // `计算出一个可以转换到镜头坐标系的矩阵`
  48. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  49. device->SetTransform(D3DTS_VIEW, (D3DMATRIX *) &view_matrix);
  50. Vector4 border(-15.0f, 0.0f, -15.0f);
  51. Vector4 grid_position = border;
  52. const int grids_x = 30;
  53. const int grids_z = 30;
  54. for ( int x=0; x<grids_x; x++ )
  55. {
  56. int grid_x = x & 0x07;
  57. grid_position[2] = border[2];
  58. for ( int z=0; z<grids_z; z++ )
  59. {
  60. int grid_z = z & 0x07;
  61. char c = g_map[grid_x][grid_z];
  62. // `设置转换矩阵`
  63. Matrix4x4 object_matrix;
  64. object_matrix.Translate_Replace(grid_position);
  65. if ( c==0 ) // `马路`
  66. {
  67. device->SetTransform(D3DTS_WORLD, (D3DMATRIX *) &object_matrix);
  68. // `画出地板`
  69. device->DrawIndexedPrimitiveUP(
  70. D3DPT_TRIANGLESTRIP,
  71. 0,
  72. 4,
  73. 2,
  74. g_road_trianglestrip_indices,
  75. D3DFMT_INDEX16,
  76. g_road_vertices,
  77. sizeof(Vertex_VC)
  78. );
  79. }
  80. else // `金字塔`
  81. {
  82. // `设置金字塔的高度`
  83. object_matrix.Scale_Replace(1.0f, (float) c, 1.0f);
  84. object_matrix[3] = grid_position;
  85. device->SetTransform(D3DTS_WORLD, (D3DMATRIX *) &object_matrix);
  86. // `画出金字塔`
  87. device->DrawIndexedPrimitiveUP(
  88. D3DPT_TRIANGLEFAN, // `指定所要画的基本图形种类`
  89. 0, // `会使用的最小顶点编号, 事实上没太大用处.`
  90. 5, // `顶点数组里有几个顶点`
  91. 4, // `要画出几个基本图形`
  92. g_pyramid_trianglefan_indices, // `索引数组`
  93. D3DFMT_INDEX16, // `索引数组的类型`
  94. g_pyramid_vertices, // `顶点数组`
  95. sizeof(Vertex_VC) // `顶点数组里每个顶点的大小`
  96. );
  97. }
  98. grid_position[2] += 1.0f;
  99. }
  100. grid_position[0] += 1.0f;
  101. }
  102. // `声明所有的绘图指令都下完了`
  103. device->EndScene(); 
  104. // `把背景backbuffer的画面显示出来`
  105.     device->Present( NULL, NULL, NULL, NULL );
  106. }