Advertisement
codisinmyvines

bbvb

Oct 4th, 2021
802
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.59 KB | None | 0 0
  1. #include <glad/glad.h>
  2. #include <GLFW/glfw3.h>
  3. #include <stb/stb_image.h>
  4.  
  5. #include <iostream>
  6.  
  7. const char* vertexShaderSource = "#version 330 core\n"
  8. "layout (location = 0) in vec3 aPos;\n"
  9. "layout(location = 1) in vec3 aColor;\n"
  10. "layout(location = 2) in vec2 aTexCoord;\n"
  11. "out vec3 ourColor;\n"
  12. "out vec2 TexCoord;\n"
  13. "uniform float horizontalOffset;\n"
  14. "void main()\n"
  15. "{\n"
  16. "   gl_Position = vec4(aPos.x+horizontalOffset,aPos.y,aPos.z, 1.0);\n"
  17. "   ourColor = aColor;\n"
  18. "   TexCoord = aTexCoord;\n"
  19. "}\0";
  20. const char* fragmentShaderSource = "#version 330 core\n"
  21. "out vec4 FragColor;\n"
  22. "in vec3 ourColor;\n"
  23. "in vec2 TexCoord;\n"
  24. "uniform sampler2D ourTexture;\n"
  25. "void main()\n"
  26. "{\n"
  27. "   FragColor = texture(ourTexture, TexCoord);\n"
  28. "}\n\0";
  29.  
  30. void framebuffer_size_callback(GLFWwindow* window, int width, int height);
  31. void processInput(GLFWwindow* window);
  32.  
  33. // Константы
  34. const unsigned int SCR_WIDTH = 800;
  35. const unsigned int SCR_HEIGHT = 600;
  36.  
  37. int main()
  38. {
  39.     // glfw: инициализация и конфигурирование    
  40.     glfwInit();
  41.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  42.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  43.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  44.  
  45.  
  46.     // glfw: создание окна
  47.     GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "OpenGL for Ravesli.com", NULL, NULL);
  48.     if (window == NULL)
  49.     {
  50.         std::cout << "Failed to create GLFW window" << std::endl;
  51.         glfwTerminate();
  52.         return -1;
  53.     }
  54.     glfwMakeContextCurrent(window);
  55.     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  56.  
  57.     // glad: загрузка всех указателей на OpenGL-функции
  58.     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  59.     {
  60.         std::cout << "Failed to initialize GLAD" << std::endl;
  61.         return -1;
  62.     }
  63.  
  64.     int vertexShader = glCreateShader(GL_VERTEX_SHADER);
  65.     glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  66.     glCompileShader(vertexShader);
  67.     int success;
  68.     char infoLog[512];
  69.     glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
  70.     if (!success)
  71.     {
  72.         glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
  73.         std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  74.     }
  75.  
  76.     //фрагментный шейдер
  77.     unsigned int fragmentShader;
  78.     fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  79.     glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  80.     glCompileShader(fragmentShader);
  81.     glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
  82.     if (!success)
  83.     {
  84.         glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
  85.         std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  86.     }
  87.     //связывание шейдеров
  88.     int shaderProgram = glCreateProgram();
  89.     glAttachShader(shaderProgram, vertexShader);
  90.     glAttachShader(shaderProgram, fragmentShader);
  91.     glLinkProgram(shaderProgram);
  92.     // Проверка на наличие ошибок компилирования связывания шейдеров
  93.     glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  94.     if (!success) {
  95.         glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  96.         std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  97.     }
  98.     glDeleteShader(vertexShader);
  99.     glDeleteShader(fragmentShader);
  100.  
  101.     // Указание вершин (и буфера(ов)) и настройка вершинных атрибутов
  102.     float vertices[] = {
  103.         // координаты        // цвета            // текстурные координаты
  104.         0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   0.0f, 0.0f, // верхняя правая вершина
  105.         0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   0.0f, 1.0f, // нижняя правая вершина
  106.        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   1.0f, 1.0f, // нижняя левая вершина
  107.        -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   1.0f, 0.0f  // верхняя левая вершина
  108.     };
  109.     unsigned int indices[] = {
  110.         0, 1, 3, // первый треугольник
  111.         1, 2, 3  // второй треугольник
  112.     };
  113.     unsigned int VBO, VAO, EBO;
  114.     glGenVertexArrays(1, &VAO);
  115.     glGenBuffers(1, &VBO);
  116.     glGenBuffers(1, &EBO);
  117.  
  118.     glBindVertexArray(VAO);
  119.  
  120.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  121.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  122.  
  123.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  124.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  125.  
  126.     // Загрузка изображения, создание текстуры и генерирование мипмап-уровней
  127.     int width, height, nrChannels;
  128.     unsigned char* data = stbi_load("wooden_container.jpg", &width, &height, &nrChannels, 0);
  129.    
  130.     GLuint texture;
  131.     glGenTextures(1, &texture);
  132.     glActiveTexture(GL_TEXTURE0);
  133.     glBindTexture(GL_TEXTURE_2D, texture);
  134.  
  135.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  136.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  137.  
  138.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  139.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  140.  
  141.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
  142.     glGenerateMipmap(GL_TEXTURE_2D);
  143.  
  144.     // Координатные атрибуты
  145.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
  146.     glEnableVertexAttribArray(0);
  147.  
  148.     // Цветовые атрибуты
  149.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
  150.     glEnableVertexAttribArray(1);
  151.  
  152.     // Атрибуты текстурных координат
  153.     glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
  154.     glEnableVertexAttribArray(2);
  155.  
  156.     stbi_image_free(data);
  157.     glBindTexture(GL_TEXTURE_2D, 0);
  158.  
  159.     GLuint TexCoord = glGetUniformLocation(shaderProgram, "TexCoord");
  160.     glUseProgram(shaderProgram);
  161.     glUniform1f(TexCoord, 0);
  162.     // Цикл рендеринга
  163.     while (!glfwWindowShouldClose(window))
  164.     {
  165.         // Обработка ввода
  166.         processInput(window);
  167.  
  168.         // Рендеринг
  169.         glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  170.         glClear(GL_COLOR_BUFFER_BIT);
  171.  
  172.         // Связывание текстуры
  173.         glBindTexture(GL_TEXTURE_2D, texture);
  174.  
  175.         // Рендеринг ящика
  176.  
  177.         glBindTexture(GL_TEXTURE_2D, texture);
  178.         glBindVertexArray(VAO);
  179.         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  180.  
  181.         // glfw: обмен содержимым front- и back- буферов. Отслеживание событий ввода/вывода (была ли нажата/отпущена кнопка, перемещен курсор мыши и т.п.)
  182.         glfwSwapBuffers(window);
  183.         glfwPollEvents();
  184.     }
  185.  
  186.     // Опционально: освобождаем все ресурсы, как только они выполнили свое предназначение
  187.     glDeleteVertexArrays(1, &VAO);
  188.     glDeleteBuffers(1, &VBO);
  189.     glDeleteBuffers(1, &EBO);
  190.  
  191.     // glfw: завершение, освобождение всех выделенных ранее GLFW-реурсов
  192.     glfwTerminate();
  193.     return 0;
  194. }
  195.  
  196. // Обработка всех событий ввода: запрос GLFW о нажатии/отпускании кнопки мыши в данном кадре и соответствующая обработка данных событий
  197. void processInput(GLFWwindow* window)
  198. {
  199.     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  200.         glfwSetWindowShouldClose(window, true);
  201. }
  202.  
  203. // glfw: всякий раз, когда изменяются размеры окна (пользователем или операционной системой), вызывается данная callback-функция
  204. void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  205. {
  206.     // Убеждаемся, что окно просмотра соответствует новым размерам окна.
  207.     // Обратите внимание, что высота и ширина будут значительно больше, чем указано, на Retina-дисплеях
  208.     glViewport(0, 0, width, height);
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement