Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #include <GL/gl3w.h>
  5. #include <GLFW/glfw3.h>
  6.  
  7. #include <glm/vec3.hpp>
  8. #include <glm/mat4x4.hpp>
  9. #include <glm/gtc/matrix_transform.hpp>
  10. #include <glm/gtc/type_ptr.hpp>
  11.  
  12.  
  13. GLuint rendering_program;
  14. GLuint vertex_array_object;
  15. GLuint buffer;
  16. GLuint colorbuffer;
  17.  
  18. GLint mv_location;
  19. GLint proj_location;
  20.  
  21. float aspect;
  22. glm::mat4 mv_matrix;
  23. glm::mat4 proj_matrix;
  24.  
  25.  
  26. void error_callback(int error, const char* description) {
  27. fprintf(stderr, "Error: %s\n", description);
  28. }
  29.  
  30. static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
  31. if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
  32. glfwSetWindowShouldClose(window, GLFW_TRUE);
  33. }
  34.  
  35. static void resize_callback(GLFWwindow* window, int width, int height) {
  36. glViewport(0, 0, width, height);
  37.  
  38. aspect = (float) width / (float) height;
  39. proj_matrix = glm::perspective(glm::radians(50.0f), aspect, 0.1f, 1000.0f);
  40. }
  41.  
  42. GLuint compile_shaders(void) {
  43. GLuint vertex_shader;
  44. GLuint fragment_shader;
  45. GLuint program;
  46.  
  47. static const GLchar * vertex_shader_source[] = {
  48. "#version 330 core \n"
  49. "in vec4 position;"
  50. "in vec4 vertexColor;"
  51. "out vec4 color1;"
  52.  
  53. "uniform mat4 mv_matrix;"
  54. "uniform mat4 proj_matrix;"
  55.  
  56. "void main(void) {"
  57. " gl_Position = proj_matrix * mv_matrix * (position + gl_InstanceID + vec4(1,0,0,0));"
  58. "color1=vertexColor;"
  59. "}"
  60. };
  61.  
  62. static const GLchar * fragment_shader_source[] = {
  63. "#version 330 core \n"
  64. "in vec4 color1;"
  65.  
  66. "out vec4 color;"
  67.  
  68. "void main(void) {"
  69. " color = color1;"
  70. "}"
  71. };GLuint colorbuffer;
  72.  
  73.  
  74. vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  75. glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
  76. glCompileShader(vertex_shader);
  77.  
  78. fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  79. glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
  80. glCompileShader(fragment_shader);
  81.  
  82. program = glCreateProgram();
  83. glAttachShader(program, vertex_shader);
  84. glAttachShader(program, fragment_shader);
  85. glLinkProgram(program);
  86.  
  87. glDeleteShader(vertex_shader);
  88. glDeleteShader(fragment_shader);
  89.  
  90. return program;
  91. }
  92.  
  93. void startup() {
  94. rendering_program = compile_shaders();
  95. glCreateVertexArrays(1, &vertex_array_object);
  96. glBindVertexArray(vertex_array_object);
  97.  
  98. static const GLfloat vertex_positions[] = {
  99. -0.25f, 0.25f, -0.25f,
  100. -0.25f, -0.25f, -0.25f,
  101. 0.25f, -0.25f, -0.25f,
  102.  
  103. 0.25f, -0.25f, -0.25f,
  104. 0.25f, 0.25f, -0.25f,
  105. -0.25f, 0.25f, -0.25f,
  106.  
  107. 0.25f, -0.25f, -0.25f,
  108. 0.25f, -0.25f, 0.25f,
  109. 0.25f, 0.25f, -0.25f,
  110.  
  111. 0.25f, -0.25f, 0.25f,
  112. 0.25f, 0.25f, 0.25f,
  113. 0.25f, 0.25f, -0.25f,
  114.  
  115. 0.25f, -0.25f, 0.25f,
  116. -0.25f, -0.25f, 0.25f,
  117. 0.25f, 0.25f, 0.25f,
  118.  
  119. -0.25f, -0.25f, 0.25f,
  120. -0.25f, 0.25f, 0.25f,
  121. 0.25f, 0.25f, 0.25f,
  122.  
  123. -0.25f, -0.25f, 0.25f,
  124. -0.25f, -0.25f, -0.25f,
  125. -0.25f, 0.25f, 0.25f,
  126.  
  127. -0.25f, -0.25f, -0.25f,
  128. -0.25f, 0.25f, -0.25f,
  129. -0.25f, 0.25f, 0.25f,
  130.  
  131. -0.25f, -0.25f, 0.25f,
  132. 0.25f, -0.25f, 0.25f,
  133. 0.25f, -0.25f, -0.25f,
  134.  
  135. 0.25f, -0.25f, -0.25f,
  136. -0.25f, -0.25f, -0.25f,
  137. -0.25f, -0.25f, 0.25f,
  138.  
  139. -0.25f, 0.25f, -0.25f,
  140. 0.25f, 0.25f, -0.25f,
  141. 0.25f, 0.25f, 0.25f,
  142.  
  143. 0.25f, 0.25f, 0.25f,
  144. -0.25f, 0.25f, 0.25f,
  145. -0.25f, 0.25f, -0.25f
  146. };
  147.  
  148.  
  149. glGenBuffers(1, &buffer);
  150. glBindBuffer(GL_ARRAY_BUFFER, buffer);
  151. glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions), vertex_positions, GL_STATIC_DRAW);
  152.  
  153. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  154. glEnableVertexAttribArray(0);
  155.  
  156.  
  157. static const GLfloat g_color_buffer_data[] = {
  158. 0.583f, 0.771f, 0.014f, 0.014f,
  159. 0.609f, 0.115f, 0.436f, 0.014f,
  160. 0.327f, 0.483f, 0.844f, 0.014f,
  161. 0.822f, 0.569f, 0.201f, 0.014f,
  162. 0.435f, 0.602f, 0.223f, 0.014f,
  163. 0.310f, 0.747f, 0.185f, 0.014f,
  164. 0.597f, 0.770f, 0.761f, 0.014f,
  165. 0.559f, 0.436f, 0.730f, 0.014f,
  166. 0.359f, 0.583f, 0.152f,0.014f,
  167. 0.483f, 0.596f, 0.789f,0.014f,
  168. 0.559f, 0.861f, 0.639f,0.014f,
  169. 0.195f, 0.548f, 0.859f,0.014f,
  170. 0.014f, 0.184f, 0.576f,0.0140f,
  171. 0.771f, 0.328f, 0.970f,0.014f,
  172. 0.406f, 0.615f, 0.116f,0.014f,
  173. 0.676f, 0.977f, 0.133f,0.014f,
  174. 0.971f, 0.572f, 0.833f,0.014f,
  175. 0.140f, 0.616f, 0.489f,0.014f,
  176. 0.997f, 0.513f, 0.064f,0.014f,
  177. 0.945f, 0.719f, 0.592f,0.014f,
  178. 0.543f, 0.021f, 0.978f,0.014f,
  179. 0.279f, 0.317f, 0.505f,0.014f,
  180. 0.167f, 0.620f, 0.077f,0.014f,
  181. 0.347f, 0.857f, 0.137f,0.014f,
  182. 0.055f, 0.953f, 0.042f,0.014f,
  183. 0.714f, 0.505f, 0.345f,0.014f,
  184. 0.783f, 0.290f, 0.734f,0.014f,
  185. 0.722f, 0.645f, 0.174f,0.014f,
  186. 0.302f, 0.455f, 0.848f,0.014f,
  187. 0.225f, 0.587f, 0.040f,0.014f,
  188. 0.517f, 0.713f, 0.338f,0.014f,
  189. 0.053f, 0.959f, 0.120f,0.014f,
  190. 0.393f, 0.621f, 0.362f,0.014f,
  191. 0.673f, 0.211f, 0.457f,0.014f,
  192. 0.820f, 0.883f, 0.371f,0.014f,
  193. 0.982f, 0.099f, 0.879f,0.014f,
  194. };
  195.  
  196. glGenBuffers(1, &colorbuffer);
  197. glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
  198. glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);
  199. glEnableVertexAttribArray(1);
  200.  
  201. glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  202.  
  203. glEnable(GL_CULL_FACE);
  204. glFrontFace(GL_CW);
  205. }
  206.  
  207. void shutdown() {
  208. glDeleteVertexArrays(1, &vertex_array_object);
  209. glDeleteProgram(rendering_program);
  210. glDeleteBuffers(1, &buffer);
  211. }
  212.  
  213. void render(double currentTime) {
  214. float f = (float) currentTime * (float) M_PI * 0.1f;
  215. glm::mat4 I = glm::mat4(1.0f);
  216. mv_matrix = (
  217. glm::translate(I, glm::vec3((float) sin(f)*0.5, (float) cos(f)*0.5, -2.0f))
  218. );
  219.  
  220. mv_matrix = glm::rotate(mv_matrix, 4*f, glm::vec3(0.5f, 0.5f, 1.0f));
  221.  
  222. const GLfloat color[] = {
  223. (float) sin(currentTime) * 0.5f + 0.5f,
  224. (float) cos(currentTime) * 0.5f + 0.5f,
  225. 0.0f,
  226. 1.0f
  227. };
  228. glClearBufferfv(GL_COLOR, 0, color);
  229.  
  230. glUseProgram(rendering_program);
  231.  
  232. mv_location = glGetUniformLocation(rendering_program, "mv_matrix");
  233. proj_location = glGetUniformLocation(rendering_program, "proj_matrix");
  234. glUniformMatrix4fv(mv_location, 1, GL_FALSE, glm::value_ptr(mv_matrix));
  235. glUniformMatrix4fv(proj_location, 1, GL_FALSE, glm::value_ptr(proj_matrix));
  236.  
  237. glDrawArraysInstanced(GL_TRIANGLES, 0, 36, 20);
  238.  
  239. // for(int i = 0; i < 10; i++) {
  240. // mv_matrix = (
  241. // glm::translate(I, glm::vec3((float) cos(f)*i/10, (float) sin(f)*i/10, -2.0f))
  242. // );
  243.  
  244. // mv_matrix = glm::rotate(mv_matrix, 4*f, glm::vec3(0.5f, 0.5f, 1.0f));
  245. // glUniformMatrix4fv(mv_location, 1, GL_FALSE, glm::value_ptr(mv_matrix));
  246. // glUniformMatrix4fv(proj_location, 1, GL_FALSE, glm::value_ptr(proj_matrix));
  247. // glDrawArrays(GL_TRIANGLES, 0, 36);
  248. // }
  249.  
  250. }
  251.  
  252. int main(void) {
  253. GLFWwindow* window;
  254.  
  255. glfwSetErrorCallback(error_callback);
  256.  
  257. if(! glfwInit())
  258. return -1;
  259.  
  260. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  261. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  262. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  263. proj_matrix = glm::perspective(glm::radians(50.0f), 800/600.0f, 0.1f, 1000.0f);
  264.  
  265. window = glfwCreateWindow(800, 600, "Hello World", NULL, NULL);
  266. if(! window) {
  267. glfwTerminate();
  268. return -1;
  269. }
  270.  
  271. glfwMakeContextCurrent(window);
  272. if(gl3wInit()) {
  273. fprintf(stderr, "failed to initialize OpenGL\n");
  274. return -1;
  275. }
  276. if(! gl3wIsSupported(3, 3)) {
  277. fprintf(stderr, "OpenGL 3.3 not supported\n");
  278. return -1;
  279. }
  280. printf("OpenGL %s, GLSL %s\n", glGetString(GL_VERSION),
  281. glGetString(GL_SHADING_LANGUAGE_VERSION));
  282.  
  283. glfwSetKeyCallback(window, key_callback);
  284. glfwSetWindowSizeCallback(window, resize_callback);
  285. glfwSwapInterval(1);
  286.  
  287. startup();
  288.  
  289. while(!glfwWindowShouldClose(window)){
  290. render(glfwGetTime());
  291.  
  292. glfwSwapBuffers(window);
  293. glfwPollEvents();
  294. }
  295.  
  296. shutdown();
  297.  
  298. glfwDestroyWindow(window);
  299. glfwTerminate();
  300. return 0;
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement