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 LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL;
  4. static LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL;
  5. bool InitResourceDX9(void)
  6. {
  7. // `获得Direct3D9设备`
  8. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  9. // `设置视角转换矩阵`
  10. Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 0.1f, 100.0f);
  11. device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *) &projection_matrix);
  12. // `关闭光照`
  13. device->SetRenderState(D3DRS_LIGHTING, FALSE);
  14. // `改变三角形正面的法线`
  15. device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  16. for ( int i=0; i<g_iNumSphereVertices; i++ )
  17. {
  18. unsigned char temp = g_pSphereVertices[i].m_RGBA[0];
  19. g_pSphereVertices[i].m_RGBA[0] = g_pSphereVertices[i].m_RGBA[2];
  20. g_pSphereVertices[i].m_RGBA[2] = temp;
  21. }
  22. int vsize = g_iNumSphereVertices * sizeof(Vertex_VC);
  23. if ( D3D_OK!=device->CreateVertexBuffer(vsize, 0, 0, D3DPOOL_MANAGED, &g_pVertexBuffer, NULL) )
  24. {
  25. return false;
  26. }
  27. Vertex_VC *pVertexArray = NULL;
  28. // `获得Vertex Buffer的内存位置`
  29. g_pVertexBuffer->Lock(0, vsize, (void **)&pVertexArray, 0);
  30. memcpy(pVertexArray, g_pSphereVertices, vsize);
  31. g_pVertexBuffer->Unlock();
  32. int isize = g_iNumSphereIndices * sizeof(unsigned short);
  33. if ( D3D_OK!=device->CreateIndexBuffer(isize, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &g_pIndexBuffer, NULL) )
  34. {
  35. return false;
  36. }
  37. unsigned short *pIndexArray = NULL;
  38. // `获得Index Buffer的内存位置`
  39. g_pIndexBuffer->Lock(0, isize, (void **)&pIndexArray, 0);
  40. memcpy(pIndexArray, g_pSphereIndices, isize);
  41. g_pIndexBuffer->Unlock();
  42. return true;
  43. }
  44. bool ReleaseResourceDX9(void)
  45. {
  46. if ( g_pVertexBuffer )
  47. {
  48. g_pVertexBuffer->Release();
  49. g_pVertexBuffer = NULL;
  50. }
  51. if ( g_pIndexBuffer )
  52. {
  53. g_pIndexBuffer->Release();
  54. g_pIndexBuffer = NULL;
  55. }
  56. return true;
  57. }
  58. void ResizeWindowDX9(int width, int height)
  59. {
  60. // `获得Direct3D9设备`
  61. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  62. GutResetGraphicsDeviceDX9();
  63. // `设置视角转换矩阵`
  64. float aspect = (float) height / (float) width;
  65. Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, aspect, 0.1f, 100.0f);
  66. device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *) &projection_matrix);
  67. // `关闭光照`
  68. device->SetRenderState(D3DRS_LIGHTING, FALSE);
  69. // `改变三角形正面的法线`
  70. device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  71. }
  72. // `使用Direct3D9来绘图`
  73. void RenderFrameDX9(void)
  74. {
  75. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  76. device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
  77. // `开始下绘图指令`
  78. device->BeginScene(); 
  79. // `计算出一个可以转换到镜头坐标系的矩阵`
  80. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  81. device->SetTransform(D3DTS_VIEW, (D3DMATRIX *) &view_matrix);
  82. // `设置数据格式`
  83. // D3DFVF_XYZ = `使用3个浮点数来记录位置`
  84. // D3DFVF_DIFFUSE = `使用32bits整数类型来记录BGRA颜色`
  85. device->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE); 
  86. device->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(Vertex_VC));
  87. device->SetIndices(g_pIndexBuffer);
  88. // `画出球`
  89. device->DrawIndexedPrimitive(
  90. D3DPT_TRIANGLELIST, // `指定所要画的基本图形种类`
  91. 0, 
  92. 0, // `会使用的最小顶点编号, 事实上没太大用处.`
  93. g_iNumSphereVertices, // `顶点数组里有几个顶点`
  94. 0, 
  95. g_iNumSphereTriangles // `要画出几个基本图形`
  96. );
  97. // `声明所有的绘图指令都下完了`
  98. device->EndScene(); 
  99. // `把背景backbuffer的画面显示出来`
  100.     device->Present( NULL, NULL, NULL, NULL );
  101. }