Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.98 KB | None | 0 0
  1. #include <glad/glad.h>
  2. #include <GLFW/glfw3.h>
  3. #include <imgui.h>
  4.  
  5. #include <iostream>
  6. #include <vector>
  7.  
  8. void framebuffer_size_callback(GLFWwindow* window, int width, int height);
  9. void processInput(GLFWwindow *window);
  10.  
  11.  
  12.  
  13. const char *vertexShaderSource = "#version 330 core\n"
  14.                                  "layout (location = 0) in vec3 aPos;\n"
  15.                                  "void main()\n"
  16.                                  "{\n"
  17.                                  "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
  18.                                  "}\0";
  19. const char *fragmentShaderSource = "#version 330 core\n"
  20.                                    "out vec4 FragColor;\n"
  21.                                    "void main()\n"
  22.                                    "{\n"
  23.                                    "   FragColor = vec4(1.0f, 1.f, 1.f, 1.0f);\n"
  24.                                    "}\n\0";
  25. const char *blackFragmentShaderSource = "#version 330 core\n"
  26.                                    "out vec4 FragColor;\n"
  27.                                    "void main()\n"
  28.                                    "{\n"
  29.                                    "   FragColor = vec4(1.0f, 1.f, 1.f, 1.0f);\n"
  30.                                    "}\n\0";
  31.  
  32. void createSquare(float x0, float y0, float side_length, std::vector<float> &vertices, std::vector<int> &indices)
  33. {
  34.     int first = vertices.size()/3;
  35.     vertices.insert(vertices.end(), { x0 + side_length, y0 + side_length, 0.f,
  36.                                       x0 + side_length, y0, 0.f,
  37.                                       x0, y0, 0.f,
  38.                                       x0, y0 + side_length, 0.f});
  39.     indices.insert(indices.end(), { first, first + 1 , first + 3,
  40.                                     first + 1, first + 2, first + 3 });
  41. }
  42.  
  43. void createSierpinskiCarpet(float x0, float y0, float side_length, int iterationsCount, std::vector<float> &vertices, std::vector<int> &indices)
  44. {
  45.     if(iterationsCount == 0)
  46.         return;
  47.  
  48.     createSquare(x0 + (side_length/3.f), y0 + (side_length/3.f), side_length/3.f, vertices, indices);
  49.  
  50.     for(int i = 0 ; i < 3; i++)
  51.     {
  52.         for(int j = 0 ; j < 3; j++)
  53.         {
  54.             if((i == 1 && j == 1))
  55.                 continue;
  56.             //createSquare(x0 + (j * (side_length/3.f)), y0 + (i * (side_length/3.f)), side_length/3.f, vertices, indices);
  57.             createSierpinskiCarpet(x0 + (j * (side_length/3.f)), y0 + (i * (side_length/3.f)), side_length/3.f, iterationsCount-1, vertices, indices);
  58.         }
  59.     }
  60. }
  61.  
  62. int main()
  63. {
  64.     glfwInit();
  65.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  66.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  67.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  68.  
  69.     GLFWwindow* window = glfwCreateWindow(700, 600, "Ćwiczenie 1", nullptr, nullptr);
  70.     if (window == nullptr)
  71.     {
  72.         std::cout << "Failed to create GLFW window" << std::endl;
  73.         glfwTerminate();
  74.         return -1;
  75.     }
  76.     glfwMakeContextCurrent(window);
  77.  
  78.     // inicjalizacja funkcji OpenGL dzięki bibliotece GLAD
  79.     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  80.     {
  81.         std::cout << "Failed to initialize GLAD" << std::endl;
  82.         return -1;
  83.     }
  84.     glViewport(0, 0, 600, 600);
  85.     //Callback dla zmiany okna przez użytkownika
  86.     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  87.  
  88.  
  89.     GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  90.     glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  91.     glCompileShader(vertexShader);
  92.     // check for shader compile errors
  93.     int success;
  94.     char infoLog[512];
  95.     glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
  96.     if (!success)
  97.     {
  98.         glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
  99.         std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  100.     }
  101.     // fragment shader
  102.     GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  103.     GLuint blackFragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  104.     glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  105.     glShaderSource(blackFragmentShader, 1, &blackFragmentShaderSource, NULL);
  106.     glCompileShader(fragmentShader);
  107.     glCompileShader(blackFragmentShader);
  108.     // check for shader compile errors
  109.     glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
  110.     if (!success)
  111.     {
  112.         glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
  113.         std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  114.     }
  115.     glGetShaderiv(blackFragmentShader, GL_COMPILE_STATUS, &success);
  116.     if (!success)
  117.     {
  118.         glGetShaderInfoLog(blackFragmentShader, 512, NULL, infoLog);
  119.         std::cout << "ERROR::BLACK::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  120.     }
  121.     // link shaders
  122.     GLuint shaderProgram = glCreateProgram();
  123.     GLuint shaderProgramBLACK = glCreateProgram();
  124.     glAttachShader(shaderProgram, vertexShader);
  125.     glAttachShader(shaderProgram, fragmentShader);
  126.     glLinkProgram(shaderProgram);
  127.  
  128.     glAttachShader(shaderProgramBLACK, vertexShader);
  129.     glAttachShader(shaderProgramBLACK, blackFragmentShader);
  130.     glLinkProgram(shaderProgramBLACK);
  131.     // check for linking errors
  132.     glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  133.     if (!success) {
  134.         glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  135.         std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  136.     }
  137.     // check for linking errors
  138.     glGetProgramiv(shaderProgramBLACK, GL_LINK_STATUS, &success);
  139.     if (!success) {
  140.         glGetProgramInfoLog(shaderProgramBLACK, 512, NULL, infoLog);
  141.         std::cout << "ERROR::BLACK::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  142.     }
  143.     glDeleteShader(vertexShader);
  144.     glDeleteShader(fragmentShader);
  145.     glDeleteShader(blackFragmentShader);
  146.  
  147.     GLuint VBO, VAO, EBO;
  148.  
  149.     std::vector<float> verticesVector;
  150.     std::vector<int> indicesVector;
  151.     createSierpinskiCarpet(-0.9f, -0.9f, 1.8f, 6, verticesVector, indicesVector);
  152.  
  153.     glGenVertexArrays(1, &VAO);
  154.     glGenBuffers(1, &VBO);
  155.     glGenBuffers(1, &EBO);
  156.     // bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
  157.     glBindVertexArray(VAO);
  158.  
  159.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  160.     glBufferData(GL_ARRAY_BUFFER, sizeof(verticesVector[0]) * verticesVector.size(), &verticesVector[0], GL_STATIC_DRAW);
  161.  
  162.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  163.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicesVector[0]) * indicesVector.size(), &indicesVector[0], GL_STATIC_DRAW);
  164.  
  165.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
  166.     glEnableVertexAttribArray(0);
  167.  
  168.     // note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbind
  169.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  170.     glBindVertexArray(0);
  171.  
  172.     while (!glfwWindowShouldClose(window))
  173.     {
  174.         processInput(window);
  175.  
  176.         glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  177.         glClear(GL_COLOR_BUFFER_BIT);
  178.  
  179.         // 2. Włącz program cieniujący, którego chcemy użyć do renderowania
  180.         glUseProgram(shaderProgram);
  181.         glBindVertexArray(VAO);
  182.         glDrawElements(GL_TRIANGLES, indicesVector.size(), GL_UNSIGNED_INT, 0);
  183.  
  184.  
  185.         // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
  186.         // -------------------------------------------------------------------------------
  187.         glfwSwapBuffers(window);
  188.         glfwPollEvents();
  189.     }
  190.  
  191.     // optional: de-allocate all resources once they've outlived their purpose:
  192.     // ------------------------------------------------------------------------
  193.     glDeleteVertexArrays(1, &VAO);
  194.     glDeleteBuffers(1, &VBO);
  195.  
  196.     // glfw: terminate, clearing all previously allocated GLFW resources.
  197.     // ------------------------------------------------------------------
  198.     glfwTerminate();
  199.     return 0;
  200. }
  201.  
  202. // process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
  203. // ---------------------------------------------------------------------------------------------------------
  204. void processInput(GLFWwindow *window)
  205. {
  206.     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  207.         glfwSetWindowShouldClose(window, true);
  208. }
  209.  
  210. // glfw: whenever the window size changed (by OS or user resize) this callback function executes
  211. // ---------------------------------------------------------------------------------------------
  212. void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  213. {
  214.     // make sure the viewport matches the new window dimensions; note that width and
  215.     // height will be significantly larger than specified on retina displays.
  216.     int lowerValue = (width - (width / 6) < height? width - (width / 6) : height);
  217.  
  218.     glViewport(0, 0, lowerValue, lowerValue);
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement