Advertisement
Guest User

Untitled

a guest
May 27th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.71 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <GL/glew.h>
  4. #include <GLFW/glfw3.h>
  5.  
  6. void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
  7.  
  8. // розмір вікна
  9. const GLuint WIDTH = 800, HEIGHT = 600;
  10.  
  11. // вершинний шейдер
  12. const GLchar* vertexShaderSource = "#version 330 core\n"
  13. "layout (location = 0) in vec3 position;\n"
  14. "void main()\n"
  15. "{\n"
  16. "gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
  17. "}\0";
  18. //фрагментний шейдер
  19. const GLchar* fragmentShaderSource = "#version 330 core\n"
  20. "out vec4 color;\n"
  21. "void main()\n"
  22. "{\n"
  23. "color = vec4(0.1f, 0.2f, 0.5f, 1.0f);\n"
  24. "}\n\0";
  25.  
  26.  
  27. int main()
  28. {
  29.  
  30. glfwInit();
  31.  
  32. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  33. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  34. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  35. glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
  36.  
  37. GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
  38. glfwMakeContextCurrent(window);
  39. glfwSetKeyCallback(window, key_callback);
  40. glewExperimental = GL_TRUE;
  41.  
  42. glewInit();
  43.  
  44. int width, height;
  45. glfwGetFramebufferSize(window, &width, &height);
  46. glViewport(0, 0, width, height);
  47. //створення вершинного шейдера
  48. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  49. glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  50. glCompileShader(vertexShader);
  51. //перевірка на наявність помилок
  52. GLint success;
  53. GLchar infoLog[512];
  54. glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
  55. if (!success)
  56. {
  57. glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
  58. std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  59. }
  60. // виклик та створення фрагментного шейдера
  61. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  62. glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  63. glCompileShader(fragmentShader);
  64. //перевірка на наявність помилок
  65. glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
  66. if (!success)
  67. {
  68. glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
  69. std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  70. }
  71. // під'єднання шейдера
  72. GLuint shaderProgram = glCreateProgram();
  73. glAttachShader(shaderProgram, vertexShader);
  74. glAttachShader(shaderProgram, fragmentShader);
  75. glLinkProgram(shaderProgram);
  76. glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  77. if (!success) {
  78. glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  79. std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  80. }
  81. glDeleteShader(vertexShader);
  82. glDeleteShader(fragmentShader);
  83. GLfloat firstTriangle[] = {
  84. -0.7f, -0.4f, 0.0f, // коорд лівої нижньої вершини при основі першого трикутника
  85. 0.3f, -0.4f, 0.0f, // коорд правої нижньої вершини при основі трикутника
  86. -0.2f, 0.3f, 0.0f, // координати центральної вершини
  87. };
  88. GLfloat secondTriangle[] = {
  89. 0.1f, -0.7f, 0.0f, // коорд лівої нижньої вершини при основі першого трикутника
  90. 0.8f, -0.7f, 0.0f, // коорд правої нижньої вершини при основі першого трикутника
  91. 0.5f, -0.2f, 0.0f // коорд вершини
  92. };
  93. GLuint VBOs[2], VAOs[2];
  94. glGenVertexArrays(2, VAOs); // генерація декількох VAOs в один час
  95. glGenBuffers(2, VBOs);
  96. // ================================
  97. // Побудова першого трикутника
  98. // ===============================
  99. glBindVertexArray(VAOs[0]);
  100. glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
  101. glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);
  102. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); // атрибути вершин залишаються однаковими
  103. glEnableVertexAttribArray(0);
  104. glBindVertexArray(0);
  105. // ================================
  106. // Побудова другого трикутника
  107. // ===============================
  108. glBindVertexArray(VAOs[1]); //відзначаємо що звертаємось до різних VAO зараз
  109. glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]); // додаємо VBO
  110. glBufferData(GL_ARRAY_BUFFER, sizeof(secondTriangle), secondTriangle, GL_STATIC_DRAW);
  111. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
  112. glEnableVertexAttribArray(0);
  113. glBindVertexArray(0);
  114.  
  115.  
  116. while (!glfwWindowShouldClose(window))
  117. {
  118.  
  119. glfwPollEvents();
  120.  
  121. // очищаємо колірний буфер
  122. glClearColor(0.5f, 0.5f, 0.9f, 1.0f);
  123. glClear(GL_COLOR_BUFFER_BIT);
  124.  
  125. // активуємо шейдер (один і той же шейдер для обох трикутників)
  126. glUseProgram(shaderProgram);
  127. // будуємо перший трикутник використовуючи дані з першого VAO
  128. glBindVertexArray(VAOs[0]);
  129. glDrawArrays(GL_TRIANGLES, 0, 3);
  130. // малюємо другий трикутник використовуючи дані з другого VAO
  131. glBindVertexArray(VAOs[1]);
  132. glDrawArrays(GL_TRIANGLES, 0, 3);
  133. glBindVertexArray(0);
  134.  
  135. // обмін екранними буферами
  136. glfwSwapBuffers(window);
  137. }
  138.  
  139. glDeleteVertexArrays(2, VAOs);
  140. glDeleteBuffers(2, VBOs);
  141. glfwTerminate();
  142. return 0;
  143. }
  144.  
  145. void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
  146. {
  147. if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
  148. glfwSetWindowShouldClose(window, GL_TRUE);
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement