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* fragmentShader1Source = "#version 330 core\n"
- "out vec4 color;\n"
- "void main()\n"
- "{\n"
- "color = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n"
- "}\n\0";
- const GLchar* fragmentShader2Source = "#version 330 core\n"
- "out vec4 color;\n"
- "void main()\n"
- "{\n"
- "color = vec4(1.0f, 1.0f, 1.0f, 1.0f); // The color yellow \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);
- GLuint fragmentShaderOrange = glCreateShader(GL_FRAGMENT_SHADER); // первая шейдерная программа которая будет выводить первый треугольник
- GLuint fragmentShaderYellow = glCreateShader(GL_FRAGMENT_SHADER); // вторая шейдерная программа которая будет выводить второй треугольник
- GLuint shaderProgramOrange = glCreateProgram();
- GLuint shaderProgramYellow = glCreateProgram(); // вторая шейдерная программа
- glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
- glCompileShader(vertexShader);
- glShaderSource(fragmentShaderOrange, 1, &fragmentShader1Source, NULL);
- glCompileShader(fragmentShaderOrange);
- glShaderSource(fragmentShaderYellow, 1, &fragmentShader2Source, NULL);
- glCompileShader(fragmentShaderYellow);
- glAttachShader(shaderProgramOrange, vertexShader);
- glAttachShader(shaderProgramOrange, fragmentShaderOrange);
- glLinkProgram(shaderProgramOrange);
- //используем разные фрагментные шейдерый и только один вершинный
- glAttachShader(shaderProgramYellow, vertexShader);
- glAttachShader(shaderProgramYellow, fragmentShaderYellow);
- glLinkProgram(shaderProgramYellow);
- GLfloat firstTriangle[] = {
- -0.8f, -0.5f, 0.0f,
- -0.1f, -0.5f, 0.0f,
- -0.45f, 0.5f, 0.0f,
- };
- GLfloat secondTriangle[] = {
- 0.1f, -0.4f, 0.0f,
- 0.7f, -0.4f, 0.0f,
- 0.5f, -0.5f, 0.0f
- };
- GLuint VBOs[2], VAOs[2];
- glGenVertexArrays(2, 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]);
- glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);
- 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.3f, 0.1f, 0.3f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- // когда хочем построить первый треугольник - используем наши вершины и фрагментный шейдер
- glUseProgram(shaderProgramOrange);
- //строим первый треугольник используя VAO
- glBindVertexArray(VAOs[0]);
- glDrawArrays(GL_TRIANGLES, 0, 3);
- glUseProgram(shaderProgramYellow);
- 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