Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // GLEW нужно подключать до GLFW.
- // GLEW
- #include <Windows.h>
- #include <stdio.h>
- #pragma comment(lib, "legacy_stdio_definitions.lib")
- #define GLEW_STATIC
- #include <glew.h>
- // GLFW
- #include <glfw3.h>
- #include <SOIL.h>
- #include <string>
- #include <fstream>
- #include <sstream>
- #include <iostream>
- class Shader
- {
- public:
- // Идентификатор программы
- GLuint Program;
- // Конструктор считывает и собирает шейдер
- Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
- {
- // 1. Получаем исходный код шейдера из filePath
- std::string vertexCode;
- std::string fragmentCode;
- std::ifstream vShaderFile;
- std::ifstream fShaderFile;
- // Удостоверимся, что ifstream объекты могут выкидывать исключения
- vShaderFile.exceptions(std::ifstream::badbit);
- fShaderFile.exceptions(std::ifstream::badbit);
- try
- {
- // Открываем файлы
- vShaderFile.open(vertexPath);
- fShaderFile.open(fragmentPath);
- std::stringstream vShaderStream, fShaderStream;
- // Считываем данные в потоки
- vShaderStream << vShaderFile.rdbuf();
- fShaderStream << fShaderFile.rdbuf();
- // Закрываем файлы
- vShaderFile.close();
- fShaderFile.close();
- // Преобразовываем потоки в массив GLchar
- vertexCode = vShaderStream.str();
- fragmentCode = fShaderStream.str();
- }
- catch (std::ifstream::failure e)
- {
- std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
- }
- const GLchar* vShaderCode = vertexCode.c_str();
- const GLchar* fShaderCode = fragmentCode.c_str();
- // 2. Сборка шейдеров
- GLuint vertex, fragment;
- GLint success;
- GLchar infoLog[512];
- // Вершинный шейдер
- vertex = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertex, 1, &vShaderCode, NULL);
- glCompileShader(vertex);
- // Если есть ошибки - вывести их
- glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
- if (!success)
- {
- glGetShaderInfoLog(vertex, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
- };
- // Фрагментный шейдер
- fragment = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragment, 1, &fShaderCode, NULL);
- glCompileShader(fragment);
- // Если есть ошибки - вывести их
- glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
- if (!success)
- {
- glGetShaderInfoLog(fragment, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
- };
- // Шейдерная программа
- this->Program = glCreateProgram();
- glAttachShader(this->Program, vertex);
- glAttachShader(this->Program, fragment);
- glLinkProgram(this->Program);
- //Если есть ошибки - вывести их
- glGetProgramiv(this->Program, GL_LINK_STATUS, &success);
- if (!success)
- {
- glGetProgramInfoLog(this->Program, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
- }
- std::cout << "vShaderCode" << std::endl << vShaderCode << std::endl << std::endl;
- std::cout << "fShaderCode" << std::endl << fShaderCode << std::endl << std::endl;
- // Удаляем шейдеры, поскольку они уже в программу и нам больше не нужны.
- glDeleteShader(vertex);
- glDeleteShader(fragment);
- }
- // Использование программы
- void Use() { glUseProgram(this->Program); }
- };
- void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
- {
- // Когда пользователь нажимает ESC, мы устанавливаем свойство WindowShouldClose в true,
- // и приложение после этого закроется
- if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
- glfwSetWindowShouldClose(window, GL_TRUE);
- }
- GLFWwindow* initWindow()
- {
- //Инициализация GLFW
- glfwInit();
- //Настройка GLFW
- //Задается минимальная требуемая версия OpenGL.
- //Мажорная
- 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(800, 600, "LearnOpenGL", nullptr, nullptr);
- if (window == nullptr)
- {
- std::cout << "Failed to create GLFW window" << std::endl;
- glfwTerminate();
- return NULL;
- }
- glfwMakeContextCurrent(window);
- glewExperimental = GL_TRUE;
- if (glewInit() != GLEW_OK)
- {
- std::cout << "Failed to initialize GLEW" << std::endl;
- return NULL;
- }
- return window;
- }
- using namespace std;
- int main()
- {
- GLuint texture;
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
- int widthi, heighti;
- unsigned char* image = SOIL_load_image("C:\\Users\\skich\\OpenGL\\Textures\\yachik3.jpg", &widthi, &heighti, 0, SOIL_LOAD_RGB);
- cout << widthi << " " << heighti << endl;
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, widthi, heighti, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
- //glGenerateMipmap(GL_TEXTURE_2D);
- //SOIL_free_image_data(image);
- glBindTexture(GL_TEXTURE_2D, 0);
- //C:\Users\skich\OpenGL\Textures\yachik3.jpg
- //C:\Users\skich\OpenGL\Shaders\fragment.txt
- //C:\Users\skich\OpenGL\Shaders\vert.txt
- GLFWwindow* window = initWindow();
- int width, height;
- glfwGetFramebufferSize(window, &width, &height);
- glViewport(0, 0, width, height);
- glfwSetKeyCallback(window, key_callback);
- float r = 0.4, g = 0.5, b = 0.4, rv = 0.001, gv = 0.001, bv = 0.001;
- GLuint VBO;
- glGenBuffers(1, &VBO);
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- //GLuint vertexShader, fragmentShader, shaderProgram;
- //initShaders(vertexShader, fragmentShader, shaderProgram);
- Shader ourShader("C:\\Users\\skich\\OpenGL\\Shaders\\vert.txt" , "C:\\Users\\skich\\OpenGL\\Shaders\\fragment.txt");
- glEnableVertexAttribArray(0);
- GLuint VAO;
- glGenVertexArrays(1, &VAO);
- GLuint EBO;
- glGenBuffers(1, &EBO);
- GLfloat vertices[] = {
- // Позиции // Цвета // Текстурные координаты
- 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // Верхний правый
- 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Нижний правый
- -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Нижний левый
- -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // Верхний левый
- };
- GLuint indices[] = { // Помните, что мы начинаем с 0!
- 0, 1, 3, // Первый треугольник
- 1, 2, 3 // Второй треугольник
- };
- GLfloat texCoords[] = {
- 0.0f, 0.0f, // Нижний левый угол
- 1.0f, 0.0f, // Нижний правый угол
- 0.5f, 1.0f // Верхняя центральная сторона
- };
- // 1. Привязываем VAO
- glBindVertexArray(VAO);
- // 2. Копируем наш массив вершин в буфер для OpenGL
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
- // 3. Устанавливаем указатели на вершинные атрибуты
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
- glEnableVertexAttribArray(2);
- //4. Отвязываем VAO
- glBindVertexArray(0);
- //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- while (!glfwWindowShouldClose(window))
- {
- GLfloat timeValue = glfwGetTime();
- GLfloat greenValue = (sin(timeValue) / 2) + 0.5;
- GLint vertexColorLocation = glGetUniformLocation(ourShader.Program, "ourColor");
- ourShader.Use();
- glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
- glfwPollEvents();
- glClearColor(r, g, b, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- //glUseProgram(shaderProgram);
- glBindTexture(GL_TEXTURE_2D, texture);
- glBindVertexArray(VAO);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
- glBindVertexArray(0);
- glBindTexture(GL_TEXTURE_2D, 0);
- glfwSwapBuffers(window);
- }
- glfwTerminate();
- return 0;
- }
- .....................................
- #version 330 core
- layout (location = 0) in vec3 position;
- layout (location = 1) in vec3 color;
- layout (location = 2) in vec2 texCoord;
- out vec3 ourColor;
- out vec2 TexCoord;
- void main()
- {
- gl_Position = vec4(position, 1.0f);
- ourColor = color;
- TexCoord = texCoord;
- }
- .....................................
- #version 330 core
- in vec3 ourColor;
- in vec2 TexCoord;
- out vec4 color;
- uniform sampler2D ourTexture;
- void main()
- {
- color = texture(ourTexture, TexCoord);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement