Advertisement
Guest User

grafika

a guest
Apr 3rd, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.68 KB | None | 0 0
  1. #include <GL/glew.h>
  2. #include <SFML/Window.hpp>
  3. #include <iostream>
  4. #include <cmath>
  5.  
  6. #include <glm/glm.hpp>
  7. #include <glm/gtc/matrix_transform.hpp>
  8. #include <glm/gtc/type_ptr.hpp>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. void compilation_checking(GLuint shader, string shaderType) {
  14.     GLint isCompiled = 0;
  15.     glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
  16.     if (isCompiled == GL_FALSE)
  17.     {
  18.         GLint maxLength = 0;
  19.         glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
  20.         char* errorLog = new char[maxLength];
  21.         glGetShaderInfoLog(shader, maxLength, &maxLength, errorLog);
  22.         cout << "ERROR " << errorLog << endl;
  23.         glDeleteShader(shader);
  24.         return;
  25.     }
  26.     cout << "Compilation " + shaderType + " shader Ok" << endl;
  27. }
  28.  
  29. void zmianaWierchołkow(int punkty, const GLint& vbo)
  30. {
  31.     GLfloat* wierzcholki;
  32.     float alfa = 0;
  33.     float delta = 2 * 3.14 / punkty;
  34.     float promien = 1;
  35.  
  36.     if (punkty < 3)
  37.         return;
  38.  
  39.     wierzcholki = new GLfloat[punkty * 6];
  40.  
  41.     for (int i = 0; i < punkty * 6; i += 6)
  42.     {
  43.         wierzcholki[i] = promien * cos(alfa);
  44.         wierzcholki[i + 1] = promien * sin(alfa);
  45.         wierzcholki[i + 2] = 0;
  46.         wierzcholki[i + 3] = (cos(alfa) + 1) / 2.0f;
  47.         wierzcholki[i + 4] = (sin(alfa) + 1) / 2.0f;
  48.         wierzcholki[i + 5] = (cos(alfa) + 1) / 2.0f;
  49.         alfa += delta;
  50.     }
  51.  
  52.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  53.     glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * punkty * 6, wierzcholki, GL_STATIC_DRAW);
  54.  
  55.     delete[] wierzcholki;
  56. }
  57.  
  58.  
  59. const GLchar* vertexSource = R"glsl(
  60. #version 150 core
  61. in vec3 position;
  62. in vec3 color;
  63.         uniform mat4 model;
  64.         uniform mat4 view;
  65.         uniform mat4 proj;
  66. out vec3 Color;
  67. void main(){
  68. Color = color;
  69.        gl_Position = proj * view * model * vec4(position, 1.0);
  70. }
  71. )glsl";
  72.  
  73. const GLchar* fragmentSource = R"glsl(
  74. #version 150 core
  75. in vec3 Color;
  76. out vec4 outColor;
  77. void main()
  78. {
  79. outColor = vec4(Color, 1.0);
  80. }
  81. )glsl";
  82.  
  83. glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
  84. glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
  85. glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
  86.  
  87. void kostka(int buffer) {
  88.  
  89.     int punkty_ = 36;
  90.     float vertices[] = {
  91.             -0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f,
  92.             0.5f, -0.5f, -0.5f,  1.0f, 0.0f, 0.0f,
  93.             0.5f,  0.5f, -0.5f,  1.0f, 1.0f, 0.0f,
  94.             0.5f,  0.5f, -0.5f,  1.0f, 1.0f, 0.0f,
  95.             -0.5f,  0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  96.             -0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f,
  97.  
  98.             -0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f,
  99.             0.5f, -0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  100.             0.5f,  0.5f,  0.5f,  1.0f, 1.0f, 0.0f,
  101.             0.5f,  0.5f,  0.5f,  1.0f, 1.0f, 0.0f,
  102.             -0.5f,  0.5f,  0.5f,  0.0f, 1.0f, 0.0f,
  103.             -0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f,
  104.  
  105.             -0.5f,  0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  106.             -0.5f,  0.5f, -0.5f,  1.0f, 1.0f, 0.0f,
  107.             -0.5f, -0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  108.             -0.5f, -0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  109.             -0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f,
  110.             -0.5f,  0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  111.  
  112.             0.5f,  0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  113.             0.5f,  0.5f, -0.5f,  1.0f, 1.0f, 0.0f,
  114.             0.5f, -0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  115.             0.5f, -0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  116.             0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f,
  117.             0.5f,  0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  118.  
  119.             -0.5f, -0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  120.             0.5f, -0.5f, -0.5f,  1.0f, 1.0f, 0.0f,
  121.             0.5f, -0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  122.             0.5f, -0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  123.             -0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f,
  124.             -0.5f, -0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  125.  
  126.             -0.5f,  0.5f, -0.5f,  0.0f, 1.0f, 0.0f,
  127.             0.5f,  0.5f, -0.5f,  1.0f, 1.0f, 0.0f,
  128.             0.5f,  0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  129.             0.5f,  0.5f,  0.5f,  1.0f, 0.0f, 0.0f,
  130.             -0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f,
  131.             -0.5f,  0.5f, -0.5f,  0.0f, 1.0f, 0.0f
  132.     };
  133.  
  134.     glBindBuffer(GL_ARRAY_BUFFER, buffer);
  135.     glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * punkty_ * 6, vertices, GL_STATIC_DRAW);
  136. }
  137.  
  138. float obrot = 0;
  139.  
  140. void ustawKamere(GLint _uniView) {
  141.     float cameraSpeed = 0.009f;
  142.  
  143.     if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
  144.         cameraPos += cameraSpeed * cameraFront;
  145.     }
  146.     if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
  147.         cameraPos -= cameraSpeed * cameraFront;
  148.     }
  149.     if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
  150.         obrot -= cameraSpeed;
  151.         cameraFront.x = sin(obrot);
  152.         cameraFront.z = -cos(obrot);
  153.     }
  154.     if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
  155.         obrot -= cameraSpeed;
  156.         cameraFront.x = sin(obrot);
  157.         cameraFront.z = -cos(obrot);
  158.     }
  159.  
  160.     glm::mat4 view;
  161.     view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  162.     glUniformMatrix4fv(_uniView, 1, GL_FALSE, glm::value_ptr(view));
  163.  
  164. }
  165.  
  166. int main()
  167. {
  168.     sf::ContextSettings settings;
  169.     settings.depthBits = 24;
  170.     settings.stencilBits = 8;
  171.  
  172.     // Okno renderingu
  173.     sf::Window window(sf::VideoMode(800, 600, 32), "OpenGL", sf::Style::Titlebar | sf::Style::Close, settings);
  174.  
  175.     // Inicjalizacja GLEW
  176.     glewExperimental = GL_TRUE;
  177.     glewInit();
  178.  
  179.     // Utworzenie VAO (Vertex Array Object)
  180.     GLuint vao;
  181.     glGenVertexArrays(1, &vao);
  182.     glBindVertexArray(vao);
  183.  
  184.     GLuint vbo;
  185.     glGenBuffers(1, &vbo);
  186.  
  187.     //zmianaWierchołkow(3, vbo);
  188.     kostka(vbo);
  189.  
  190.     GLuint vertexShader =
  191.         glCreateShader(GL_VERTEX_SHADER);
  192.     glShaderSource(vertexShader, 1, &vertexSource, NULL);
  193.     glCompileShader(vertexShader);
  194.  
  195.     compilation_checking(vertexShader, "vertex");
  196.  
  197.     GLuint fragmentShader =
  198.         glCreateShader(GL_FRAGMENT_SHADER);
  199.     glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
  200.     glCompileShader(fragmentShader);
  201.  
  202.  
  203.     compilation_checking(vertexShader, "fragment");
  204.  
  205.     GLuint shaderProgram = glCreateProgram();
  206.     glAttachShader(shaderProgram, vertexShader);
  207.     glAttachShader(shaderProgram, fragmentShader);
  208.     glBindFragDataLocation(shaderProgram, 0, "outColor");
  209.     glLinkProgram(shaderProgram);
  210.     glUseProgram(shaderProgram);
  211.  
  212.     GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
  213.     glEnableVertexAttribArray(posAttrib);
  214.     glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), 0);
  215.     GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
  216.     glEnableVertexAttribArray(colAttrib);
  217.     glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
  218.  
  219.     glm::mat4 model = glm::mat4(1.0f);
  220.     model = glm::rotate(model, glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));
  221.  
  222.     GLint uniTrans = glGetUniformLocation(shaderProgram, "model");
  223.     glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
  224.  
  225.     GLint uniView = glGetUniformLocation(shaderProgram, "view");
  226.  
  227.     glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 800.0f, 0.06f, 100.0f);
  228.     GLint uniProj = glGetUniformLocation(shaderProgram, "proj");
  229.  
  230.  
  231.     glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(proj));
  232.  
  233.  
  234.     bool running = true;
  235.  
  236.     GLint mysz_y = 0;
  237.     int punkty = 3; //36?
  238.     GLint prymitywy[] = { GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP,  GL_POLYGON };
  239.     GLint prymityw = GL_TRIANGLE_FAN;
  240.  
  241.     glEnable(GL_DEPTH_TEST);
  242.  
  243.     while (running) {
  244.         sf::Event windowEvent;
  245.         while (window.pollEvent(windowEvent)) {
  246.             switch (windowEvent.type) {
  247.             case sf::Event::Closed:
  248.                 running = false;
  249.                 break;
  250.             case sf::Event::KeyPressed:
  251.                 switch (windowEvent.key.code)
  252.                 {
  253.                     case sf::Keyboard::Escape:
  254.                         running = false;
  255.                         break;
  256.                     case sf::Keyboard::Num1:
  257.                         prymityw = prymitywy[0];
  258.                         break;
  259.                     case sf::Keyboard::Num2:
  260.                         prymityw = prymitywy[1];
  261.                         break;
  262.                     case sf::Keyboard::Num3:
  263.                         prymityw = prymitywy[2];
  264.                         break;
  265.                     case sf::Keyboard::Num4:
  266.                         prymityw = prymitywy[3];
  267.                         break;
  268.                     case sf::Keyboard::Num5:
  269.                         prymityw = prymitywy[4];
  270.                         break;
  271.                     case sf::Keyboard::Num6:
  272.                         prymityw = prymitywy[5];
  273.                         break;
  274.                     case sf::Keyboard::Num7:
  275.                         prymityw = prymitywy[6];
  276.                         break;
  277.                     case sf::Keyboard::Num8:
  278.                         prymityw = prymitywy[7];
  279.                         break;
  280.                     case sf::Keyboard::Num9:
  281.                         prymityw = prymitywy[8];
  282.                         break;
  283.                     case sf::Keyboard::Num0:
  284.                         prymityw = prymitywy[9];
  285.                         break;
  286.                 }
  287.                 break;
  288.             //case sf::Event::MouseMoved:
  289.             //  if (windowEvent.mouseMove.y > mysz_y)
  290.             //  {
  291.             //      punkty++;
  292.             //      mysz_y = windowEvent.mouseMove.y;
  293.             //  } else {
  294.             //      if (punkty > 3)
  295.             //          punkty--;
  296.             //      mysz_y = windowEvent.mouseMove.y;
  297.             //  }
  298.  
  299.                 zmianaWierchołkow(punkty, vbo);
  300.                
  301.                 break;
  302.             }
  303.         }
  304.  
  305.         ustawKamere(uniView);
  306.  
  307.         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  308.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  309.  
  310.  
  311.         glDrawArrays(prymityw, 0, 36);
  312.         window.display();
  313.     }
  314.     glDeleteProgram(shaderProgram);
  315.     glDeleteShader(fragmentShader);
  316.     glDeleteShader(vertexShader);
  317.     glDeleteBuffers(1, &vbo);
  318.     glDeleteVertexArrays(1, &vao);
  319.  
  320.     window.close();
  321.     return 0;
  322. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement