Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #include <GL/gl3w.h>
  5. #include <GLFW/glfw3.h>
  6. #include <iostream>
  7. #include <string>
  8.  
  9. using namespace std;
  10. GLuint rendering_program;
  11. GLuint vertex_array_object;
  12.  
  13. void error_callback(int error, const char* description) {
  14. fprintf(stderr, "Error: %s\n", description);
  15. }
  16.  
  17. static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
  18. if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
  19. glfwSetWindowShouldClose(window, GLFW_TRUE);
  20. }
  21.  
  22. static void resize_callback(GLFWwindow* window, int width, int height) {
  23. glViewport(0, 0, width, height);
  24. }
  25.  
  26. GLuint compile_shaders(void) {
  27. GLuint vertex_shader;
  28. GLuint fragment_shader;
  29. GLuint program;
  30. GLint testval;
  31. GLint abort = 0;
  32. const std::string vertex_source =
  33. #include "vertex.vs"
  34. ;
  35. const char *c_str = vertex_source.c_str();
  36.  
  37. static const GLchar * fragment_shader_source[] = {
  38. "#version 330 core \n"
  39.  
  40. "out vec4 color;"
  41.  
  42. "void main(void) {"
  43. " color = vec4(0.0, 0.8, 1.0, 1.0);"
  44. "}"
  45. };
  46.  
  47. vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  48. glShaderSource(vertex_shader, 1, &c_str, NULL);
  49. glCompileShader(vertex_shader);
  50.  
  51. fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  52. glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
  53. glCompileShader(fragment_shader);
  54.  
  55. glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &testval);
  56. if(testval == GL_FALSE)
  57. {
  58. abort = 1;
  59. char infolog[1024];
  60. glGetShaderInfoLog(vertex_shader,1024,NULL,infolog);
  61. cout << "The vertex shader failed to compile with the error:" << endl << infolog << endl;
  62. }
  63.  
  64. glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &testval);
  65. if(testval == GL_FALSE)
  66. {
  67. abort = 1;
  68. char infolog[1024];
  69. glGetShaderInfoLog(fragment_shader,1024,NULL,infolog);
  70. cout << "The fragment shader failed to compile with the error:" << endl << infolog << endl;
  71. }
  72.  
  73. glGetProgramiv(program, GL_LINK_STATUS, &testval);
  74. if(testval == GL_FALSE)
  75. {
  76. abort = 1;
  77. char infolog[1024];
  78. glGetProgramInfoLog(program,1024,NULL,infolog);
  79. cout << "The program failed to compile with the error:" << endl << infolog << endl;
  80. }
  81. if(abort)
  82. {
  83. cout << "errors occured, cannot continue, aborting." << endl;
  84. exit(-1);
  85. }
  86. program = glCreateProgram();
  87. glAttachShader(program, vertex_shader);
  88. glAttachShader(program, fragment_shader);
  89. glLinkProgram(program);
  90.  
  91. glDeleteShader(vertex_shader);
  92. glDeleteShader(fragment_shader);
  93.  
  94. return program;
  95. }
  96.  
  97. void startup() {
  98. rendering_program = compile_shaders();
  99. glCreateVertexArrays(1, &vertex_array_object);
  100. glBindVertexArray(vertex_array_object);
  101. }
  102.  
  103. void shutdown() {
  104. glDeleteVertexArrays(1, &vertex_array_object);
  105. glDeleteProgram(rendering_program);
  106. }
  107.  
  108. void render(double currentTime) {
  109. const GLfloat color[] = {
  110. (float) sin(currentTime) * 0.5f + 0.5f,
  111. (float) cos(currentTime) * 0.5f + 0.5f,
  112. 0.0f,
  113. 1.0f
  114. };
  115. glClearBufferfv(GL_COLOR, 0, color);
  116.  
  117. glUseProgram(rendering_program);
  118. glDrawArrays(GL_TRIANGLES, 0, 3);
  119. }
  120.  
  121. int main(void) {
  122. GLFWwindow* window;
  123.  
  124. glfwSetErrorCallback(error_callback);
  125.  
  126. if(! glfwInit())
  127. return -1;
  128.  
  129. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  130. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  131. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  132.  
  133. window = glfwCreateWindow(800, 600, "Hello World", NULL, NULL);
  134. if(! window) {
  135. glfwTerminate();
  136. return -1;
  137. }
  138.  
  139. glfwMakeContextCurrent(window);
  140. if(gl3wInit()) {
  141. fprintf(stderr, "failed to initialize OpenGL\n");
  142. return -1;
  143. }
  144. if(! gl3wIsSupported(3, 3)) {
  145. fprintf(stderr, "OpenGL 3.3 not supported\n");
  146. return -1;
  147. }
  148. printf("OpenGL %s, GLSL %s\n", glGetString(GL_VERSION),
  149. glGetString(GL_SHADING_LANGUAGE_VERSION));
  150.  
  151. glfwSetKeyCallback(window, key_callback);
  152. glfwSetWindowSizeCallback(window, resize_callback);
  153. glfwSwapInterval(1);
  154.  
  155. startup();
  156.  
  157. while(!glfwWindowShouldClose(window)){
  158. render(glfwGetTime());
  159.  
  160. glfwSwapBuffers(window);
  161. glfwPollEvents();
  162. }
  163.  
  164. shutdown();
  165.  
  166. glfwDestroyWindow(window);
  167. glfwTerminate();
  168. return 0;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement