render_dx9.cpp
Upload User: gzqinmao
Upload Date: 2022-07-13
Package Size: 472k
Code Size: 3k
Category:

OpenGL program

Development Platform:

Visual C++

  1. #include "Gut.h"
  2. #include "render_data.h"
  3. static LPDIRECT3DVERTEXSHADER9 g_pVertexShaderDX9 = NULL;
  4. static LPDIRECT3DPIXELSHADER9  g_pPixelShaderDX9 = NULL;
  5. static Matrix4x4 g_proj_matrix;
  6. bool InitResourceDX9(void)
  7. {
  8. // 获得Direct3D 9设备
  9. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  10. // 载入Vertex Shader
  11. g_pVertexShaderDX9 = GutLoadVertexShaderDX9_HLSL("../../shaders/vertex_color.shader", "VS", "vs_1_1");
  12. if ( g_pVertexShaderDX9==NULL )
  13. return false;
  14. // 载入Pixel Shader
  15. g_pPixelShaderDX9 = GutLoadPixelShaderDX9_HLSL("../../shaders/vertex_color.shader", "PS", "ps_2_0");
  16. if ( g_pPixelShaderDX9==NULL )
  17. return false;
  18. // 计算投影转换矩阵
  19. g_proj_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 0.1f, 100.0f);
  20. // 关闭光照
  21. device->SetRenderState(D3DRS_LIGHTING, FALSE);
  22. // 改变三角形正面的法线
  23. device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  24. return true;
  25. }
  26. bool ReleaseResourceDX9(void)
  27. {
  28. SAFE_RELEASE(g_pVertexShaderDX9);
  29. SAFE_RELEASE(g_pPixelShaderDX9);
  30. return true;
  31. }
  32. void ResizeWindowDX9(int width, int height)
  33. {
  34. // 获得Direct3D 9设备
  35. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  36. GutResetGraphicsDeviceDX9();
  37. // 投影矩阵, 重设水平和垂直方向的视角.
  38. float aspect = (float) height / (float) width;
  39. g_proj_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, aspect, 0.1f, 100.0f);
  40. // 关闭光照
  41. device->SetRenderState(D3DRS_LIGHTING, FALSE);
  42. // 改变三角形正面的法线
  43. device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  44. }
  45. // `使用Direct3D9来绘图`
  46. void RenderFrameDX9(void)
  47. {
  48. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  49. // `清除画面`
  50. device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
  51. // `开始下绘图指令`
  52. device->BeginScene(); 
  53. // `计算出一个可以转换到镜头坐标系的矩阵`
  54. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  55. Matrix4x4 view_proj_matrix = view_matrix * g_proj_matrix;
  56. Matrix4x4 world_view_proj_matrix;
  57. // `设置数据格式`
  58. // `D3DFVF_XYZ = 使用3个浮点数来记录位置`
  59. // `D3DFVF_DIFFUSE = 使用32bits整数类型来记录BGRA颜色`
  60. device->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE); 
  61. // `设置Shader`
  62. device->SetVertexShader(g_pVertexShaderDX9);
  63. device->SetPixelShader(g_pPixelShaderDX9);
  64. // `太阳`
  65. world_view_proj_matrix = g_sun_matrix * view_proj_matrix;
  66. device->SetVertexShaderConstantF(0, (const float *)&world_view_proj_matrix, 4);
  67. device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, g_iNumSphereVertices, g_iNumSphereTriangles, g_pSphereIndices, D3DFMT_INDEX16, g_pSunVertices, sizeof(Vertex_VC) );
  68. // `地球`
  69. world_view_proj_matrix = g_earth_matrix * view_proj_matrix;
  70. device->SetVertexShaderConstantF(0, (const float *)&world_view_proj_matrix, 4);
  71. device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, g_iNumSphereVertices, g_iNumSphereTriangles, g_pSphereIndices, D3DFMT_INDEX16, g_pEarthVertices, sizeof(Vertex_VC) );
  72. // `月亮`
  73. world_view_proj_matrix = g_moon_matrix * view_proj_matrix;
  74. device->SetVertexShaderConstantF(0, (const float *)&world_view_proj_matrix, 4);
  75. device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, g_iNumSphereVertices, g_iNumSphereTriangles, g_pSphereIndices, D3DFMT_INDEX16, g_pMoonVertices, sizeof(Vertex_VC) );
  76. // `声明所有的绘图指令都下完了`
  77. device->EndScene(); 
  78. // `把背景backbuffer的画面显示出来`
  79.     device->Present( NULL, NULL, NULL, NULL );
  80. }