Skybox.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "cmath"
  2. #include <GL/freeglut.h>
  3. #include "stb_image.h"
  4. #include "Skybox.h"
  5. #include <string>
  6. enum{SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
  7. GLuint skybox[6];
  8. Skybox::Skybox(const float &size)
  9. {
  10. this->size = size;
  11. }
  12. Skybox::~Skybox()
  13. {
  14. glDeleteTextures(6, &skybox[0]);
  15. }
  16. void Skybox::init()
  17. {
  18. skybox[SKY_LEFT] = loadTexture("skyboxes/water/left.png");
  19. skybox[SKY_BACK] = loadTexture("skyboxes/water/back.png");
  20. skybox[SKY_RIGHT] = loadTexture("skyboxes/water/right.png");
  21. skybox[SKY_FRONT] = loadTexture("skyboxes/water/front.png");
  22. skybox[SKY_TOP] = loadTexture("skyboxes/water/top.png");
  23. skybox[SKY_BOTTOM] = loadTexture("skyboxes/water/bottom.png");
  24. }
  25. void Skybox::draw()
  26. {
  27. bool b1 = glIsEnabled(GL_TEXTURE_2D);
  28. glDisable(GL_LIGHTING);
  29. glDisable(GL_DEPTH_TEST);
  30. glEnable(GL_TEXTURE_2D);
  31. glDisable(GL_COLOR_MATERIAL);
  32. glBindTexture(GL_TEXTURE_2D, skybox[SKY_BACK]);
  33. glBegin(GL_QUADS);
  34. glTexCoord2f(1,1);
  35. glVertex3f(size / 2, size / 2, size / 2);
  36. glTexCoord2f(0,1);
  37. glVertex3f(-size / 2, size / 2, size / 2);
  38. glTexCoord2f(0,0);
  39. glVertex3f(-size / 2, -size / 2, size / 2);
  40. glTexCoord2f(1,0);
  41. glVertex3f(size / 2, -size / 2, size / 2);
  42. glEnd();
  43. glBindTexture(GL_TEXTURE_2D, skybox[SKY_LEFT]);
  44. glBegin(GL_QUADS);
  45. //left face
  46. glTexCoord2f(1,1);
  47. glVertex3f(-size / 2, size / 2, size / 2);
  48. glTexCoord2f(0,1);
  49. glVertex3f(-size / 2, size / 2, -size / 2);
  50. glTexCoord2f(0,0);
  51. glVertex3f(-size / 2, -size / 2, -size / 2);
  52. glTexCoord2f(1,0);
  53. glVertex3f(-size / 2, -size / 2, size / 2);
  54. glEnd();
  55. glBindTexture(GL_TEXTURE_2D, skybox[SKY_FRONT]);
  56. glBegin(GL_QUADS);
  57. //front face
  58. glTexCoord2f(0, 1);
  59. glVertex3f(size / 2, size / 2, -size / 2);
  60. glTexCoord2f(1, 1);
  61. glVertex3f(-size / 2, size / 2, -size / 2);
  62. glTexCoord2f(1, 0);
  63. glVertex3f(-size / 2, -size / 2, -size / 2);
  64. glTexCoord2f(0, 0);
  65. glVertex3f(size / 2, -size / 2, -size / 2);
  66. glEnd();
  67. glBindTexture(GL_TEXTURE_2D, skybox[SKY_RIGHT]);
  68. glBegin(GL_QUADS);
  69. //right face
  70. glTexCoord2f(1, 1);
  71. glVertex3f(size / 2, size / 2, -size / 2);
  72. glTexCoord2f(0,1);
  73. glVertex3f(size / 2, size / 2, size / 2);
  74. glTexCoord2f(0,0);
  75. glVertex3f(size / 2, -size / 2, size / 2);
  76. glTexCoord2f(1, 0);
  77. glVertex3f(size / 2, -size / 2, -size / 2);
  78. glEnd();
  79. glBindTexture(GL_TEXTURE_2D, skybox[SKY_TOP]);
  80. glBegin(GL_QUADS); //top face
  81. glTexCoord2f(0,0);
  82. glVertex3f(size / 2, size / 2, size / 2);
  83. glTexCoord2f(0,1);
  84. glVertex3f(-size / 2, size / 2, size / 2);
  85. glTexCoord2f(1,1);
  86. glVertex3f(-size / 2, size / 2, -size / 2);
  87. glTexCoord2f(1,0);
  88. glVertex3f(size / 2, size / 2, -size / 2);
  89. glEnd();
  90. glBindTexture(GL_TEXTURE_2D, skybox[SKY_BOTTOM]);
  91. glBegin(GL_QUADS);
  92. //bottom face
  93. glTexCoord2f(0,1);
  94. glVertex3f(size / 2, -size / 2, size / 2);
  95. glTexCoord2f(0,0);
  96. glVertex3f(-size / 2, -size / 2, size / 2);
  97. glTexCoord2f(1,0);
  98. glVertex3f(-size / 2, -size / 2, -size / 2);
  99. glTexCoord2f(1,1);
  100. glVertex3f(size / 2, -size / 2, -size / 2);
  101. glEnd();
  102. glEnable(GL_LIGHTING); //turn everything back, which we turned on, and turn everything off, which we have turned on.
  103. glEnable(GL_DEPTH_TEST);
  104. if (!b1)
  105. glDisable(GL_TEXTURE_2D);
  106. }
  107. GLuint Skybox::loadTexture(const std::string & fileName) //load the filename named texture
  108. {
  109. int width, height, bpp;
  110. unsigned char* imgData = stbi_load(fileName.c_str(), &width, &height, &bpp, 4);
  111. GLuint num;
  112. glGenTextures(1, &num);
  113. glBindTexture(GL_TEXTURE_2D, num);
  114. glTexImage2D(GL_TEXTURE_2D,
  115. 0, //level
  116. GL_RGBA, //internal format
  117. width, //width
  118. height, //height
  119. 0, //border
  120. GL_RGBA, //data format
  121. GL_UNSIGNED_BYTE, //data type
  122. imgData); //data
  123. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  124. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  125. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  126. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  127. stbi_image_free(imgData);
  128. return num;
  129. }