Skybox.cpp 4.0 KB

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