Advertisement
Guest User

Untitled

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