Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.17 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #define GL3_PROTOTYPES 1
  4. #include <glew.h>
  5. #include <SDL.h>
  6.  
  7. #include <glm.hpp>
  8. #include <gtc/matrix_transform.hpp>
  9. #include <gtc/type_ptr.hpp>
  10.  
  11. #define WIDTH 800
  12. #define HEIGHT 600
  13.  
  14. //------------------------------------------------------------------------------------------------------------------------------
  15. //Globalne zmienne
  16.  
  17. // kod zrodlowy shadera wierzcholkow
  18. const GLchar* vertexSource =
  19. "#version 150 core\n"
  20. "in vec3 position;"
  21. "in vec3 color;"
  22. "in vec2 texcoord;"
  23. "out vec3 Color;"
  24. "out vec2 Texcoord;"
  25. "uniform mat4 transformMatrix;"
  26. "void main()"
  27. "{"
  28. " gl_Position = transformMatrix * vec4(position, 1.0);"
  29. " Color = color;"
  30. " Texcoord = texcoord;"
  31. "}";
  32.  
  33. // kod zrodlowy shadera fragmentow
  34. const GLchar* fragmentSource =
  35. "#version 150 core\n"
  36. "in vec3 Color;"
  37. "in vec2 Texcoord;"
  38. "out vec4 outColor;"
  39. "uniform sampler2D tex;"
  40. "void main()"
  41. "{"
  42. " outColor = texture(tex, Texcoord) * vec4(Color, 1.0);"
  43. "}";
  44.  
  45.  
  46. //------------------------------------------------------------------------------------------------------------------------------
  47.  
  48. GLint posAttrib, colAttrib, texAttrib; //wskazniki atrybutow wierzcholkow
  49. GLuint vertexShader, fragmentShader, shaderProgram; //shadery
  50.  
  51.  
  52. GLuint vao[5], vbo[14], ebo, tex; // identyfikatory poszczegolnych obiektow (obiekty tablic wierzcholkow, buforow wierzcholkow, elementow, tekstury)
  53.  
  54. //------------------------------------------------------------------------------------------------------------------------------
  55.  
  56. GLfloat ver_floor[] = { //wspolrzedne wierzcholkow podlogi
  57. -5.0f, 0.0f, -5.0f,
  58. 5.0f, 0.0f, -5.0f,
  59. 5.0f, 0.0f, 5.0f,
  60. -5.0f, 0.0f, 5.0f,
  61. };
  62.  
  63. GLfloat col_floor[] = { //kolory wierzcholkow podlogi
  64. 0.0f, 0.0f, 0.0f,
  65. 0.0f, 0.0f, 0.0f,
  66. 0.0f, 0.0f, 0.0f,
  67. 0.0f, 0.0f, 0.0f,
  68. };
  69. ////////////////////1
  70. GLfloat ver_wall1[] = { //wspolrzedne wierzcholkow sciany
  71. -1.0f, 0.0f, 3.0f,
  72. -1.0f, 3.0f, 3.0f,
  73. 1.0f, 3.0f, 3.0f,
  74. 1.0f, 0.0f, 3.0f,
  75. };
  76.  
  77. GLfloat col_wall1[] = { //kolory wierzcholkow sciany
  78. 1.0f, 1.0f, 1.0f,
  79. 1.0f, 1.0f, 1.0f,
  80. 1.0f, 1.0f, 1.0f,
  81. 1.0f, 1.0f, 1.0f,
  82. };
  83.  
  84. GLfloat tex_wall1[] = { //wspolrzedne tekstury dla sciany,
  85. //jesli wykraczaja poza przedzial <0,1> nastapi nakladanie zalezne od parametrow ustawionych za pomoca funkcji glTexParameteri, np. GL_REPEAT
  86. 0.0f, 0.0f, // lewy dolny rog tekstury
  87. 5.0f, 0.0f,
  88. 5.0f, 5.0f,
  89. 0.0f, 5.0f, // prawy gorny rog tekstury
  90. };
  91. /////////////////////2
  92. GLfloat ver_wall2[] = { //wspolrzedne wierzcholkow sciany
  93. -1.0f, 0.0f, -3.0f,
  94. -1.0f, 3.0f, -3.0f,
  95. 1.0f, 3.0f, -3.0f,
  96. 1.0f, 0.0f, -3.0f,
  97. };
  98.  
  99. GLfloat col_wall2[] = { //kolory wierzcholkow sciany
  100. 1.0f, 1.0f, 1.0f,
  101. 1.0f, 1.0f, 1.0f,
  102. 1.0f, 1.0f, 1.0f,
  103. 1.0f, 1.0f, 1.0f,
  104. };
  105.  
  106. GLfloat tex_wall2[] = { //wspolrzedne tekstury dla sciany,
  107. //jesli wykraczaja poza przedzial <0,1> nastapi nakladanie zalezne od parametrow ustawionych za pomoca funkcji glTexParameteri, np. GL_REPEAT
  108. 0.0f, 0.0f, // lewy dolny rog tekstury
  109. 0.5f, 0.5f,
  110. 1.0f, 1.0f,
  111. 0.5f, 1.0f, // prawy gorny rog tekstury
  112. };
  113. ///////////3
  114. GLfloat ver_wall3[] = { //wspolrzedne wierzcholkow sciany
  115. -1.0f, 0.0f, 3.0f,
  116. -1.0f, 0.0f, -3.0f,
  117. -1.0f, 3.0f, -3.0f,
  118. -1.0f, 3.0f, 3.0f,
  119. };
  120.  
  121. GLfloat col_wall3[] = { //kolory wierzcholkow sciany
  122. 1.0f, 1.0f, 1.0f,
  123. 1.0f, 1.0f, 1.0f,
  124. 1.0f, 1.0f, 1.0f,
  125. 1.0f, 1.0f, 1.0f,
  126. };
  127.  
  128. GLfloat tex_wall3[] = { //wspolrzedne tekstury dla sciany,
  129. //jesli wykraczaja poza przedzial <0,1> nastapi nakladanie zalezne od parametrow ustawionych za pomoca funkcji glTexParameteri, np. GL_REPEAT
  130. 0.0f, 0.0f, // lewy dolny rog tekstury
  131. 2.0f, 2.0f,
  132. 3.0f, 3.0f,
  133. 0.0f, 3.0f, // prawy gorny rog tekstury
  134.  
  135.  
  136. };
  137. ////////////////////4
  138. GLfloat ver_wall4[] = { //wspolrzedne wierzcholkow sciany
  139. 1.0f, 0.0f, 3.0f,
  140. 1.0f, 0.0f, -3.0f,
  141. 1.0f, 3.0f, -3.0f,
  142. 1.0f, 3.0f, 3.0f,
  143. };
  144.  
  145. GLfloat col_wall4[] = { //kolory wierzcholkow sciany
  146. 1.0f, 1.0f, 1.0f,
  147. 1.0f, 1.0f, 1.0f,
  148. 1.0f, 1.0f, 1.0f,
  149. 1.0f, 1.0f, 1.0f,
  150. };
  151.  
  152. GLfloat tex_wall4[] = { //wspolrzedne tekstury dla sciany,
  153. //jesli wykraczaja poza przedzial <0,1> nastapi nakladanie zalezne od parametrow ustawionych za pomoca funkcji glTexParameteri, np. GL_REPEAT
  154. 0.0f, 0.0f, // lewy dolny rog tekstury
  155. 1.0f, 0.0f,
  156. 1.0f, 1.0f,
  157. 0.0f, 1.0f, // prawy gorny rog tekstury
  158.  
  159. };
  160.  
  161.  
  162. GLuint elements[] = { // pogrupowanie wierzcholkow w trojkaty, wykorzystane zarowno dla sciany jaki dla podlogi
  163. 0,1,2,
  164. 2,3,0,
  165. };
  166.  
  167. float pixels[] = { //tekstura o wymiarach 4x4; dla kazdego punktu okreslone skladowe RGB koloru
  168. 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
  169. 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
  170. 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
  171. 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
  172.  
  173. };
  174.  
  175.  
  176. //------------------------------------------------------------------------------------------------------------------------------
  177.  
  178. void init_shaders()
  179. {
  180. // tworzenie i kompilacja shadera wierzcholkow
  181. vertexShader = glCreateShader(GL_VERTEX_SHADER);
  182. glShaderSource(vertexShader, 1, &vertexSource, NULL);
  183. glCompileShader(vertexShader);
  184.  
  185. // tworzenie i kompilacja shadera fragmentow
  186. fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  187. glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
  188. glCompileShader(fragmentShader);
  189.  
  190. // dolaczenie programow przetwarzajacych wierzcholki i fragmenty do programu cieniujacego
  191. shaderProgram = glCreateProgram();
  192. glAttachShader(shaderProgram, vertexShader);
  193. glAttachShader(shaderProgram, fragmentShader);
  194. glBindFragDataLocation(shaderProgram, 0, "outColor");
  195. glLinkProgram(shaderProgram);
  196. glUseProgram(shaderProgram);
  197.  
  198. // wskazniki atrybutow wierzcholkow
  199. posAttrib = glGetAttribLocation(shaderProgram, "position");
  200. glEnableVertexAttribArray(posAttrib);
  201. colAttrib = glGetAttribLocation(shaderProgram, "color");
  202. glEnableVertexAttribArray(colAttrib);
  203. texAttrib = glGetAttribLocation(shaderProgram, "texcoord");
  204. glEnableVertexAttribArray(texAttrib);
  205.  
  206. }
  207.  
  208. //------------------------------------------------------------------------------------------------------------------------------
  209.  
  210. void create_objects()
  211. {
  212. // generowanie obiektow
  213. glGenVertexArrays(5, vao); // obiekt tablicy wierzcholkow, dla kazdego obiektu (sciana, podloga) mamy jedna tablice
  214. glGenBuffers(14, vbo); // obiekty buforow wierzcholkow, dla kazdego typu atrubutow kazdego obiektu mamy jeden bufor (np. bufor dla kolorow sciany, bufor dla wspolrzednych podlogi itd.)
  215. glGenBuffers(1, &ebo); // obiekt bufora elementow (ten sam bufor wukorzystany dla sciany i podlogi)
  216. glGenTextures(1, &tex); // obiekt tekstury
  217.  
  218. // sciana1 vao[0]
  219.  
  220. glBindVertexArray(vao[0]);
  221.  
  222. glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); // bufor wspolrzednych wierzcholkow sciany
  223. glBufferData(GL_ARRAY_BUFFER, sizeof(ver_wall1), ver_wall1, GL_STATIC_DRAW);
  224. glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  225. glEnableVertexAttribArray(posAttrib);
  226.  
  227. glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); // bufor kolorow wierzcholkow sciany
  228. glBufferData(GL_ARRAY_BUFFER, sizeof(col_wall1), col_wall1, GL_STATIC_DRAW);
  229. glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  230. glEnableVertexAttribArray(colAttrib);
  231.  
  232. glBindBuffer(GL_ARRAY_BUFFER, vbo[2]); // bufor wspolrzednych tekstury sciany
  233. glBufferData(GL_ARRAY_BUFFER, sizeof(tex_wall1), tex_wall1, GL_STATIC_DRAW);
  234. glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
  235. glEnableVertexAttribArray(texAttrib);
  236.  
  237. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  238. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
  239.  
  240. //sciana2 vao[2]
  241. glBindVertexArray(vao[1]);
  242.  
  243. glBindBuffer(GL_ARRAY_BUFFER, vbo[3]); // bufor wspolrzednych wierzcholkow sciany
  244. glBufferData(GL_ARRAY_BUFFER, sizeof(ver_wall2), ver_wall2, GL_STATIC_DRAW);
  245. glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  246. glEnableVertexAttribArray(posAttrib);
  247.  
  248. glBindBuffer(GL_ARRAY_BUFFER, vbo[4]); // bufor kolorow wierzcholkow sciany
  249. glBufferData(GL_ARRAY_BUFFER, sizeof(col_wall2), col_wall2, GL_STATIC_DRAW);
  250. glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  251. glEnableVertexAttribArray(colAttrib);
  252.  
  253. glBindBuffer(GL_ARRAY_BUFFER, vbo[5]); // bufor wspolrzednych tekstury sciany
  254. glBufferData(GL_ARRAY_BUFFER, sizeof(tex_wall2), tex_wall2, GL_STATIC_DRAW);
  255. glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
  256. glEnableVertexAttribArray(texAttrib);
  257.  
  258. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  259. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
  260.  
  261.  
  262. //sciana2 vao[2]
  263. glBindVertexArray(vao[2]);
  264.  
  265. glBindBuffer(GL_ARRAY_BUFFER, vbo[6]); // bufor wspolrzednych wierzcholkow sciany
  266. glBufferData(GL_ARRAY_BUFFER, sizeof(ver_wall3), ver_wall3, GL_STATIC_DRAW);
  267. glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  268. glEnableVertexAttribArray(posAttrib);
  269.  
  270. glBindBuffer(GL_ARRAY_BUFFER, vbo[7]); // bufor kolorow wierzcholkow sciany
  271. glBufferData(GL_ARRAY_BUFFER, sizeof(col_wall3), col_wall3, GL_STATIC_DRAW);
  272. glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  273. glEnableVertexAttribArray(colAttrib);
  274.  
  275. glBindBuffer(GL_ARRAY_BUFFER, vbo[8]); // bufor wspolrzednych tekstury sciany
  276. glBufferData(GL_ARRAY_BUFFER, sizeof(tex_wall3), tex_wall3, GL_STATIC_DRAW);
  277. glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
  278. glEnableVertexAttribArray(texAttrib);
  279.  
  280. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  281. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);// podloga vao[1]
  282.  
  283.  
  284. //sciana2 vao[2]
  285. glBindVertexArray(vao[3]);
  286.  
  287. glBindBuffer(GL_ARRAY_BUFFER, vbo[9]); // bufor wspolrzednych wierzcholkow sciany
  288. glBufferData(GL_ARRAY_BUFFER, sizeof(ver_wall4), ver_wall4, GL_STATIC_DRAW);
  289. glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  290. glEnableVertexAttribArray(posAttrib);
  291.  
  292. glBindBuffer(GL_ARRAY_BUFFER, vbo[10]); // bufor kolorow wierzcholkow sciany
  293. glBufferData(GL_ARRAY_BUFFER, sizeof(col_wall4), col_wall4, GL_STATIC_DRAW);
  294. glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  295. glEnableVertexAttribArray(colAttrib);
  296.  
  297. glBindBuffer(GL_ARRAY_BUFFER, vbo[11]); // bufor wspolrzednych tekstury sciany
  298. glBufferData(GL_ARRAY_BUFFER, sizeof(tex_wall4), tex_wall4, GL_STATIC_DRAW);
  299. glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
  300. glEnableVertexAttribArray(texAttrib);
  301.  
  302. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  303. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);// podloga vao[1]
  304.  
  305. // podloga vao[1]
  306.  
  307. glBindVertexArray(vao[4]);
  308.  
  309. glBindBuffer(GL_ARRAY_BUFFER, vbo[12]); // bufor wspolrzednych wierzcholkow podlogi
  310. glBufferData(GL_ARRAY_BUFFER, sizeof(ver_floor), ver_floor, GL_STATIC_DRAW);
  311. glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  312. glEnableVertexAttribArray(posAttrib);
  313.  
  314. glBindBuffer(GL_ARRAY_BUFFER, vbo[13]); // bufor kolorow podlogi
  315. glBufferData(GL_ARRAY_BUFFER, sizeof(col_floor), col_floor, GL_STATIC_DRAW);
  316. glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
  317. glEnableVertexAttribArray(colAttrib);
  318.  
  319. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  320. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
  321.  
  322.  
  323. }
  324.  
  325. //------------------------------------------------------------------------------------------------------------------------------
  326.  
  327. void configure_texture()
  328. {
  329. glBindTexture(GL_TEXTURE_2D, tex); // powiazanie tekstury z obiektem (wybor tekstury)
  330.  
  331. // ustawienia parametrow tekstury
  332. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // sposob nakladania tekstury
  333. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  334.  
  335. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // sposob filtrowania tekstury
  336. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  337.  
  338. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, GL_RGB, GL_FLOAT, pixels); // ladowanie do tekstury tablicy pikseli
  339. }
  340.  
  341. //------------------------------------------------------------------------------------------------------------------------------
  342.  
  343. int main(int argc, char ** argv)
  344. {
  345. SDL_Init(SDL_INIT_VIDEO);
  346. SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
  347. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  348. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
  349. SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
  350. SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
  351. SDL_Window* window = SDL_CreateWindow("OpenGL", 100, 100, 800, 600, SDL_WINDOW_OPENGL);
  352. SDL_GLContext context = SDL_GL_CreateContext(window);
  353. SDL_Event windowEvent;
  354.  
  355. glewExperimental = GL_TRUE;
  356. GLenum err = glewInit();
  357. if (GLEW_OK != err)
  358. {
  359. std::cout << "ERROR" << std::endl;
  360. }
  361.  
  362. glEnable(GL_DEPTH_TEST);
  363. glDepthFunc(GL_LEQUAL); // GL_ALWAYS)
  364.  
  365.  
  366. init_shaders();
  367.  
  368. create_objects();
  369.  
  370. configure_texture();
  371.  
  372.  
  373. glm::mat4 viewMatrix = glm::lookAt(glm::vec3(0.0f, 5.0f, 10.0f), glm::vec3(0.0f, 1.0f, -5.0f), glm::vec3(0.0f, 1.0f, 0.0f)); //macierz widoku
  374. glm::mat4 projectionMatrix = glm::perspective(glm::radians(45.0f), 1.0f, 1.0f, 20.0f); //macierz rzutowania perspektywicznego
  375. glm::mat4 translationMatrix;
  376. glm::mat4 rotationMatrix;
  377. glm::mat4 transformMatrix;
  378.  
  379. GLint transformMatrixUniformLocation = glGetUniformLocation(shaderProgram, "transformMatrix");
  380.  
  381. GLfloat angle = 0;
  382.  
  383. while (true)
  384. {
  385. if (SDL_PollEvent(&windowEvent))
  386. {
  387. if (windowEvent.type == SDL_KEYUP &&
  388. windowEvent.key.keysym.sym == SDLK_ESCAPE) break;
  389. if (windowEvent.type == SDL_QUIT) break;
  390.  
  391. }
  392.  
  393. glClearColor(0.5f, 0.5f, 0.5f, 1.0f); // szare tlo
  394. glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
  395.  
  396. translationMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f)); // macierz przesuniecia o zadany wektor
  397. rotationMatrix = glm::rotate(glm::mat4(), glm::radians(angle), glm::vec3(0.0f, 1.0f, 0.0f)); // macierz obrotu o zadany kat wokol osi y
  398. transformMatrix = projectionMatrix * viewMatrix * translationMatrix * rotationMatrix; // wynikowa macierz transformacji
  399. glUniformMatrix4fv(transformMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(transformMatrix)); // macierz jako wejściowa zmienna dla shadera wierzcholkow
  400.  
  401. glBindVertexArray(vao[1]);
  402. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //rysujemy podloge
  403.  
  404. glBindVertexArray(vao[0]);
  405. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //rysujemy sciane
  406.  
  407. glBindVertexArray(vao[2]);
  408. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //rysujemy sciane
  409.  
  410. glBindVertexArray(vao[3]);
  411. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //rysujemy podloge
  412.  
  413. glBindVertexArray(vao[4]);
  414. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //rysujemy scian
  415.  
  416. angle += -0.05;
  417. SDL_GL_SwapWindow(window);
  418. }
  419.  
  420. glDeleteProgram(shaderProgram);
  421. glDeleteShader(fragmentShader);
  422. glDeleteShader(vertexShader);
  423.  
  424. glDeleteBuffers(5, vbo);
  425. glDeleteBuffers(1, &ebo);
  426. glDeleteTextures(1, &tex);
  427. glDeleteVertexArrays(5, vao);
  428.  
  429. SDL_GL_DeleteContext(context);
  430. SDL_Quit();
  431.  
  432. return 0;
  433. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement