Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <GL/glew.h>
- #include <GLFW/glfw3.h>
- void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
- // розмір вікна
- const GLuint WIDTH = 800, HEIGHT = 600;
- // вершинний шейдер
- const GLchar* vertexShaderSource = "#version 330 core\n"
- "layout (location = 0) in vec3 position;\n"
- "void main()\n"
- "{\n"
- "gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
- "}\0";
- //фрагментний шейдер
- const GLchar* fragmentShaderSource = "#version 330 core\n"
- "out vec4 color;\n"
- "void main()\n"
- "{\n"
- "color = vec4(0.1f, 0.2f, 0.5f, 1.0f);\n"
- "}\n\0";
- int main()
- {
- glfwInit();
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
- GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
- glfwMakeContextCurrent(window);
- glfwSetKeyCallback(window, key_callback);
- glewExperimental = GL_TRUE;
- glewInit();
- int width, height;
- glfwGetFramebufferSize(window, &width, &height);
- glViewport(0, 0, width, height);
- //створення вершинного шейдера
- GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
- glCompileShader(vertexShader);
- //перевірка на наявність помилок
- GLint success;
- GLchar infoLog[512];
- glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
- if (!success)
- {
- glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
- }
- // виклик та створення фрагментного шейдера
- GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
- glCompileShader(fragmentShader);
- //перевірка на наявність помилок
- glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
- if (!success)
- {
- glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
- }
- // під'єднання шейдера
- GLuint shaderProgram = glCreateProgram();
- glAttachShader(shaderProgram, vertexShader);
- glAttachShader(shaderProgram, fragmentShader);
- glLinkProgram(shaderProgram);
- glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
- if (!success) {
- glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
- }
- glDeleteShader(vertexShader);
- glDeleteShader(fragmentShader);
- GLfloat firstTriangle[] = {
- -0.7f, -0.4f, 0.0f, // коорд лівої нижньої вершини при основі першого трикутника
- 0.3f, -0.4f, 0.0f, // коорд правої нижньої вершини при основі трикутника
- -0.2f, 0.3f, 0.0f, // координати центральної вершини
- };
- GLfloat secondTriangle[] = {
- 0.1f, -0.7f, 0.0f, // коорд лівої нижньої вершини при основі першого трикутника
- 0.8f, -0.7f, 0.0f, // коорд правої нижньої вершини при основі першого трикутника
- 0.5f, -0.2f, 0.0f // коорд вершини
- };
- GLuint VBOs[2], VAOs[2];
- glGenVertexArrays(2, VAOs); // генерація декількох VAOs в один час
- glGenBuffers(2, VBOs);
- // ================================
- // Побудова першого трикутника
- // ===============================
- glBindVertexArray(VAOs[0]);
- glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
- glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); // атрибути вершин залишаються однаковими
- glEnableVertexAttribArray(0);
- glBindVertexArray(0);
- // ================================
- // Побудова другого трикутника
- // ===============================
- glBindVertexArray(VAOs[1]); //відзначаємо що звертаємось до різних VAO зараз
- glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]); // додаємо VBO
- glBufferData(GL_ARRAY_BUFFER, sizeof(secondTriangle), secondTriangle, GL_STATIC_DRAW);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
- glEnableVertexAttribArray(0);
- glBindVertexArray(0);
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
- // очищаємо колірний буфер
- glClearColor(0.5f, 0.5f, 0.9f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- // активуємо шейдер (один і той же шейдер для обох трикутників)
- glUseProgram(shaderProgram);
- // будуємо перший трикутник використовуючи дані з першого VAO
- glBindVertexArray(VAOs[0]);
- glDrawArrays(GL_TRIANGLES, 0, 3);
- // малюємо другий трикутник використовуючи дані з другого VAO
- glBindVertexArray(VAOs[1]);
- glDrawArrays(GL_TRIANGLES, 0, 3);
- glBindVertexArray(0);
- // обмін екранними буферами
- glfwSwapBuffers(window);
- }
- glDeleteVertexArrays(2, VAOs);
- glDeleteBuffers(2, VBOs);
- glfwTerminate();
- return 0;
- }
- void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
- {
- if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
- glfwSetWindowShouldClose(window, GL_TRUE);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement