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

3D图形编程

开发平台:

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 GLuint g_VertexProgramID = 0;
  10. static GLuint g_FragmentProgramID = 0;
  11. bool InitResourceOpenGL(void)
  12. {
  13. g_VertexProgramID = GutLoadVertexProgramOpenGL_ASM
  14. ("../../shaders/vertex_transform.glvp");
  15. if ( g_VertexProgramID==0 )
  16. return false;
  17. g_FragmentProgramID = GutLoadFragmentProgramOpenGL_ASM
  18. ("../../shaders/vertex_transform.glpp");
  19. if ( g_FragmentProgramID==0 )
  20. return false;
  21. // `镜头坐标系转换矩阵`
  22. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  23. // `投影转换矩阵`
  24. Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_OpenGL(90.0f, 1.0f, 1.0f, 100.0f);
  25. // `前两个矩阵相乘结果`
  26. Matrix4x4 view_projection_matrix = view_matrix * projection_matrix;
  27. // `设置视角转换矩阵`
  28. glProgramLocalParameters4fvEXT(GL_VERTEX_PROGRAM_ARB, 0, 4, (float *) &view_projection_matrix);
  29. return true;
  30. }
  31. bool ReleaseResourceOpenGL(void)
  32. {
  33. if ( g_VertexProgramID )
  34. {
  35. GutReleaseVertexProgramOpenGL(g_VertexProgramID);
  36. g_VertexProgramID = 0;
  37. }
  38. if ( g_FragmentProgramID )
  39. {
  40. GutReleaseVertexProgramOpenGL(g_FragmentProgramID);
  41. g_FragmentProgramID = 0;
  42. }
  43. return true;
  44. }
  45. // `使用OpenGL来绘图`
  46. void RenderFrameOpenGL(void)
  47. {
  48. // `清除画面`
  49. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  50. // `指定要使用Shader可程序化流程`
  51. glEnable(GL_VERTEX_PROGRAM_ARB);
  52. glEnable(GL_FRAGMENT_PROGRAM_ARB);
  53. // `设置使用哪个Vertex/Fragment Program`
  54. glBindProgramARB(GL_VERTEX_PROGRAM_ARB, g_VertexProgramID);
  55. glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, g_FragmentProgramID);
  56. // `画出金字塔的8条边线`
  57. glEnableClientState(GL_VERTEX_ARRAY);
  58. glVertexPointer(4, GL_FLOAT, sizeof(Vector4), g_vertices);
  59. glDrawArrays(GL_LINES, 0, 16);
  60. // `把背景backbuffer的画面显示出来`
  61. GutSwapBuffersOpenGL();
  62. }