You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.4 KiB

  1. #include "frustum.h"
  2. #include "misc.h"
  3. Frustum::Frustum()
  4. {
  5. }
  6. void Frustum::Init()
  7. {
  8. /*����program*/
  9. mProgram = CreateGPUProgram("res/shader/WhiteColor.vs", "res/shader/WhiteColor.fs");
  10. mPosLocation = glGetAttribLocation(mProgram, "pos");
  11. mMLocation = glGetUniformLocation(mProgram, "M");
  12. mVLocation = glGetUniformLocation(mProgram, "V");
  13. mPLocation = glGetUniformLocation(mProgram, "P");
  14. }
  15. void Frustum::InitPerspective(float fov, float aspect, float zNear, float zFar)
  16. {
  17. //������������
  18. float halfFOV = 22.5f;
  19. float randianHalfFOV = 3.14*halfFOV / 180.0f;
  20. float tanHalfFOV = sinf(randianHalfFOV) / cosf(randianHalfFOV);
  21. float yNear = tanHalfFOV * zNear;
  22. float xNear = yNear*aspect;
  23. //����Զ������
  24. float yFar = tanHalfFOV * zFar;
  25. float xFar = yFar*aspect;
  26. float vertexes[24] = {
  27. -xNear,-yNear,-zNear,
  28. xNear,-yNear,-zNear,
  29. xNear,yNear,-zNear,
  30. -xNear,yNear,-zNear,
  31. -xFar,-yFar,-zFar,
  32. xFar,-yFar,-zFar,
  33. xFar,yFar,-zFar,
  34. -xFar,yFar,-zFar,
  35. };
  36. mVBO = CreateBufferObject(GL_ARRAY_BUFFER, sizeof(float)*24, GL_STATIC_DRAW, vertexes);
  37. unsigned int indexes[] = {
  38. 0,1,1,2,2,3,3,0, //��������
  39. 4,5,5,6,6,7,7,4, //Զ������
  40. 0,4,3,7,2,6,1,5
  41. };
  42. mIBO = CreateBufferObject(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*24, GL_STATIC_DRAW, indexes);
  43. }
  44. void Frustum::InitOrtho(float left, float right, float bottom, float top, float zNear, float zFar)
  45. {
  46. float vertexes[24] = {
  47. left,bottom,-zNear,
  48. right,bottom,-zNear,
  49. right,top,-zNear,
  50. left,top,-zNear,
  51. left,bottom,-zFar,
  52. right,bottom,-zFar,
  53. right,top,-zFar,
  54. left,top,-zFar,
  55. };
  56. mVBO = CreateBufferObject(GL_ARRAY_BUFFER, sizeof(float) * 24, GL_STATIC_DRAW, vertexes);
  57. unsigned int indexes[] = {
  58. 0,1,1,2,2,3,3,0, //��������
  59. 4,5,5,6,6,7,7,4, //Զ������
  60. 0,4,3,7,2,6,1,5
  61. };
  62. mIBO = CreateBufferObject(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * 24, GL_STATIC_DRAW, indexes);
  63. }
  64. void Frustum::Draw(float* M, float* V, float* P)
  65. {
  66. glUseProgram(mProgram);
  67. glUniformMatrix4fv(mMLocation, 1, GL_FALSE, M);
  68. glUniformMatrix4fv(mVLocation, 1, GL_FALSE, V);
  69. glUniformMatrix4fv(mPLocation, 1, GL_FALSE, P);
  70. glBindBuffer(GL_ARRAY_BUFFER, mVBO);
  71. glEnableVertexAttribArray(mPosLocation);
  72. glVertexAttribPointer(mPosLocation, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);
  73. glBindBuffer(GL_ARRAY_BUFFER, 0);
  74. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIBO);
  75. glDrawElements(GL_LINES, 24, GL_UNSIGNED_INT, 0);
  76. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  77. glUseProgram(0);
  78. }