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

OpenGL

开发平台:

Visual C++

  1. #include <windows.h>
  2. // OpenGL extensions header
  3. #include "glew.h"
  4. #include "wglew.h"
  5. // Standard OpenGL header
  6. #include <GL/gl.h>
  7. #include "Gut.h"
  8. #include "render_data.h"
  9. static Matrix4x4 g_proj_matrix;
  10. static GLuint g_VertexProgramID = 0;
  11. static GLuint g_FragmentProgramID = 0;
  12. bool InitResourceOpenGL(void)
  13. {
  14. g_VertexProgramID = GutLoadVertexProgramOpenGL_ASM("../../shaders/vertex_color.glvp");
  15. if ( g_VertexProgramID==0 )
  16. return false;
  17. g_FragmentProgramID = GutLoadFragmentProgramOpenGL_ASM("../../shaders/vertex_color.glpp");
  18. if ( g_FragmentProgramID==0 )
  19. return false;
  20. // 投影矩阵
  21. g_proj_matrix = GutMatrixPerspectiveRH_OpenGL(90.0f, 1.0f, 0.1f, 100.0f);
  22. glEnable(GL_CULL_FACE);
  23. return true;
  24. }
  25. bool ReleaseResourceOpenGL(void)
  26. {
  27. if ( g_VertexProgramID )
  28. {
  29. GutReleaseVertexProgramOpenGL(g_VertexProgramID);
  30. g_VertexProgramID = 0;
  31. }
  32. if ( g_FragmentProgramID )
  33. {
  34. GutReleaseVertexProgramOpenGL(g_FragmentProgramID);
  35. g_FragmentProgramID = 0;
  36. }
  37. return true;
  38. }
  39. // callback function. 窗口大小改变时会被调用, 并传入新的窗口大小.
  40. void ResizeWindowOpenGL(int width, int height)
  41. {
  42. // 使用新的窗口大小做为新的绘图分辨率
  43. glViewport(0, 0, width, height);
  44. // 投影矩阵, 重设水平和垂直方向的视角.
  45. float aspect = (float) height / (float) width;
  46. g_proj_matrix = GutMatrixPerspectiveRH_OpenGL(60.0f, aspect, 0.1f, 100.0f);
  47. }
  48. // `使用OpenGL来绘图`
  49. void RenderFrameOpenGL(void)
  50. {
  51. // `清除画面`
  52. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  53. glEnable(GL_DEPTH_TEST);
  54. // `指定要使用Shader可程序化流程`
  55. glEnable(GL_VERTEX_PROGRAM_ARB);
  56. glEnable(GL_FRAGMENT_PROGRAM_ARB);
  57. // `设置使用哪个Vertex/Fragment Program`
  58. glBindProgramARB(GL_VERTEX_PROGRAM_ARB, g_VertexProgramID);
  59. glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, g_FragmentProgramID);
  60. // `设置要用数组的方式传入顶点位置和颜色`
  61. glEnableClientState(GL_VERTEX_ARRAY);
  62. glEnableClientState(GL_COLOR_ARRAY);
  63. // `计算转换矩阵`
  64. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  65. Matrix4x4 view_proj_matrix = view_matrix * g_proj_matrix;
  66. Matrix4x4 world_view_proj_matrix;
  67. // `太阳`
  68. world_view_proj_matrix = g_sun_matrix * view_proj_matrix;
  69. glProgramLocalParameters4fvEXT(GL_VERTEX_PROGRAM_ARB, 0, 4, (float *) &world_view_proj_matrix);
  70. glVertexPointer(3, GL_FLOAT, sizeof(Vertex_VC), g_pSunVertices);
  71. glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex_VC), g_pSunVertices[0].m_RGBA);
  72. glDrawElements(GL_TRIANGLES, g_iNumSphereIndices, GL_UNSIGNED_SHORT, g_pSphereIndices);
  73. // `地球`
  74. world_view_proj_matrix = g_earth_matrix * view_proj_matrix;
  75. glProgramLocalParameters4fvEXT(GL_VERTEX_PROGRAM_ARB, 0, 4, (float *) &world_view_proj_matrix);
  76. glVertexPointer(3, GL_FLOAT, sizeof(Vertex_VC), g_pEarthVertices);
  77. glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex_VC), g_pEarthVertices[0].m_RGBA);
  78. glDrawElements(GL_TRIANGLES, g_iNumSphereIndices, GL_UNSIGNED_SHORT, g_pSphereIndices);
  79. // `月球`
  80. world_view_proj_matrix = g_moon_matrix * view_proj_matrix;
  81. glProgramLocalParameters4fvEXT(GL_VERTEX_PROGRAM_ARB, 0, 4, (float *) &world_view_proj_matrix);
  82. glVertexPointer(3, GL_FLOAT, sizeof(Vertex_VC), g_pMoonVertices);
  83. glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex_VC), g_pMoonVertices[0].m_RGBA);
  84. glDrawElements(GL_TRIANGLES, g_iNumSphereIndices, GL_UNSIGNED_SHORT, g_pSphereIndices);
  85. // `显示出背景backbuffer`
  86. GutSwapBuffersOpenGL();
  87. }