From 807ffae06b83d2185f5dc591fa2e39656c440ac7 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Sun, 15 Jan 2023 22:09:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BF=D0=B8=D1=8F=20=D1=81=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=2014?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/c_cpp_properties.json | 20 ++ .vscode/settings.json | 46 +++ .vscode/tasks.json | 32 +++ 15 | Bin 0 -> 930128 bytes Makefile | 101 +++++++ include/Buffers.h | 88 ++++++ include/Camera.h | 82 ++++++ include/Lights.h | 108 +++++++ include/Model.h | 99 +++++++ include/Scene.h | 35 +++ include/Shader.h | 30 ++ include/Texture.h | 83 ++++++ shaders/bulb.frag | 25 ++ shaders/bulb.vert | 20 ++ shaders/empty.frag | 6 + shaders/gshader.frag | 38 +++ shaders/gshader.vert | 30 ++ shaders/lighting.frag | 193 +++++++++++++ shaders/point_shadow.frag | 17 ++ shaders/point_shadow.geom | 38 +++ shaders/quad.vert | 11 + shaders/skybox.frag | 12 + shaders/skybox.vert | 17 ++ shaders/ssao.frag | 62 +++++ shaders/ssaoBlur.frag | 23 ++ shaders/sun_shadow.geom | 22 ++ shaders/sun_shadow.vert | 10 + src/Buffers.cpp | 196 +++++++++++++ src/Camera.cpp | 236 ++++++++++++++++ src/Lights.cpp | 375 +++++++++++++++++++++++++ src/Model.cpp | 478 +++++++++++++++++++++++++++++++ src/Scene.cpp | 222 +++++++++++++++ src/Shader.cpp | 154 ++++++++++ src/Texture.cpp | 374 +++++++++++++++++++++++++ src/main.cpp | 511 ++++++++++++++++++++++++++++++++++ 35 files changed, 3794 insertions(+) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100755 15 create mode 100644 Makefile create mode 100644 include/Buffers.h create mode 100644 include/Camera.h create mode 100644 include/Lights.h create mode 100644 include/Model.h create mode 100644 include/Scene.h create mode 100644 include/Shader.h create mode 100644 include/Texture.h create mode 100644 shaders/bulb.frag create mode 100644 shaders/bulb.vert create mode 100644 shaders/empty.frag create mode 100644 shaders/gshader.frag create mode 100644 shaders/gshader.vert create mode 100644 shaders/lighting.frag create mode 100644 shaders/point_shadow.frag create mode 100644 shaders/point_shadow.geom create mode 100644 shaders/quad.vert create mode 100644 shaders/skybox.frag create mode 100644 shaders/skybox.vert create mode 100644 shaders/ssao.frag create mode 100644 shaders/ssaoBlur.frag create mode 100644 shaders/sun_shadow.geom create mode 100644 shaders/sun_shadow.vert create mode 100644 src/Buffers.cpp create mode 100644 src/Camera.cpp create mode 100644 src/Lights.cpp create mode 100644 src/Model.cpp create mode 100644 src/Scene.cpp create mode 100644 src/Shader.cpp create mode 100644 src/Texture.cpp create mode 100755 src/main.cpp diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..04cf9c6 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,20 @@ +{ + "configurations": [ + { + "name": "some_name", + "includePath": [ + "${workspaceFolder}/include", + "${workspaceFolder}/../dependencies/GLFW/include", + "${workspaceFolder}/../dependencies/glad/include", + "${workspaceFolder}/../dependencies/glm", + "${workspaceFolder}/../dependencies/stb", + "${workspaceFolder}/../dependencies/tinyobjloader" + ], + "compilerPath": "C:/MinGW/bin/g++.exe", + "cStandard": "c11", + "cppStandard": "c++11", + "intelliSenseMode": "gcc-x86" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d7f31e6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,46 @@ +{ + "files.associations": { + "fstream": "cpp", + "iosfwd": "cpp", + "map": "cpp", + "atomic": "cpp", + "array": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "random": "cpp", + "string": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "initializer_list": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..f8939c6 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,32 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: make сборка", + "command": "make", + "args": [ + "${input:target}" + ], + "options": { + "cwd": "${workspaceRoot}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Задача создана отладчиком." + } + ], + "inputs": [ + { + "id": "target", + "description": "Цель сборки (all, list, clean)", + "default": "all", + "type": "promptString" + }, + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/15 b/15 new file mode 100755 index 0000000000000000000000000000000000000000..1cae17e0cb1bf363a2216875cc582abeac75ecc3 GIT binary patch literal 930128 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 z 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 + +#include + +// Объект массива вершин +class VAO +{ + public: + VAO(); // Создает VAO и активирует его + ~VAO(); // Уничтожает VAO + VAO(const VAO & copy); // Конструктор копирования + VAO& operator=(const VAO & other); // Оператор присваивания + + void use(); // Активация VAO + static void disable(); // Деактивация активного VAO + + private: + GLuint handler; // Дескриптор + static std::map handler_count; // Счетчик использований дескриптора +}; + +// Тип буфера +enum BUFFER_TYPE { VERTEX = GL_ARRAY_BUFFER + , ELEMENT = GL_ELEMENT_ARRAY_BUFFER + , UNIFORM = GL_UNIFORM_BUFFER + }; + +// Объект вершинного буфера +class BO +{ + public: + BO(BUFFER_TYPE type); // Создает пустой буфер заданного типа + BO(BUFFER_TYPE type, const void *data, int size); // Создает и загружает туда данные + ~BO(); // Уничтожает буфер + BO(const BO & copy); // Конструктор копирования + BO& operator=(const BO & other); // Оператор присваивания + + void load(const void *data, int size, GLuint mode = GL_STATIC_DRAW); // Загрузка данных в буфер + void use(); + + protected: + GLuint handler; // Дескриптор + BUFFER_TYPE type; // Тип буфера + private: + static std::map handler_count; // Счетчик использований дескриптора +}; + +// Объект uniform-буфера +class UBO : public BO +{ + public: + UBO(int size, int binding); // Создает пустой uniform-буфер заданного размера с автоматической привязкой + UBO(const void *data, int size, int binding); // Создает пустой uniform-буфер заданного размера с автоматической привязкой + + void rebind(int binding); // Перепривязка + void loadSub(const void *data, int size, int offset = 0); // Загрузка с отступом +}; + +// Объект буфера кадра +class FBO +{ + public: + FBO(GLuint *attachments = 0, int count = 0); // Создает буфер кадра с нужным числом прикреплений текстур + ~FBO(); // Уничтожение буфера + + void use(GLuint mode = GL_FRAMEBUFFER); // Активирует буфер кадра в заданном режиме + static void useDefault(GLuint mode = GL_FRAMEBUFFER); // Активирует базовый буфер в заданном режиме + void assignRenderBuffer(GLuint hander, GLuint attachment = GL_DEPTH_ATTACHMENT); // Привязка рендер буфера + protected: + GLuint handler; // Дескриптор +}; + +// Объект буфера рендера +class RBO +{ + public: + RBO(int w, int h, GLuint component = GL_DEPTH_COMPONENT); // Создает буфер рендера с заданными параметрами размеров и используемых компонент + ~RBO(); // Уничтожение буфера + + GLuint getHandler(); // Возвращает дескриптор буфера рендера + protected: + GLuint handler; // Дескриптор +}; + +#endif // BUFFERS_H diff --git a/include/Camera.h b/include/Camera.h new file mode 100644 index 0000000..2af7602 --- /dev/null +++ b/include/Camera.h @@ -0,0 +1,82 @@ +#ifndef CAMERA_H +#define CAMERA_H + +#include +#include +#include +#include + +#include "Model.h" + +// Ближняя граница области отсечения +#define CAMERA_NEAR 0.1f +// Дальняя граница области отсечения +#define CAMERA_FAR 100.0f +// Вектор, задающий верх для камеры +#define CAMERA_UP_VECTOR glm::vec3(0.0f, 1.0f, 0.0f) +// Вектор, задающий стандартный поворот углами Эйлера (в положительном направлении оси Z) +#define CAMERA_DEFAULT_ROTATION glm::vec3(0.0f, 180.0f, 0.0f) +// Стандартный угол обзора +#define CAMERA_FOVy 60.0f +// Стандартная чувствительность +#define CAMERA_DEFAULT_SENSIVITY 0.005f +// Количество каскадов для карт теней +#define CAMERA_CASCADE_COUNT 4 + +// Данные о дистанциях каскадов +extern const float camera_cascade_distances[]; // src/Camera.cpp + +// Данные о камере для шейдера +struct CameraData +{ + glm::mat4 projection; + glm::mat4 view; + glm::vec3 position; +}; + +// Класс камеры +class Camera : public Node +{ + public: + Camera(float aspect, const glm::vec3 &position = glm::vec3(0.0f), const glm::vec3 &initialRotation = CAMERA_DEFAULT_ROTATION, float fovy = CAMERA_FOVy); // Конструктор камеры с проекцией перспективы + Camera(float width, float height, const glm::vec3 &position = glm::vec3(0.0f), const glm::vec3 &initialRotation = CAMERA_DEFAULT_ROTATION); // Конструктор ортографической камеры + Camera(const Camera& copy); // Конструктор копирования камеры + Camera& operator=(const Camera& other); // Оператор присваивания + virtual ~Camera(); // Деструктор + + const glm::mat4& getVP(); // Возвращает ссылку на константную матрицу произведения матриц вида и проекции + const glm::mat4& getProjection(); // Возвращает ссылку на константную матрицу проекции + const glm::mat4& getView(); // Возвращает ссылку на константную матрицу вида + + void rotate(const glm::vec2 &xyOffset); // Поворачивает камеру на dx и dy пикселей с учетом чувствительности + + void setPerspective(float fov, float aspect); // Устанавливает заданную матрицу перспективы + void setOrtho(float width, float height); // Устанавливает заданную ортографическую матрицу + void setSensitivity(float sensitivity); // Изменяет чувствительность мыши + const float& getSensitivity() const; // Возвращает чувствительность мыши + + void use(); // Использование этой камеры как текущей + static Camera& current(); // Ссылка на текущую используемую камеру + + CameraData& getData(); // Данные о камере для шейдера + std::pair getProjCoords(); // Доступ к координатам с флагом изменения, описывающим пространство вида с пересчетом, если это требуется + protected: + Camera(const glm::vec3 &position, const glm::vec3 &initialRotation); // Защищенный (protected) конструктор камеры без перспективы + + glm::mat4 view; // Матрица вида + glm::mat4 projection; // Матрица проекции + glm::mat4 vp; // Матрица произведения вида и проекции + bool requiredRecalcVP; // Необходимость пересчета матрицы вида и проекции камеры + bool requiredRecalcCoords; // Необходимость пересчета точек, описывающих пространство камеры + glm::vec4 coords[CAMERA_CASCADE_COUNT][8]; // Координаты, описывающие пространство камеры + glm::mat4 cascade_proj[CAMERA_CASCADE_COUNT]; // Матрицы проекций каскадов + + float sensitivity; // Чувствительность мыши + + virtual void recalcMatrices(); // Метод пересчета матрицы вида и произведения Вида*Проекции по необходимости, должен сбрасывать флаг changed + + static Camera* p_current; // Указатель на текущую используемую камеру +}; + + +#endif // CAMERA_H \ No newline at end of file diff --git a/include/Lights.h b/include/Lights.h new file mode 100644 index 0000000..8b43506 --- /dev/null +++ b/include/Lights.h @@ -0,0 +1,108 @@ +#ifndef LIGHTS_H +#define LIGHTS_H + +#include + +#include "Model.h" +#include "Camera.h" + +// Максимальное число источников света +#define MAX_LIGHTS 64 +// Стандартное направление источника без поворота +#define DEFAULT_LIGHT_DIRECTION glm::vec4(0.0f, 0.0f, 1.0f, 0.0f) +// Максимальное число образцов для SSAO +#define MAX_SSAO 64 + +// Точечный источник света +struct LightData +{ + alignas(16) glm::vec3 position; // Позиция + alignas(16) glm::vec3 color; // Цвет + alignas(16) glm::vec3 attenuation; // Радиус действия источника, линейный и квадратичный коэф. угасания + alignas(16) glm::vec4 direction_angle; // Направление и половинный угол освещенности + alignas(16) glm::mat4 vp[6]; // Матрицы проекции и трансформации в пространство источника +}; + +// Источник света +class Light : public Node +{ + public: + static int getUBOsize(); // Возвращает размер буфера в байтах + static void upload(UBO& lights_data); // Загрузка данных в буфер + + static Light& getNew(); // Возвращает ссылку на новый источник света + void destroy(); // Уничтожает источник света + + static int getCount(); // Возвращает количество источников + const glm::vec3& c_color() const; // Константный доступ к цвету + glm::vec3& e_color(); // Неконстантная ссылка для изменений цвета + + const float& c_radius() const; // Константный доступ к радиусу + float& e_radius(); // Неконстантная ссылка для изменений радиуса + + const float& c_angle() const; // Константный доступ к углу освещенности + float& e_angle(); // Неконстантная ссылка для изменений угла освещенности + + static void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Рисование отладочных лампочек + private: + Light(); // Конструктор без параметров + Light(const Light& copy) = delete; // Конструктор копирования ОТКЛЮЧЕН + Light& operator=(const Light& other); // Оператор присваивания + virtual ~Light(); + + glm::vec3 color; // Цвет + float radius; // Радиус действия источника + float angle; // Угол полный освещенности + + int index; // Индекс в массиве отправки (может не совпадать с lights) для дефрагментированного доступа + static Light& findByIndex(GLuint index); // Возвращает ссылку на источник с нужным индексом + + bool uploadReq; // Необходимость загрузки в следствии изменений + void check_id(); // Проверка что не взаимодествуем с пустым источником + void toData(); // Преобразует информацию об источнике в структуру LightData + + virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed + void recalcVP(); // Пересчитывает по необходимости матрицу вида-проекции + + static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS) + static LightData data[MAX_LIGHTS]; // Массив данных по источникам света + static Light lights[MAX_LIGHTS]; // Массив источников-узлов сцены +}; + +// Класс направленного источника освещения +class Sun +{ + public: + static Sun& get(); // Доступ к синглтону + static void upload(UBO& sun_data); // Загрузка данных об источнике в буфер + + const glm::vec3& c_direction() const; // Константный доступ к направлению лучей источника + glm::vec3& e_direction(); // Неконстантная ссылка для изменений направления лучей источника + + const glm::vec3& c_color() const; // Константный доступ к цвету + glm::vec3& e_color(); // Неконстантная ссылка для изменений цвета + + private: + Sun(const glm::vec3 &direction = glm::vec3(0.0f, 1.0f, 0.0f), const glm::vec3 &color = glm::vec3(0.4f, 0.4f, 0.4f)); + + alignas(16) glm::vec3 direction; // Направление лучей источника + alignas(16) glm::vec3 color; // Цвет + alignas(16) glm::mat4 vp[CAMERA_CASCADE_COUNT]; // Матрица вида-проекции источника + + void recalcVP(); // Пересчитывает по необходимости матрицу вида-проекции + + static Sun instance; // Экземпляр синглтона + static bool uploadReq; // Необходимость загрузки в следствии изменений +}; + +// Данные для SSAO +struct SSAO_data +{ + float radius = 0.05f; + float bias = 0.025f; + int size = MAX_SSAO; + alignas(16) glm::vec2 scale; + glm::vec3 samples[MAX_SSAO]; +}; + +#endif // LIGHTS_H diff --git a/include/Model.h b/include/Model.h new file mode 100644 index 0000000..5016a30 --- /dev/null +++ b/include/Model.h @@ -0,0 +1,99 @@ +#ifndef MODEL_H +#define MODEL_H + +#include "Buffers.h" +#include "Texture.h" +#include "Shader.h" + +#include +#include +#include + +#include + +class Model genShpere(float radius, int sectorsCount, class Node* parent = NULL); // Генерирует сферу заданного радиуса с определенным количеством сегментов + +// Класс узла сцены +class Node +{ + public: + Node(Node* parent = NULL); // Конструктор с заданным родителем (по умолчанию NULL) + Node(const Node& copy); // Конструктор копирования + Node& operator=(const Node& other); // Оператор присваивания + virtual ~Node(); + + void setParent(Node * parent); // Устанавливает родителя для узла + + virtual const glm::mat4& getTransformMatrix(); // Возвращает матрицу трансформации модели + bool isChanged(); // Возвращает необходимость пересчета матрицы трансформации + + const glm::vec3& c_position() const; // Константный доступ к позиции + const glm::quat& c_rotation() const; // Константный доступ к повороту + const glm::vec3& c_scale() const; // Константный доступ к масштабированию + virtual glm::vec3& e_position(); // Неконстантная ссылка для изменений позиции + virtual glm::quat& e_rotation(); // Неконстантная ссылка для изменений поворота + virtual glm::vec3& e_scale(); // Неконстантная ссылка для изменений масштабирования + + Node* getParent(); // Возвращает указатель на родителя + const std::vector& getChildren() const; // Возвращает ссылку на вектор дочерних узлов + + protected: + Node *parent; // Родительский узел + std::vector children; // Узлы-потомки !Не должны указывать на NULL! + + glm::vec3 position; // позиция модели + glm::quat rotation; // поворот модели + glm::vec3 scale; // масштабирование модели + + bool changed; // Флаг необходимости пересчета матрицы трансформации + glm::mat4 transform; // Матрица трансформации модели + bool parent_changed; // Флаг изменений у родителя - необходимость пересчета итоговой трансформации + glm::mat4 result_transform; // Итоговая трансформация с учетом родительской + + virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed + void invalidateParent(); // Проход потомков в глубину с изменением флага parent_changed +}; + +// Материал модели +struct Material +{ + alignas(16) glm::vec3 ka; // коэф. фонового отражения (цвет фонового освещения) + alignas(16) glm::vec3 kd; // коэф. диффузного отражения (цвет объекта) + alignas(16) glm::vec3 ks; // коэф. зеркального блика + float p; // показатель глянцевости + // Значения по умолчанию + Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1) { }; +}; + +// Класс модели +class Model : public Node +{ + public: + Model(Node *parent = NULL); // Конструктор по умолчанию + Model(const Model& copy); // Конструктор копирования + Model& operator=(const Model& other); // Оператор присваивания + virtual ~Model(); + + void render(); // Вызов отрисовки без uniform-данных + void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки + + void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер + void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер + void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер + void load_normals(glm::vec3* normals, GLuint count); // Загрузка нормалей в буфер + void set_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов + void set_texture(Texture& texture); // Привязка текстуры к модели + + Material material; // Материал модели + private: + VAO vao; + BO vertex_vbo, index_vbo; // вершинный и индексный буферы + BO normals_vbo, texCoords_vbo; // буферы с нормалями и текстурными координатами + GLuint verteces_count; // Количество вершин + size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов + Texture texture_diffuse; // Диффузная текстура + Texture texture_ambient; // Текстура фонового освщения + Texture texture_specular; // Текстура зеркального отражения +}; + +#endif // MODEL_H diff --git a/include/Scene.h b/include/Scene.h new file mode 100644 index 0000000..c2ed12a --- /dev/null +++ b/include/Scene.h @@ -0,0 +1,35 @@ +#ifndef SCENE_H +#define SCENE_H + +#include "Model.h" +#include "Camera.h" + +#define DEFAULT_MTL_DIR "./" +class Scene loadOBJtoScene(const char* filename, const char* mtl_directory = DEFAULT_MTL_DIR, const char* texture_directory = DEFAULT_MTL_DIR); + +// Класс сцены +class Scene +{ + public: + Scene(); // Конструктор пустой сцены + Scene(const Scene ©); // Конструктор копирования + Scene& operator=(const Scene& other); // Оператор присваивания + + void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Рендер сцены + + Node root; // Корневой узел + + // Списки объектов, выступающих узлами + std::vector nodes; // Список пустых узлов + std::vector models; // Список моделей для рендера + std::vector cameras; // Список камер + + protected: + void rebuld_tree(const Scene& from); // Перестройка дерева после копирования или присваивания + template + void rebuild_Nodes_vector(T& nodes, const Scene& from); // Перестройка узлов выбранного списка + template + bool move_pointer(Node& for_node, const std::vector& from_nodes, std::vector& this_nodes); // Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному, возвращает признак замены +}; + +#endif // SCENE_H diff --git a/include/Shader.h b/include/Shader.h new file mode 100644 index 0000000..0562dd7 --- /dev/null +++ b/include/Shader.h @@ -0,0 +1,30 @@ +#ifndef SHADER_H +#define SHADER_H + +#include + +#include +#include + +// Класс шейдерной программы +class ShaderProgram +{ + public: + ShaderProgram(); + ShaderProgram(const ShaderProgram ©); + ~ShaderProgram(); + ShaderProgram& operator=(const ShaderProgram& other); + + void use(); // Использование шейдеров + void load(GLuint type, const char* filename); // Функция для загрузки шейдеров + void link(); // Формирование программы из загруженных шейдеров + GLuint getUniformLoc(const char* name); // Возвращает местоположение uniform-переменной + void bindUniformBlock(const char* name, int binding); // Привязка uniform-блока + void bindTextures(const char* textures_base_shader_names[], int count); // Инициализация текстур на шейдере + private: + GLuint program; // Дескриптор + static std::map handler_count; // Получение количества использований по дескриптору шейдера (Shared pointer) + std::map uniformLocations; // Местоположения uniform-переменных +}; + +#endif // SHADER_H \ No newline at end of file diff --git a/include/Texture.h b/include/Texture.h new file mode 100644 index 0000000..7aa2b6f --- /dev/null +++ b/include/Texture.h @@ -0,0 +1,83 @@ +#ifndef TEXTURE_H +#define TEXTURE_H + +#include + +#include +#include + +enum TexType { + TEX_DIFFUSE, + TEX_AMBIENT, + TEX_SPECULAR, + TEX_AVAILABLE_COUNT +}; + +// Абстрактный класс базовой текстуры +class BaseTexture +{ + public: + ~BaseTexture(); + virtual void use() = 0; // Привязка текстуры + static void disable(GLuint type); // Отвязка текстуры по типу + GLuint getType(); // Возвращает тип текстуры + void setType(GLuint type); // Задает тип текстуры + protected: + GLuint handler; // Дескриптор текстуры + GLuint type; // Тип текстуры, соответствует её слоту + static std::map filename_handler; // Получение дескриптора текстуры по её имени + static std::map handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer) +}; + +// Класс 2D текстуры +class Texture : public BaseTexture +{ + public: + Texture(GLuint type = TEX_AVAILABLE_COUNT, const std::string& filename = ""); // Загрузка текстуры с диска или использование "пустой" + Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере + Texture(GLuint width, GLuint height, void* data, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера без привязки к буферу с загрузкой пикселей по указателю + Texture(const Texture& other); // Конструктор копирования + + Texture& operator=(const Texture& other); // Оператор присваивания + + virtual void use(); // Привязка текстуры +}; + +// Класс 3D текстуры +class TextureArray : public BaseTexture +{ + public: + TextureArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере + TextureArray(const TextureArray& other); // Конструктор копирования + + TextureArray& operator=(const TextureArray& other); // Оператор присваивания + + virtual void use(); // Привязка текстуры +}; + +// Класс кубической текстуры +class TextureCube : public BaseTexture +{ + public: + TextureCube(GLuint type = TEX_AVAILABLE_COUNT, const std::string (&filename)[6] = {""}); // Загрузка текстуры с диска или использование "пустой" + TextureCube(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере + TextureCube(const TextureCube& other); // Конструктор копирования + + TextureCube& operator=(const TextureCube& other); // Оператор присваивания + + virtual void use(); // Привязка текстуры +}; + +// Класс 3D кубической текстуры +class TextureCubeArray : public BaseTexture +{ + public: + TextureCubeArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере + TextureCubeArray(const TextureCubeArray& other); // Конструктор копирования + + TextureCubeArray& operator=(const TextureCubeArray& other); // Оператор присваивания + + virtual void use(); // Привязка текстуры +}; + +#endif // TEXTURE_H diff --git a/shaders/bulb.frag b/shaders/bulb.frag new file mode 100644 index 0000000..d6aaf90 --- /dev/null +++ b/shaders/bulb.frag @@ -0,0 +1,25 @@ +#version 420 core + +layout(std140, binding = 1) uniform Material +{ + vec3 ka; + vec3 kd; + vec3 ks; + float p; +}; + +in vec3 pos_local; + +out vec4 color; + +uniform float angle; +uniform vec3 direction; + +void main() +{ + float cosA = dot(normalize(pos_local), normalize(direction)); + if (degrees(acos(cosA)) <= angle) + color = vec4(ka, 1); + else + discard; +} \ No newline at end of file diff --git a/shaders/bulb.vert b/shaders/bulb.vert new file mode 100644 index 0000000..e84ca7e --- /dev/null +++ b/shaders/bulb.vert @@ -0,0 +1,20 @@ +#version 420 core + +layout(location = 0) in vec3 pos; + +layout(std140, binding = 0) uniform Camera +{ + mat4 projection; + mat4 view; + vec3 position; +} camera; + +uniform mat4 model; + +out vec3 pos_local; + +void main() +{ + pos_local = pos; + gl_Position = camera.projection * camera.view * model * vec4(pos, 1.0); +} \ No newline at end of file diff --git a/shaders/empty.frag b/shaders/empty.frag new file mode 100644 index 0000000..0f8d755 --- /dev/null +++ b/shaders/empty.frag @@ -0,0 +1,6 @@ +#version 330 core + +void main() +{ + +} \ No newline at end of file diff --git a/shaders/gshader.frag b/shaders/gshader.frag new file mode 100644 index 0000000..4e35b24 --- /dev/null +++ b/shaders/gshader.frag @@ -0,0 +1,38 @@ +#version 420 core + +layout(std140, binding = 1) uniform Material +{ + vec3 ka; + vec3 kd; + vec3 ks; + float p; +}; + +layout (location = 0) out vec3 gPosition; +layout (location = 1) out vec3 gNormal; +layout (location = 2) out vec4 gDiffuseP; +layout (location = 3) out vec4 gAmbientSpecular; + +in vec3 vertex; // Позиция вершины в пространстве +in vec3 N; // Нормаль трансформированноая +in vec2 texCoord; // Текстурные координаты + +uniform sampler2D tex_diffuse; +uniform sampler2D tex_ambient; +uniform sampler2D tex_specular; + +void main() +{ + // Сохранение позиции фрагмента в G-буфере + gPosition = vertex; + // Сохранение нормали в G-буфере + gNormal = N; + // Сохранение диффузного цвета + gDiffuseP.rgb = texture(tex_diffuse, texCoord).rgb * kd; + // Сохранение глянцевости + gDiffuseP.a = p; + // Сохранение фоновой составляющей + gAmbientSpecular.rgb = texture(tex_ambient, texCoord).rgb * ka; + // Сохранение зеркальной составляющей + gAmbientSpecular.a = texture(tex_specular, texCoord).r * ks.r; +} \ No newline at end of file diff --git a/shaders/gshader.vert b/shaders/gshader.vert new file mode 100644 index 0000000..0d7ea72 --- /dev/null +++ b/shaders/gshader.vert @@ -0,0 +1,30 @@ +#version 420 core + +layout(location = 0) in vec3 pos; +layout(location = 1) in vec2 inTexCoord; +layout(location = 2) in vec3 normals; + +layout(std140, binding = 0) uniform Camera +{ + mat4 projection; + mat4 view; + vec3 position; +} camera; + +uniform mat4 model; + +out vec3 vertex; // Позиция вершины в пространстве +out vec3 N; // Нормаль трансформированноая +out vec2 texCoord; // Текстурные координаты + +void main() +{ + vec4 P = model * vec4(pos, 1.0); // трансформация вершины + vertex = P.xyz; + + N = normalize(mat3(model) * normals); // трансформация нормали + + texCoord = inTexCoord; // Текстурные координаты + + gl_Position = camera.projection * camera.view * P; +} \ No newline at end of file diff --git a/shaders/lighting.frag b/shaders/lighting.frag new file mode 100644 index 0000000..dfd4b76 --- /dev/null +++ b/shaders/lighting.frag @@ -0,0 +1,193 @@ +#version 420 core + +in vec2 texCoord; + +layout(std140, binding = 0) uniform Camera +{ + mat4 projection; + mat4 view; + vec3 position; +} camera; + +struct LightData +{ + vec3 position; + vec3 color; + vec3 attenuation; + vec4 direction_angle; + mat4 vp[6]; +}; + +layout(std140, binding = 2) uniform Light +{ + LightData data[64]; + int count; +} light_f; + +layout(std140, binding = 3) uniform Sun +{ + vec3 direction; + vec3 color; + mat4 vp[4]; +} sun; + +uniform float camera_cascade_distances[4]; // Размер массива должен соответствовать количеству каскадов + +uniform sampler2D gPosition; +uniform sampler2D gNormal; +uniform sampler2D gDiffuseP; +uniform sampler2D gAmbientSpecular; +uniform sampler2DArray sunShadowDepth; +uniform samplerCubeArray pointShadowDepth; +uniform sampler2D ssao; + +out vec4 color; + +void main() +{ + // Получим данные из текстур буфера + vec3 fragPos = texture(gPosition, texCoord).rgb; + vec3 N = texture(gNormal, texCoord).rgb; + vec3 kd = texture(gDiffuseP, texCoord).rgb; + vec3 ka = texture(gAmbientSpecular, texCoord).rgb; + float ks = texture(gAmbientSpecular, texCoord).a; + float p = texture(gDiffuseP, texCoord).a; + float ssao_value = texture(ssao, texCoord).r; + + // Переменные используемые в цикле: + vec3 L_vertex; // Данные об источнике относительно фрагмента + vec3 Cam_vertex = normalize(camera.position - fragPos); // Данные о камере относительно фрагмента + float diffuse; // Диффузная составляющая + vec3 H; // Вектор половины пути + float specular; // Зеркальная составляющая + float L_distance; // Расстояние от поверхности до источника + float attenuation; // Коэф. угасания + float acosA; // Косинус между вектором от поверхности к источнику и обратным направлением источника + float intensity; // Интенсивность для прожектора + vec3 fragPosLightSpace; // Фрагмент в пространстве источника + float shadowValue; // Значение затененности + vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0).xy; // Размер текселя текстуры теней + int x, y, z; // Счетчик для PCF + float pcfDepth; // Глубина PCF + float cubemap_offset = 0.05f; // Отступ в текстурных координатах для PCF + float cubemap_depth; // Дистанция между фрагментом и источником в диапазоне [0;1] + + vec4 fragPosCamSpace = camera.view * vec4(fragPos, 1); // Фрагмент в пространстве камеры + int cascade_index; // Индекс текущего каскада для вычисления теней + + // Определение индекса каскада в который попадает фрагмент (цикл на 1 меньше чем кол-во каскадов) + for (cascade_index = 0; cascade_index < 3; cascade_index++) + if (abs(fragPosCamSpace.z) < camera_cascade_distances[cascade_index]) + break; + + // Фоновая освещенность + color = vec4(ka, 1) * ssao_value; + + // Расчет солнца, если его цвет не черный + if (length(sun.color) > 0) + { + // Расположение фрагмента в координатах теневой карты + fragPosLightSpace = (sun.vp[cascade_index] * vec4(fragPos, 1.0)).xyz; + // Переход от [-1;1] к [0;1] + fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2; + // Сдвиг для решения проблемы акне + fragPosLightSpace.z -= max(0.05 * (1.0 - dot(N, sun.direction)), 0.005); + // Проверка PCF + shadowValue = 0.0; + for(x = -1; x <= 1; ++x) + { + for(y = -1; y <= 1; ++y) + { + pcfDepth = texture(sunShadowDepth, vec3(fragPosLightSpace.xy + vec2(x, y) * texelSize, cascade_index)).r; + shadowValue += fragPosLightSpace.z > pcfDepth ? 1.0 : 0.0; + } + } + shadowValue /= 9; + // Рассчитываем освещенность, если значение тени меньше 1 + if (shadowValue < 1.0) + { + // Данные об источнике относительно фрагмента + L_vertex = normalize(sun.direction); + // Диффузная составляющая + diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0 + + // Вектор половины пути + H = normalize(L_vertex + Cam_vertex); + // Зеркальная составляющая + specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p + // Результирующий цвет с учетом солнца + color += ( vec4(sun.color*kd*diffuse, 1) + + vec4(sun.color*ks*specular, 1) ) * (1.0 - shadowValue); + } + } + + // Цикл по источникам света + int i; + for (i = 0; i < light_f.count; i++) + { + // Обнулим значение тени + shadowValue = 0; + // Позиция фрагмента относительно источника + fragPosLightSpace = fragPos - light_f.data[i].position; + // Дистанция между фрагментом и источником в диапазоне [0;1] + cubemap_depth = length(fragPosLightSpace) / light_f.data[i].attenuation.r; + // Сдвиг для решения проблемы акне + cubemap_depth -= max(0.05 * (1.0 - dot(N, light_f.data[i].direction_angle.xyz)), 0.005); + for(x = -1; x <= 1; ++x) + { + for(y = -1; y <= 1; ++y) + { + for(z = -1; z <= 1; ++z) + { + // Значение из кубической текстуры с учетом источника (i) + pcfDepth = texture(pointShadowDepth, vec4(fragPosLightSpace + vec3(x, y, z)*cubemap_offset, i)).r; + if(cubemap_depth > pcfDepth) + shadowValue += 1.0; + } + } + } + shadowValue /= (27); + if (shadowValue < 1.0) + { + // Данные об источнике относительно фрагмента + L_vertex = light_f.data[i].position - fragPos; + + // Расстояние от поверхности до источника + L_distance = length(L_vertex); + + // Проверка на дистанцию + if (L_distance < light_f.data[i].attenuation.r) + { + // Нормирование вектора + L_vertex = normalize(L_vertex); + // арккосинус между вектором от поверхности к источнику и обратным направлением источника + acosA = degrees(acos(dot(-L_vertex, normalize(light_f.data[i].direction_angle.xyz)))); + // Если угол меньше угла источника или угол источника минимален, то считаем освещенность + if(acosA <= light_f.data[i].direction_angle.a) + { + // Диффузная составляющая + diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0 + + // Вектор половины пути + H = normalize(L_vertex + Cam_vertex); + // Зеркальная составляющая + specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p + + // Угасание с учетом расстояния + attenuation = 1 / (1 + light_f.data[i].attenuation[1] * L_distance + light_f.data[i].attenuation[2] * L_distance * L_distance); + + // Если источник - прожектор, то добавим смягчение + if (light_f.data[i].direction_angle.a < 180) + { + intensity = clamp((light_f.data[i].direction_angle.a - acosA) / 5, 0.0, 1.0); + diffuse *= intensity; + specular *= intensity; + } + + color += ( vec4(light_f.data[i].color*kd*diffuse * attenuation, 1) + + vec4(light_f.data[i].color*ks*specular * attenuation, 1) ) * (1.0 - shadowValue); + } + } + } + } +} \ No newline at end of file diff --git a/shaders/point_shadow.frag b/shaders/point_shadow.frag new file mode 100644 index 0000000..32b41d8 --- /dev/null +++ b/shaders/point_shadow.frag @@ -0,0 +1,17 @@ +#version 330 core + +in vec4 FragPos; +in vec3 lightPos; +in float radius; + +void main() +{ + // Расстояние между источником и фрагментом + float lightDistance = length(FragPos.xyz - lightPos); + + // Приведение к диапазону [0;1] + lightDistance = lightDistance / radius; + + // Замена значения глубины + gl_FragDepth = lightDistance; +} \ No newline at end of file diff --git a/shaders/point_shadow.geom b/shaders/point_shadow.geom new file mode 100644 index 0000000..c6e8115 --- /dev/null +++ b/shaders/point_shadow.geom @@ -0,0 +1,38 @@ +#version 420 core +layout (triangles, invocations = 6) in; // здесь invocations соответствует числу сторон кубической карты теней +layout (triangle_strip, max_vertices=18) out; // здесь max_vertices = 3 вершины * 6 вызовов на стороны куба + +struct LightData +{ + vec3 position; + vec3 color; + vec3 attenuation; + vec4 direction_angle; + mat4 vp[6]; +}; + +layout(std140, binding = 2) uniform Light +{ + LightData data[64]; + int count; +} light_g; + +uniform int light_i; + +out vec4 FragPos; +out vec3 lightPos; +out float radius; + +void main() +{ + for(int i = 0; i < 3; ++i) + { + FragPos = gl_in[i].gl_Position; + lightPos = light_g.data[light_i].position; + radius = light_g.data[light_i].attenuation.r; + gl_Position = light_g.data[light_i].vp[gl_InvocationID] * gl_in[i].gl_Position; + gl_Layer = gl_InvocationID + light_i*6; + EmitVertex(); + } + EndPrimitive(); +} \ No newline at end of file diff --git a/shaders/quad.vert b/shaders/quad.vert new file mode 100644 index 0000000..fb0683c --- /dev/null +++ b/shaders/quad.vert @@ -0,0 +1,11 @@ +#version 420 core + +layout(location = 0) in vec3 pos; + +out vec2 texCoord; + +void main() +{ + gl_Position = vec4(pos, 1.0); + texCoord = (pos.xy + vec2(1.0)) / 2; // Переход от [-1;1] к [0;1] +} \ No newline at end of file diff --git a/shaders/skybox.frag b/shaders/skybox.frag new file mode 100644 index 0000000..3ad7d0b --- /dev/null +++ b/shaders/skybox.frag @@ -0,0 +1,12 @@ +#version 330 core +out vec4 FragColor; + +in vec3 TexCoords; + +uniform samplerCube skybox; + +void main() +{ + FragColor = texture(skybox, TexCoords); + gl_FragDepth = 0.9999f; +} \ No newline at end of file diff --git a/shaders/skybox.vert b/shaders/skybox.vert new file mode 100644 index 0000000..d2fe73e --- /dev/null +++ b/shaders/skybox.vert @@ -0,0 +1,17 @@ +#version 420 core +layout (location = 0) in vec3 pos; + +out vec3 TexCoords; + +layout(std140, binding = 0) uniform Camera +{ + mat4 projection; + mat4 view; + vec3 position; +} camera; + +void main() +{ + TexCoords = pos; + gl_Position = camera.projection * mat4(mat3(camera.view)) * vec4(pos, 1.0); +} \ No newline at end of file diff --git a/shaders/ssao.frag b/shaders/ssao.frag new file mode 100644 index 0000000..548aab6 --- /dev/null +++ b/shaders/ssao.frag @@ -0,0 +1,62 @@ +#version 420 core + +in vec2 texCoord; + +out float occlusion; + +uniform sampler2D gPosition; +uniform sampler2D gNormal; +uniform sampler2D noise; + +layout(std140, binding = 0) uniform Camera +{ + mat4 projection; + mat4 view; + vec3 position; +} camera; + +layout(std140, binding = 3) uniform SSAO +{ + float radius; + float bias; + int size; + vec2 scale; + vec3 samples[64]; +} ssao; + +void main() +{ + // Получим информацию из текстур для данного фрагмента по текстурным координатам + vec3 fragPos = (camera.view * vec4(texture(gPosition, texCoord).xyz, 1)).xyz; + vec3 normal = normalize(texture(gNormal, texCoord).rgb); + vec3 randomVec = normalize(texture(noise, texCoord * ssao.scale).xyz); + // Расчет TBN матрицы + vec3 tangent = normalize(randomVec - normal * dot(randomVec, normal)); + vec3 bitangent = cross(normal, tangent); + mat3 TBN = mat3(tangent, bitangent, normal); + + float sampleDepth; // Значение глубины образца выборки + vec3 samplePos; // Выборка, ориентированная в пространстве вида камеры + vec4 sampleCoord; // Выборка, преобразованная к текстурным координатам + float rangeCheck; // Проверка диапазона + + // Проинициализируем значение счетчика и запустим цикл по выборкам + occlusion = 0; + for(int i = 0; i < ssao.size; i++) + { + samplePos = TBN * ssao.samples[i]; // в TBN-пространстве + samplePos = fragPos + samplePos * ssao.radius; // в пространстве вида камеры + + sampleCoord = camera.projection * vec4(samplePos, 1.0); + sampleCoord.xyz /= sampleCoord.w; // Деление на значение перспективы + sampleCoord.xyz = sampleCoord.xyz * 0.5 + 0.5; // Трансформация в диапазон [0.0; 1.0] + + // Получаем значение глубины по образцу выборки + sampleDepth = (camera.view * vec4(texture(gPosition, sampleCoord.xy).rgb, 1)).z; + + rangeCheck = smoothstep(0.0, 1.0, ssao.radius / abs(fragPos.z - sampleDepth)); + occlusion += (sampleDepth >= samplePos.z + ssao.bias ? 1.0 : 0.0) * rangeCheck; + } + + occlusion = 1 - (occlusion / ssao.size); +} diff --git a/shaders/ssaoBlur.frag b/shaders/ssaoBlur.frag new file mode 100644 index 0000000..dfc9571 --- /dev/null +++ b/shaders/ssaoBlur.frag @@ -0,0 +1,23 @@ +#version 330 core + +in vec2 texCoord; + +out float occlusion; + +uniform sampler2D ssao; + +void main() +{ + vec2 texelSize = 1.0 / vec2(textureSize(ssao, 0)); + vec2 offset; + occlusion = 0.0; + for (int x = -2; x < 2; x++) + { + for (int y = -2; y < 2; y++) + { + offset = vec2(x, y) * texelSize; + occlusion += texture(ssao, texCoord + offset).r; + } + } + occlusion = occlusion / (4.0 * 4.0); +} \ No newline at end of file diff --git a/shaders/sun_shadow.geom b/shaders/sun_shadow.geom new file mode 100644 index 0000000..4912b94 --- /dev/null +++ b/shaders/sun_shadow.geom @@ -0,0 +1,22 @@ +#version 420 core + +layout(triangles, invocations = 4) in; // здесь invocations должно соответствовать количеству каскадов +layout(triangle_strip, max_vertices = 3) out; + +layout(std140, binding = 3) uniform Sun +{ + vec3 direction; + vec3 color; + mat4 vp[4]; +} sun; + +void main() +{ + for (int i = 0; i < 3; ++i) + { + gl_Position = sun.vp[gl_InvocationID] * gl_in[i].gl_Position; + gl_Layer = gl_InvocationID; + EmitVertex(); + } + EndPrimitive(); +} \ No newline at end of file diff --git a/shaders/sun_shadow.vert b/shaders/sun_shadow.vert new file mode 100644 index 0000000..cbe3f11 --- /dev/null +++ b/shaders/sun_shadow.vert @@ -0,0 +1,10 @@ +#version 420 core + +layout (location = 0) in vec3 pos; + +uniform mat4 model; + +void main() +{ + gl_Position = model * vec4(pos, 1.0); +} diff --git a/src/Buffers.cpp b/src/Buffers.cpp new file mode 100644 index 0000000..c0acea7 --- /dev/null +++ b/src/Buffers.cpp @@ -0,0 +1,196 @@ +#include "Buffers.h" + +// Счетчики использований дескрипторов +std::map VAO::handler_count; +std::map BO::handler_count; + +// Создает VAO и активирует его +VAO::VAO() +{ + glGenVertexArrays(1, &handler); // Генерация одного объекта массива вершин + glBindVertexArray(handler); // Привязка для использования + handler_count[handler] = 1; // Инициализация счетчика для дескриптора +} + +// Уничтожает VAO +VAO::~VAO() +{ + // Если дескриптор никем не используется - освободим его + if (!--handler_count[handler]) + { + glDeleteVertexArrays(1, &handler); + handler_count.erase(handler); // Удаление из словаря + } +} + +// Конструктор копирования +VAO::VAO(const VAO & copy) : handler(copy.handler) +{ + handler_count[handler]++; +} + +// Оператор присваивания +VAO& VAO::operator=(const VAO & other) +{ + // Если это разные дескрипторы + if (handler != other.handler) + { // то следуюет удалить текущий перед заменой + this->~VAO(); + handler = other.handler; + handler_count[handler]++; + } + + return *this; +} + +// Активация VAO +void VAO::use() +{ + glBindVertexArray(handler); // Привязка VAO для использования +} + +// Деактивация активного VAO +void VAO::disable() +{ + glBindVertexArray(0); // Отключение VAO +} + +// Создает пустой буфер заданного типа +BO::BO(BUFFER_TYPE t) : type(t) +{ + glGenBuffers(1, &handler); // Генерация одного объекта буфера + handler_count[handler] = 1; + use(); // Привязка буфера +} + +// Создает и загружает туда данные +BO::BO(BUFFER_TYPE t, const void *data, int size) : BO(t) +{ + load(data, size); +} + +// Уничтожает буфер +BO::~BO() +{ + if (handler) // Если буфер был создан + { + // Если дескриптор никем не используется - освободим его + if (!--handler_count[handler]) + { + glDeleteBuffers(1, &handler); + handler_count.erase(handler); // Удаление из словаря + } + handler = 0; + } +} + +// Конструктор копирования +BO::BO(const BO & copy) : handler(copy.handler), type(copy.type) +{ + handler_count[handler]++; +} + +// Оператор присваивания +BO& BO::operator=(const BO & other) +{ + // Если это разные дескрипторы + if (handler != other.handler) + { // то следуюет удалить текущий перед заменой + this->~BO(); + handler = other.handler; + handler_count[handler]++; + } + // Изменим тип + type = other.type; + + return *this; +} + +// Загрузка вершин в буфер +void BO::load(const void *data, int size, GLuint mode) +{ + use(); // Привязка буфера + glBufferData(type, size, data, mode); +} + +void BO::use() +{ + glBindBuffer(type, handler); // Привязка элементного буфера +} + +// Создает пустой uniform-буфер заданного размера с автоматической привязкой +UBO::UBO(int size, int binding) : BO(UNIFORM, 0, size) +{ + rebind(binding); +} + +// Создает пустой uniform-буфер заданного размера с автоматической привязкой +UBO::UBO(const void *data, int size, int binding) : BO(UNIFORM, data, size) +{ + rebind(binding); +} + +// перепривязка +void UBO::rebind(int binding) +{ + glBindBufferBase(type, binding, handler); +} + +// Загрузка с отступом +void UBO::loadSub(const void *data, int size, int offset) +{ + use(); + glBufferSubData(type, offset, size, data); +} + +// Создает буфер кадра с нужным числом прикреплений текстур +FBO::FBO(GLuint *attachments, int count) +{ + glGenFramebuffers(1, &handler); + use(); + glDrawBuffers(count, attachments); +} + +// Уничтожение буфера +FBO::~FBO() +{ + glDeleteFramebuffers(1, &handler); +} + +// Активирует буфер кадра в заданном режиме +void FBO::use(GLuint mode) +{ + glBindFramebuffer(mode, handler); +} + +// Активирует базовый буфер в заданном режиме +void FBO::useDefault(GLuint mode) +{ + glBindFramebuffer(mode, 0); +} + +// Привязка рендер буфера +void FBO::assignRenderBuffer(GLuint hander, GLuint attachment) +{ + glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, hander); +} + +// Создает буфер рендера с заданными параметрами размеров и используемых компонент +RBO::RBO(int w, int h, GLuint component) +{ + glGenRenderbuffers(1, &handler); + glBindRenderbuffer(GL_RENDERBUFFER, handler); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h); +} + +// Уничтожение буфера +RBO::~RBO() +{ + glDeleteRenderbuffers(1, &handler); +} + +// Возвращает дескриптор буфера рендера +GLuint RBO::getHandler() +{ + return handler; +} diff --git a/src/Camera.cpp b/src/Camera.cpp new file mode 100644 index 0000000..52366b7 --- /dev/null +++ b/src/Camera.cpp @@ -0,0 +1,236 @@ +#include "Camera.h" + +// Указатель на текущую используемую камеру +Camera* Camera::p_current = NULL; + +// Границы каскадов +const float camera_cascade_distances[] = {CAMERA_NEAR, CAMERA_FAR / 50.0f, CAMERA_FAR / 10.0f, CAMERA_FAR / 3.0f, CAMERA_FAR}; + +// Защищенный (protected) конструктор камеры без перспективы +Camera::Camera(const glm::vec3 &pos, const glm::vec3 &initialRotation) +{ + sensitivity = CAMERA_DEFAULT_SENSIVITY; + position = pos; // задаем позицию + // Определяем начальный поворот + glm::quat rotationAroundX = glm::angleAxis( glm::radians(initialRotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); + glm::quat rotationAroundY = glm::angleAxis(-glm::radians(initialRotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); + glm::quat rotationAroundZ = glm::angleAxis( glm::radians(initialRotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + rotation = rotationAroundX * rotationAroundY * rotationAroundZ; + // Признак изменения + changed = true; +} + +// Конструктор камеры с проекцией перспективы +Camera::Camera(float aspect, const glm::vec3 &position, const glm::vec3 &initialRotation, float fovy) +: Camera(position, initialRotation) +{ + setPerspective(fovy, aspect); +} + +// Конструктор ортографической камеры +Camera::Camera(float width, float height, const glm::vec3 &position, const glm::vec3 &initialRotation) +: Camera(position, initialRotation) +{ + setOrtho(width, height); +} + +// Конструктор копирования камеры +Camera::Camera(const Camera& copy) +: projection(copy.projection), requiredRecalcVP(copy.requiredRecalcVP), sensitivity(copy.sensitivity) +{ + // Если у оригинала не было изменений - перепишем матрицу вида-проекции + if (!requiredRecalcVP) + vp = copy.vp; +} + +// Оператор присваивания +Camera& Camera::operator=(const Camera& other) +{ + projection = other.projection; + requiredRecalcVP = other.requiredRecalcVP; + sensitivity = other.sensitivity; + + // Если у оригинала не было изменений - перепишем матрицу вида-проекции + if (!requiredRecalcVP) + vp = other.vp; + + return *this; +} + +// Деструктор +Camera::~Camera() +{ + if (p_current == this) + p_current = NULL; +} + +// Возвращает ссылку на константную матрицу проекции +const glm::mat4& Camera::getProjection() +{ + return projection; +} + +// Возвращает ссылку на константную матрицу вида +const glm::mat4& Camera::getView() +{ + recalcMatrices(); + + return view; +} + +// Возвращает ссылку на константную матрицу вида +const glm::mat4& Camera::getVP() +{ + recalcMatrices(); + + return vp; +} + +// Устанавливает заданную матрицу перспективы +void Camera::setPerspective(float fovy, float aspect) +{ + projection = glm::perspective(glm::radians(fovy), aspect, CAMERA_NEAR, CAMERA_FAR); + requiredRecalcVP = true; + for (int cascade = 0; cascade < CAMERA_CASCADE_COUNT; cascade++) + cascade_proj[cascade] = glm::perspective(glm::radians(fovy), aspect, camera_cascade_distances[cascade], camera_cascade_distances[cascade+1]); +} + +// Устанавливает заданную ортографическую матрицу +void Camera::setOrtho(float width, float height) +{ + const float aspect = width / height; + projection = glm::ortho(-1.0f, 1.0f, -1.0f/aspect, 1.0f/aspect, CAMERA_NEAR, CAMERA_FAR); + requiredRecalcVP = true; + for (int cascade = 0; cascade < CAMERA_CASCADE_COUNT; cascade++) + cascade_proj[cascade] = glm::ortho(-1.0f, 1.0f, -1.0f/aspect, 1.0f/aspect, camera_cascade_distances[cascade], camera_cascade_distances[cascade+1]); + +} + +// Изменяет чувствительность мыши +void Camera::setSensitivity(float sens) +{ + sensitivity = sens; +} + +// Возвращает чувствительность мыши +const float& Camera::getSensitivity() const +{ + return sensitivity; +} + +// Метод пересчета матрицы вида и произведения Вида*Проекции по необходимости, должен сбрасывать флаг changed +void Camera::recalcMatrices() +{ + if (changed || parent_changed) + { + glm::vec3 _position = position; + glm::quat _rotation = rotation; + if (parent) // Если есть родитель + { + glm::mat4 normalized_transform = parent->getTransformMatrix(); + for (int i = 0; i < 3; i++) + { + glm::vec3 axis = glm::vec3(normalized_transform[i]); + normalized_transform[i] = glm::vec4(glm::normalize(axis), normalized_transform[i].w); + } + glm::vec4 tmp = normalized_transform * glm::vec4(_position, 1.0f); + tmp /= tmp.w; + _position = glm::vec3(tmp); + _rotation = glm::quat_cast(normalized_transform) * _rotation; + } + glm::mat4 rotationMatrix = glm::mat4_cast(glm::conjugate(_rotation)); + glm::mat4 translationMatrix = glm::translate(glm::mat4(1.0f), -_position); + view = rotationMatrix * translationMatrix; + requiredRecalcVP = true; + } + + Node::recalcMatrices(); + + if (requiredRecalcVP) + { + vp = projection * view; + requiredRecalcCoords = true; // Требуется пересчитать точки пространства камеры + requiredRecalcVP = false; // Изменения применены + } +} + +// Поворачивает камеру на dx и dy пикселей с учетом чувствительности +void Camera::rotate(const glm::vec2 &xyOffset) +{ + // xyOffset - сдвиги координат мыши, xyOffset.x означает поворот вокруг оси Y, а xyOffset.y - поворот вокруг оси X + + // Вращение вокруг оси Y + glm::quat qY = glm::angleAxis(-xyOffset.x * sensitivity, glm::vec3(0.0f, 1.0f, 0.0f)); + + // Вращение вокруг оси X + glm::quat qX = glm::angleAxis(xyOffset.y * sensitivity, glm::vec3(1.0f, 0.0f, 0.0f)); + + // Сначала применяем вращение вокруг Y, затем вокруг X + rotation = qY * rotation * qX; + + changed = true; + invalidateParent(); // Проход потомков в глубину с изменением флага parent_changed +} + +// Использование этой камеры как текущей +void Camera::use() +{ + p_current = this; +} + +// Ссылка на текущую используемую камеру +Camera& Camera::current() +{ + static Camera default_cam(800.0f/600.0f); + + if (!p_current) + return default_cam; + else + return *p_current; +} + +// Данные о камере для шейдера +CameraData& Camera::getData() +{ + static CameraData data; + data = {getProjection(), getView(), position}; + return data; +} + +// Доступ к координатам с флагом изменения, описывающим пространство вида с пересчетом, если это требуется +std::pair Camera::getProjCoords() +{ + const glm::mat4& cam_vp = getVP(); // Получение ссылки на матрицу вида-проекции с пересчетом, если требуется и активацией флага requiredRecalcCoords + bool changes = false; // Возвращаемое значение + + if (requiredRecalcCoords) + { + // Инверсия матрицы вида/проекции камеры + glm::mat4 inv = glm::inverse(cam_vp); + // Типовые точки, описывающие пространство + glm::vec4 typical_points[8] = { { 1, 1, 1,1} + , { 1, 1,-1,1} + , { 1,-1, 1,1} + , { 1,-1,-1,1} + , {-1, 1, 1,1} + , {-1, 1,-1,1} + , {-1,-1, 1,1} + , {-1,-1,-1,1}}; + + for (int cascade = 0; cascade < CAMERA_CASCADE_COUNT; cascade++) + { + glm::mat4 inv = glm::inverse(cascade_proj[cascade] * getView()); + // Цикл по типовым точкам + for (int i = 0; i < 8; i++) + { + coords[cascade][i] = inv * typical_points[i]; + coords[cascade][i] /= coords[cascade][i].w; + } + } + + requiredRecalcCoords = false; // Сбрасываем флаг + changes = true; + } + + return std::make_pair(changes, coords); +} diff --git a/src/Lights.cpp b/src/Lights.cpp new file mode 100644 index 0000000..b7f9309 --- /dev/null +++ b/src/Lights.cpp @@ -0,0 +1,375 @@ +#include "Lights.h" + +#include "Scene.h" // Для отладочного вывода лампочек + +#include + +GLuint Light::count = 0; // количество используемых источников (должно быть <= MAX_LIGHTS) +LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света +Light Light::lights[MAX_LIGHTS]; // Массив источников-узлов сцены + +Sun Sun::instance; // Экземпляр синглтона +bool Sun::uploadReq = true; // Необходимость загрузки в следствии изменений + +// возвращает размер буфера в байтах +int Light::getUBOsize() +{ + return sizeof(LightData) * MAX_LIGHTS + sizeof(GLuint); +} + +// Загрузка данных в буфер +void Light::upload(UBO& lights_data) +{ + GLuint LightDataSize = sizeof(LightData); // Одного экземпляра структуры LightData + int first = MAX_LIGHTS, last = -1; // Начало и конец диапазона загрузки источников + static GLuint prev_count = -1; // Кол-во источников в прошлую посылку + + if (count) + { + for (int i = 0; i < MAX_LIGHTS; i++) + { + lights[i].recalcMatrices(); // Пересчитаем матрицы по необходимости (проверка внутри метода) + + // Если требуется загрузка + if (lights[i].uploadReq) + { + lights[i].toData(); // Перевод ноды в данные для шейдера + + // Определение диапазона загрузки + if (first > lights[i].index) + first = lights[i].index; + if (last < lights[i].index) + last = lights[i].index; + + lights[i].uploadReq = false; // Сброс флага + } + } + + // Если есть что загрузить (определен диапазон) + if (last > -1) + lights_data.loadSub(data + first, LightDataSize*(last - first +1), LightDataSize*(first)); // Загрузка данных об источниках + } + + // Если кол-во изменилось + if (prev_count != count) + { + prev_count = count; + + // Загружаем кол-во источников + lights_data.loadSub(&count, sizeof(count), LightDataSize*MAX_LIGHTS); + } +} + +// Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed +void Light::recalcMatrices() +{ + // Если были изменения - необходимо загрузить данные + if (changed || parent_changed) + uploadReq = true; + + // Выполняем вычисление матриц методом родительского класса + Node::recalcMatrices(); +} + +// Константный доступ к цвету +const glm::vec3& Light::c_color() const +{ + return color; +} + +// Неконстантная ссылка для изменений цвета +glm::vec3& Light::e_color() +{ + uploadReq = true; + + return color; +} + +// Проверка что не взаимодествуем с пустым источником +void Light::check_id() +{ + if (index < 0 + || index >= count) + throw std::runtime_error("Попытка использовать ссылку на пустой или некорректный источник"); +} + +// Преобразует информацию об источнике в структуру LightData +void Light::toData() +{ + check_id(); // Проверка на работу с корректным индексом + + // Если позиция изменилась + if (data[index].position.x != result_transform[3].x + || data[index].position.y != result_transform[3].y + || data[index].position.z != result_transform[3].z + ) + { + data[index].position = glm::vec3(result_transform[3]); // Позиция из матрицы трансформации + recalcVP(); // Пересчет матрицы вида-проекции для расчета теней + } + data[index].color = color; // Цвет + // Если радиус изменился + if (data[index].attenuation.r != radius) + { + data[index].attenuation.r = radius; // Радиус действия источника + data[index].attenuation[1] = 4.5/radius; // Линейный коэф. угасания + data[index].attenuation[2] = 4 * data[index].attenuation[1] * data[index].attenuation[1]; // Квадратичный коэф. угасания + } + // Направление и угол источника + data[index].direction_angle = glm::vec4( glm::normalize(glm::vec3(result_transform * DEFAULT_LIGHT_DIRECTION)) + , angle / 2 // Половинный угол для вычислений на шейдере + ); +} + +// Возвращает ссылку на новый источник света +Light& Light::getNew() +{ + Light& refNew = findByIndex(-1); + + refNew.index = count++; + refNew.uploadReq = true; + + return refNew; +} + +// Уничтожает источник света +void Light::destroy() +{ + check_id(); // Проверка на работу с корректным индексом + // Если удаляемый элемент не последний + if (count-1 != index) + { + // Найдем элемент для замены + Light& replace = findByIndex(--count); + + replace.uploadReq = true; // Требуется загрузить данные + replace.index = index; // Заменяем индекс данных + } + + operator=(Light()); // Обнулим источник путем замены на новый +} + +// Возвращает ссылку на источник с нужным индексом +Light& Light::findByIndex(GLuint index) +{ + // Если нет источников - возвращаем нулевой + if (!count) + return lights[0]; + + // Цикл по перебору источников + for (int i = 0; i < MAX_LIGHTS; i++) + if (lights[i].index == index) + return lights[i]; + + throw std::runtime_error("Запрашиваемый источник освещения не найден, либо достигнут лимит"); +} + +// Конструктор без параметров +Light::Light() : Node(), index(-1), uploadReq(false), color(1.0f), radius(10.0f), angle(360.0f) +{ + +} + +// Оператор присваивания +Light& Light::operator=(const Light& other) +{ + // Проверка на самоприсваивание + if (this != &other) + { + index = other.index; // Переносим индекс + uploadReq = other.uploadReq; // Необходимость загрузки + color = other.color; + radius = other.radius; + angle = other.angle; + + Node::operator=(other); + } + return *this; +} + +Light::~Light() +{ + +} + +// Рисование отладочных лампочек +void Light::render(ShaderProgram &shaderProgram, UBO &material_buffer) +{ + // Загрузка модели лампочки при первом вызове функции + static Scene bulb = loadOBJtoScene("../resources/models/bulb.obj", "../resources/models/", "../resources/textures/"); + static Model sphere = genShpere(1, 16, &bulb.root); + + GLuint angle_uniform = shaderProgram.getUniformLoc("angle"); + GLuint direction_uniform = shaderProgram.getUniformLoc("direction"); + + // Цикл по источникам света + for (int i = 0; i < count; i++) + { + // Загрузим направление + glUniform3fv(direction_uniform, 1, &data[i].direction_angle.x); + // Угол для лампочки = 180 (рисуем целую модель) + glUniform1f(angle_uniform, 180); // Зададим параметры материала сфере действия + + // Сдвиг на позицию источника + bulb.root.e_position() = data[i].position; + sphere.e_scale() = glm::vec3(data[i].attenuation.r); // Масштабирование сферы + // Задание цвета + bulb.models[0].material.ka = sphere.material.ka = data[i].color; + + // Вызов отрисовки + bulb.render(shaderProgram, material_buffer); + + // Угол для сферы (рисуем направленный конус) + glUniform1f(angle_uniform, data[i].direction_angle.a); + + // Рисование сферы покрытия источника в режиме линий + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + sphere.render(shaderProgram, material_buffer); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } +} + +// Константный доступ к радиусу +const float& Light::c_radius() const +{ + return radius; +} + +// Неконстантная ссылка для изменений радиуса +float& Light::e_radius() +{ + uploadReq = true; + + return radius; +} + +// Константный доступ к углу освещенности +const float& Light::c_angle() const +{ + return angle; +} + +// Неконстантная ссылка для изменений угла освещенности +float& Light::e_angle() +{ + uploadReq = true; + + return angle; +} + +// Конструктор направленного источника с параметрами направления и цвета +Sun::Sun(const glm::vec3 &dir, const glm::vec3 &c) : direction(dir), color(c) +{ + +} + +// Доступ к синглтону +Sun& Sun::get() +{ + return instance; +} + +// Загрузка данных об источнике на шейдер +void Sun::upload(UBO& sun_data) +{ + instance.recalcVP(); // Пересчет матрицы вида-проекции источника по необходимости (влияет на флаг uploadReq) + + if (uploadReq) + { + sun_data.loadSub(&instance, sizeof(instance)); + + uploadReq = false; + } +} + +// Константный доступ к направлению лучей источника +const glm::vec3& Sun::c_direction() const +{ + return instance.direction; +} + +// Неконстантная ссылка для изменений направления лучей источника +glm::vec3& Sun::e_direction() +{ + uploadReq = true; + + return instance.direction; +} + +// Константный доступ к цвету +const glm::vec3& Sun::c_color() const +{ + return instance.color; +} + +// Неконстантная ссылка для изменений цвета +glm::vec3& Sun::e_color() +{ + uploadReq = true; + + return instance.color; +} + +// Пересчитывает по необходимости матрицу вида-проекции +void Sun::recalcVP() +{ + // Точки по краям проекции камеры + std::pair camProjCoords = Camera::current().getProjCoords(); + + // Есть изменения по источнику или камере + if (uploadReq || camProjCoords.first) + { + uploadReq = true; // Требуется загрузка в следствии пересчета матрицы + + glm::vec3 mean; // Среднее арифметическое + glm::vec4 max, min; // макс и мин координаты + glm::vec4 point; // Точка приведенная в пространство источника света + + + for (int cascade = 0; cascade < CAMERA_CASCADE_COUNT; cascade++) + { + mean = glm::vec3(0); + // Найдем среднее арифметическое от точек для нахождения центра прямоугольника + for (int i = 0; i < 8; i++) + mean += glm::vec3(camProjCoords.second[cascade][i]); + mean /= 8; + // Используем среднее арифметическое для получения матрицы вида параллельного источника + glm::mat4 lightView = glm::lookAt(mean + glm::normalize(direction), mean, CAMERA_UP_VECTOR); + + // Примем первую точку как минимальную и максимальную (приведя в пространство вида источника) + min = max = lightView * camProjCoords.second[cascade][0]; + // Для оставшихся точек + for (int i = 1; i < 8; i++) + { + // Приведем в пространство вида источника + point = lightView * camProjCoords.second[cascade][i]; + max = glm::max(max, point); + min = glm::min(min, point); + } + + // Максимальное значение глубины + max.z = std::max(fabs(max.z), fabs(min.z)); + // На основании максимальных и минимальных координат создадим матрицу проекции источника + vp[cascade] = glm::ortho(min.x, max.x, min.y, max.y, min.z, max.z) * lightView; + } + } +} + +// Пересчитывает по необходимости матрицу вида-проекции +void Light::recalcVP() +{ + float near_plane = 0.1f; + glm::mat4 shadowProj = glm::perspective(glm::radians(90.0f), 1.0f, near_plane, radius); + data[index].vp[0] = shadowProj * glm::lookAt(position, position + glm::vec3( 1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)); + data[index].vp[1] = shadowProj * glm::lookAt(position, position + glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)); + data[index].vp[2] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)); + data[index].vp[3] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f)); + data[index].vp[4] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f)); + data[index].vp[5] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f)); +} + +// Возвращает количество источников +int Light::getCount() +{ + return count; +} \ No newline at end of file diff --git a/src/Model.cpp b/src/Model.cpp new file mode 100644 index 0000000..70c55e7 --- /dev/null +++ b/src/Model.cpp @@ -0,0 +1,478 @@ +#include "Model.h" + +#include + +// Конструктор с заданным родителем (по умолчанию NULL) +Node::Node(Node* parent_) : parent(parent_), result_transform(1), parent_changed(false), +position(0), rotation(1.0f, 0.0f, 0.0f, 0.0f), scale(1), changed(false), transform(1) +{ + if (parent) + { + // Запишем себя в потомки + parent->children.push_back(this); + parent_changed = true; + } +} + +// Конструктор копирования +Node::Node(const Node& copy): position(copy.position), rotation(copy.position), scale(copy.scale), +parent(copy.parent), parent_changed(copy.parent_changed), transform(1), result_transform(1) +{ + // Запишем себя в потомки + if (parent) + parent->children.push_back(this); + // Если у оригинала не было изменений - перепишем матрицу трансформации + if (!changed) + transform = copy.transform; + // Если у родителя не было изменений для оригинала - перепишем результирующую матрицу трансформации + if (!parent_changed) + result_transform = copy.result_transform; +} + +Node::~Node() +{ + setParent(NULL); // Удаляем себя из потомков + // Сообщаем потомкам об удалении родителя + for (Node* child : children) + child->setParent(NULL); +} + +// Возвращает необходимость пересчета матрицы трансформации +bool Node::isChanged() +{ + return changed; +} + +// Константный доступ к позиции +const glm::vec3& Node::c_position() const +{ + return position; +} + +// Константный доступ к повороту +const glm::quat& Node::c_rotation() const +{ + return rotation; +} + +// Константный доступ к масштабированию +const glm::vec3& Node::c_scale() const +{ + return scale; +} + +// Неконстантная ссылка для изменений позиции +glm::vec3& Node::e_position() +{ + changed = true; // Флаг о изменении + invalidateParent(); // Проход потомков в глубину с изменением флага parent_changed + return position; +} + +// Неконстантная ссылка для изменений поворота +glm::quat& Node::e_rotation() +{ + changed = true; // Флаг о изменении + invalidateParent(); // Проход потомков в глубину с изменением флага parent_changed + return rotation; +} + +// Неконстантная ссылка для изменений масштабирования +glm::vec3& Node::e_scale() +{ + changed = true; // Флаг о изменении + invalidateParent(); // Проход потомков в глубину с изменением флага parent_changed + return scale; +} + +// Возвращает матрицу трансформации модели +const glm::mat4& Node::getTransformMatrix() +{ + // Если требуется - пересчитаем матрицу + recalcMatrices(); + + return result_transform; +} + +// Пересчет матрицы трансформации модели, если это требуется +void Node::recalcMatrices() +{ + // Если было изменение по векторам позиции, поворота и масштабирования + if (changed) + { + transform = glm::mat4(1.0f); + // Перемещение модели + transform = glm::translate(transform, position); + // Поворот модели + transform = transform * glm::mat4_cast(rotation); + // Масштабирование + transform = glm::scale(transform, scale); + } + + // Если собственная или родительская матрицы менялись - необходимо пересчитать итоговую + if (changed || parent_changed) + { + if (parent) // Если есть родитель + result_transform = parent->getTransformMatrix() * transform; + else // Если нет родителя + result_transform = transform; + + parent_changed = changed = false; // Изменения применены + } +} + +// Проход потомков в глубину с изменением флага parent_changed +void Node::invalidateParent() +{ + // Цикл по потомкам + for (Node* child : children) + { + child->parent_changed = true; // Флаг + child->invalidateParent(); // Рекурсивный вызов для потомков выбранного потомка + } +} + +// Устанавливает родителя для узла +void Node::setParent(Node * parent) +{ + // Если замена происходит на другого родителя + if (parent != this->parent) + { + Node* tmp = parent; + // Проверка на зацикливание об самого себя + while (tmp) + { + if (tmp == this) + return; // Можно выдать exception + tmp = tmp->parent; + } + // Если есть старый родитель - удалим себя из его потомков + if (this->parent) + { + // Поиск в списке родительских потомков + auto position = std::find(this->parent->children.begin(), this->parent->children.end(), this); + // Если итератор указывает в конец - ничего не найдено + if (position != this->parent->children.end()) + this->parent->children.erase(position); // Само удаление + } + + this->parent = parent; // Заменяем указатель на родителя + // Если родитель не NULL - добавляем себя в детей + if (parent) + parent->children.push_back(this); + // В любом случае необходимо пересчитать собственную итоговую матрицу + parent_changed = true; + } +} + +// Возвращает указатель на родителя +Node* Node::getParent() +{ + return parent; +} + +// Возвращает ссылку на вектор дочерних узлов +const std::vector& Node::getChildren() const +{ + return children; +} + +// Оператор присваивания +Node& Node::operator=(const Node& other) +{ + position = other.position; + rotation = other.rotation; + scale = other.scale; + changed = other.changed; + + if (!changed) + transform = other.transform; + + setParent(other.parent); + + // Если у other флаг parent_changed == false, то можно переписать матрицу результата с него + if (!other.parent_changed) + { + result_transform = other.result_transform; + parent_changed = false; // Сбрасываем флаг после смены родителя + } + + return *this; +} + +// Конструктор по умолчанию +Model::Model(Node *parent) : Node(parent), verteces_count(0), first_index_byteOffset(0), indices_count(0), +vertex_vbo(VERTEX), index_vbo(ELEMENT), normals_vbo(VERTEX), texCoords_vbo(VERTEX) +{ + +} + +// Конструктор копирования +Model::Model(const Model& copy) : Node(copy), +vao(copy.vao), +verteces_count(copy.verteces_count), first_index_byteOffset(copy.first_index_byteOffset), indices_count(copy.indices_count), +vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), normals_vbo(copy.normals_vbo), texCoords_vbo(copy.texCoords_vbo), +texture_diffuse(copy.texture_diffuse), texture_ambient(copy.texture_ambient), texture_specular(copy.texture_specular), +material(copy.material) +{ + +} + +// Оператор присваивания +Model& Model::operator=(const Model& other) +{ + Node::operator=(other); // Явный вызов родительского оператора копирования + + vao = other.vao; + verteces_count = other.verteces_count; + first_index_byteOffset = other.first_index_byteOffset; + indices_count = other.indices_count; + + vertex_vbo = other.vertex_vbo; + index_vbo = other.index_vbo; + texCoords_vbo = other.texCoords_vbo; + + texture_diffuse = other.texture_diffuse; + texture_ambient = other.texture_ambient; + texture_specular = other.texture_specular; + + material = other.material; + + return *this; +} + +Model::~Model() +{ + +} + +// Вызов отрисовки без uniform-данных +void Model::render() +{ + // Подключаем VAO + vao.use(); + // Если есть индексы - рисуем с их использованием + if (indices_count) + { + index_vbo.use(); + glDrawElements(GL_TRIANGLES, indices_count, GL_UNSIGNED_INT, (void*)(first_index_byteOffset)); + } + // Если есть вершины - рисуем на основании массива вершин + else if (verteces_count) + glDrawArrays(GL_TRIANGLES, 0, verteces_count); +} + +// Вызов отрисовки +void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer) +{ + // Расчитаем матрицу трансформации + glUniformMatrix4fv(shaderProgram.getUniformLoc("model"), 1, GL_FALSE, &this->getTransformMatrix()[0][0]); + + // Подключаем текстуры + texture_diffuse.use(); + texture_ambient.use(); + texture_specular.use(); + + + // Загружаем данные о материале + material_buffer.load(&material, sizeof(material)); + + render(); +} + +// Функция для конфигурации атрибута вершинного буфера +void vertex_attrib_config() +{ + // Включаем необходимый атрибут у выбранного VAO + glEnableVertexAttribArray(0); + // Устанавливаем связь между VAO и привязанным VBO + glVertexAttribPointer( 0 // индекс атрибута, должен совпадать с Layout шейдера + , 3 // количество компонент одного элемента + , GL_FLOAT // тип + , GL_FALSE // нормализованность значений + , 0 // шаг + , (void *)0 // отступ с начала массива + ); +} + +// Загрузка вершин в буфер +void Model::load_verteces(glm::vec3* verteces, GLuint count) +{ + // Подключаем VAO и вершинный буфер + vao.use(); + vertex_vbo.use(); + + // Загрузка вершин в память буфера + vertex_vbo.load(verteces, sizeof(glm::vec3)*count); + vertex_attrib_config(); + // Запоминаем количество вершин для отрисовки + verteces_count = count; +} + +// Загрузка индексов в буфер +void Model::load_indices(GLuint* indices, GLuint count) +{ + // Подключаем VAO и индексный буфер + vao.use(); + index_vbo.use(); + + // Загрузка вершин в память буфера + index_vbo.load(indices, sizeof(GLuint)*count); + // Запоминаем количество вершин для отрисовки + indices_count = count; +} + +// Функция для конфигурации атрибута вершинного буфера +void texCoords_attrib_config() +{ + // Включаем необходимый атрибут у выбранного VAO + glEnableVertexAttribArray(1); + // Устанавливаем связь между VAO и привязанным VBO + glVertexAttribPointer( 1 // индекс атрибута, должен совпадать с Layout шейдера + , 2 // количество компонент одного элемента + , GL_FLOAT // тип + , GL_FALSE // нормализованность значений + , 0 // шаг + , (void *)0 // отступ с начала массива + ); +} + +// Загрузка текстурных координат в буфер +void Model::load_texCoords(glm::vec2* texCoords, GLuint count) +{ + // Подключаем VAO + vao.use(); + + texCoords_vbo.use(); + + // Загрузка вершин в память буфера + texCoords_vbo.load(texCoords, sizeof(glm::vec2)*count); + texCoords_attrib_config(); +} + +// Функция для конфигурации атрибута вершинного буфера +void normals_attrib_config() +{ + // Включаем необходимый атрибут у выбранного VAO + glEnableVertexAttribArray(2); + // Устанавливаем связь между VAO и привязанным VBO + glVertexAttribPointer( 2 // индекс атрибута, должен совпадать с Layout шейдера + , 3 // количество компонент одного элемента + , GL_FLOAT // тип + , GL_FALSE // нормализованность значений + , 0 // шаг + , (void *)0 // отступ с начала массива + ); +} + +// Загрузка нормалей в буфер +void Model::load_normals(glm::vec3* normals, GLuint count) +{ + // Подключаем VAO + vao.use(); + + normals_vbo.use(); + + // Загрузка вершин в память буфера + normals_vbo.load(normals, sizeof(glm::vec3)*count); + normals_attrib_config(); +} + +// Ограничение диапазона из буфера индексов +void Model::set_index_range(size_t first_byteOffset, size_t count) +{ + first_index_byteOffset = first_byteOffset; + indices_count = count; +} + +// Привязка текстуры к модели +void Model::set_texture(Texture& texture) +{ + GLuint type = texture.getType(); + switch(type) + { + case TEX_DIFFUSE: + texture_diffuse = texture; + break; + case TEX_AMBIENT: + texture_ambient = texture; + break; + case TEX_SPECULAR: + texture_specular = texture; + break; + }; +} + +// Генерирует сферу заданного радиуса с определенным количеством сегментов +Model genShpere(float radius, int sectorsCount, Node* parent) +{ + Model result(parent); + + std::vector vertices; + std::vector normals; + std::vector indices; + + float x, y, z, xy; // Позиция вершины + float nx, ny, nz, lengthInv = 1.0f / radius; // Нормаль вершины + float PI = 3.14159265; + float sectorStep = PI / sectorsCount; // Шаг сектора + float longAngle, latAngle; // Углы + + for(int i = 0; i <= sectorsCount; ++i) + { + latAngle = PI / 2 - i * sectorStep; // Начиная с pi/2 до -pi/2 + xy = radius * cos(latAngle); // r * cos(lat) + z = radius * sin(latAngle); // r * sin(lat) + + // добавляем (sectorCount+1) вершин на сегмент + // Последняя и первая вершины имеют одинаковые нормали и координаты + for(int j = 0; j <= sectorsCount; ++j) + { + longAngle = j * 2 * sectorStep; // Начиная с 0 до 2*pi + + // Положение вершины (x, y, z) + x = xy * cos(longAngle); // r * cos(lat) * cos(long) + y = xy * sin(longAngle); // r * cos(lat) * sin(long) + vertices.push_back({x, y, z}); + + // Нормали (nx, ny, nz) + nx = x * lengthInv; + ny = y * lengthInv; + nz = z * lengthInv; + normals.push_back({nx, ny, nz}); + } + } + int k1, k2; + for(int i = 0; i < sectorsCount; ++i) + { + k1 = i * (sectorsCount + 1); // начало текущего сегмента + k2 = k1 + sectorsCount + 1; // начало следующего сегмента + + for(int j = 0; j < sectorsCount; ++j, ++k1, ++k2) + { + // 2 треугольника на один сегмент + // k1, k2, k1+1 + if(i != 0) + { + indices.push_back(k1); + indices.push_back(k2); + indices.push_back(k1 + 1); + } + + // k1+1, k2, k2+1 + if(i != (sectorsCount-1)) + { + indices.push_back(k1 + 1); + indices.push_back(k2); + indices.push_back(k2 + 1); + } + + } + } + // Загрузка в модель + result.load_verteces(&vertices[0], vertices.size()); + result.load_normals(&normals[0], normals.size()); + result.load_indices(&indices[0], indices.size()); + + return result; +} diff --git a/src/Scene.cpp b/src/Scene.cpp new file mode 100644 index 0000000..299d1b4 --- /dev/null +++ b/src/Scene.cpp @@ -0,0 +1,222 @@ +#include "Scene.h" + +// Конструктор пустой сцены +Scene::Scene() +{ + +} + +// Конструктор копирования +Scene::Scene(const Scene ©): root(copy.root), +nodes(copy.nodes), models(copy.models), cameras(copy.cameras) +{ + rebuld_tree(copy); +} + +// Оператор присваивания +Scene& Scene::operator=(const Scene& other) +{ + root = other.root; + nodes = other.nodes; + models = other.models; + cameras = other.cameras; + + rebuld_tree(other); + + return *this; +} + +// Рендер сцены +void Scene::render(ShaderProgram &shaderProgram, UBO &material_buffer) +{ + for (auto & model : models) + model.render(shaderProgram, material_buffer); +} + +// Перестройка узлов выбранного списка +template +void Scene::rebuild_Nodes_vector(T& nodes, const Scene& from) +{ + for (int i = 0; i < nodes.size(); i++) + { + // Берем родителя, который указывает на оригинальный объект + Node* parent = nodes[i].getParent(); + + // Если родитель - оригинальный корневой узел, то меняем на собственный корневой узел + if (parent == &from.root) + { + nodes[i].setParent(&root); + continue; + } + + // Если наши родителя - меняем на него + if (move_pointer(nodes[i], from.nodes, this->nodes)) + continue; + if (move_pointer(nodes[i], from.models, models)) + continue; + if (move_pointer(nodes[i], from.cameras, cameras)) + continue; + + // Не нашли родителя - значит он не часть этой сцены + // и изменений по нему не требуется + } +} + +// Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному, возвращает признак замены +template +bool Scene::move_pointer(Node& for_node, const std::vector& from_nodes, std::vector& this_nodes) +{ + // Определим отступ в памяти + std::ptrdiff_t offset = (T*)for_node.getParent() - from_nodes.data(); + // Если отступ является частью оригинального списка + if (offset >= 0 && offset < from_nodes.size()) + { + for_node.setParent(this_nodes.data() + offset); // Замена родителя + return true; + } + return false; +} + +// Перестройка дерева после копирования или присваивания +void Scene::rebuld_tree(const Scene& from) +{ + // Восстановим родителей в пустых узлах для копии + rebuild_Nodes_vector(nodes, from); + rebuild_Nodes_vector(models, from); + rebuild_Nodes_vector(cameras, from); +} + +#define TINYOBJLOADER_IMPLEMENTATION +#include "tiny_obj_loader.h" + +#include + +inline void hash_combine(std::size_t& seed) { } + +template +inline void hash_combine(std::size_t& seed, const T& v, Rest... rest) { + std::hash hasher; + seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2); + hash_combine(seed, rest...); +} + +Scene loadOBJtoScene(const char* filename, const char* mtl_directory, const char* texture_directory) +{ + Scene result; + Model model; + // Все модели образованные на основании этой модели будут иметь общего родителя + model.setParent(&result.root); + + tinyobj::attrib_t attrib; + std::vector shapes; + std::vector materials; + + std::string err; + + // Если в процессе загрузки возникли ошибки - выдадим исключение + if (!tinyobj::LoadObj(&attrib, &shapes, &materials, &err, filename, mtl_directory)) + throw std::runtime_error(err); + + std::vector indices; // индексы модели + std::vector verteces; // вершины + std::vector normals; // нормали + std::vector texCords; // текстурные координаты + size_t hash; // Для уникальных вершин + std::map uniqueVerteces; // словарь для уникальных вершин: ключ - хеш, значение - индекс вершины + + int last_material_index = 0; // индекс последнего материала (для группировки моделей) + int count = 0, offset; // для индексов начала и конца в индексном буфере + std::vector materials_range; // хранилище индексов + std::vector materials_ids; // индексы материалов + + materials_range.push_back(count); // Закидываем начало отрезка в индексном буфере + // Цикл по считанным моделям + for (const auto& shape : shapes) + { + offset = count; // Переменная для + last_material_index = shape.mesh.material_ids[(count - offset)/3]; // Запоминаем индекс материала + + // Цикл по индексам модели + for (const auto& index : shape.mesh.indices) + { + hash = 0; + hash_combine( hash + , attrib.vertices[3 * index.vertex_index + 0], attrib.vertices[3 * index.vertex_index + 1], attrib.vertices[3 * index.vertex_index + 2] + , attrib.normals[3 * index.normal_index + 0], attrib.normals[3 * index.normal_index + 1], attrib.normals[3 * index.normal_index + 2] + , attrib.texcoords[2 * index.texcoord_index + 0], attrib.texcoords[2 * index.texcoord_index + 1]); + + if (!uniqueVerteces.count(hash)) + { + uniqueVerteces[hash] = verteces.size(); + + // группируем вершины в массив на основании индексов + verteces.push_back({ attrib.vertices[3 * index.vertex_index + 0] + , attrib.vertices[3 * index.vertex_index + 1] + , attrib.vertices[3 * index.vertex_index + 2] + }); + // группируем нормали в массив на основании индексов + normals.push_back({ attrib.normals[3 * index.normal_index + 0] + , attrib.normals[3 * index.normal_index + 1] + , attrib.normals[3 * index.normal_index + 2] + }); + // группируем текстурные координаты в массив на основании индексов + texCords.push_back({ attrib.texcoords[2 * index.texcoord_index + 0] + , 1-attrib.texcoords[2 * index.texcoord_index + 1] + }); + } + // Сохраняем индекс в массив + indices.push_back(uniqueVerteces[hash]); + + // Если индекс последнего материала изменился, то необходимо сохранить его + if (last_material_index != shape.mesh.material_ids[(count - offset)/3]) + { + materials_range.push_back(count); // как конец отрезка + materials_ids.push_back(last_material_index); // как используемый материал + last_material_index = shape.mesh.material_ids[(count - offset)/3]; + } + count++; + } // for (const auto& index : shape.mesh.indices) + + // Если последний материал не загружен - загружаем его + if (materials_range[materials_range.size()-1] != count-1) + { + materials_range.push_back(count); // последний конец отрезка + materials_ids.push_back(last_material_index); // последний используемый материал + } + } // for (const auto& shape : shapes) + + + + // Загрузка в буферы + model.load_verteces (&verteces[0], verteces.size()); + model.load_normals (&normals[0], normals.size()); + model.load_texCoords(&texCords[0], texCords.size()); + // Загрузка индексного буфера + model.load_indices (&indices[0], indices.size()); + + + // Создаем копии модели, которые будут рендериться в заданном диапазоне + // И присваиваем текстуры копиям на основании материала + for (int i = 0; i < materials_range.size()-1; i++) + { + result.models.push_back(model); // Создание копии с общим VAO + auto s = --result.models.end(); + s->set_index_range(materials_range[i]*sizeof(GLuint), materials_range[i+1]-materials_range[i]); + + // Текстуры + Texture diffuse(TEX_DIFFUSE, texture_directory + materials[materials_ids[i]].diffuse_texname); + s->set_texture(diffuse); + Texture ambient(TEX_AMBIENT, texture_directory + materials[materials_ids[i]].ambient_texname); + s->set_texture(ambient); + Texture specular(TEX_SPECULAR, texture_directory + materials[materials_ids[i]].specular_texname); + s->set_texture(specular); + + // Материал + s->material.ka = glm::vec3(materials[materials_ids[i]].ambient[0], materials[materials_ids[i]].ambient[1], materials[materials_ids[i]].ambient[2]); + s->material.kd = glm::vec3(materials[materials_ids[i]].diffuse[0], materials[materials_ids[i]].diffuse[1], materials[materials_ids[i]].diffuse[2]); + s->material.ks = glm::vec3(materials[materials_ids[i]].specular[0], materials[materials_ids[i]].specular[1], materials[materials_ids[i]].specular[2]); + s->material.p = (materials[materials_ids[i]].shininess > 0.0f) ? 1000.0f / materials[materials_ids[i]].shininess : 1000.0f; + } + + return result; +} diff --git a/src/Shader.cpp b/src/Shader.cpp new file mode 100644 index 0000000..ad9b1a8 --- /dev/null +++ b/src/Shader.cpp @@ -0,0 +1,154 @@ +#include "Shader.h" + +#include +#include +#include + +std::map ShaderProgram::handler_count; // Получение количества использований по дескриптору ШП (Shared pointer) + +ShaderProgram::ShaderProgram() +{ + program = glCreateProgram(); + handler_count[program] = 1; +} + +ShaderProgram::ShaderProgram(const ShaderProgram ©) : program(copy.program) +{ + handler_count[program]++; +} + +ShaderProgram::~ShaderProgram() +{ + if (!--handler_count[program]) // Если количество ссылок = 0 + { + // Удаление шейдерной программы + glDeleteProgram(program); + } +} + +// Оператор присваивания +ShaderProgram& ShaderProgram::operator=(const ShaderProgram& other) +{ + // Если это разные шейдерные программы + if (program != other.program) + { + this->~ShaderProgram(); // Уничтожаем имеющуюся + // Заменяем новой + program = other.program; + handler_count[program]++; + } + return *this; +} + +// Использование шейдеров +void ShaderProgram::use() +{ + glUseProgram(program); +} + +// Функция чтения шейдера из файла +std::string readFile(const char* filename) +{ + std::string text; + std::ifstream file(filename, std::ios::in); // Открываем файл на чтение + // Если файл доступен и успешно открыт + if (file.is_open()) + { + std::stringstream sstr; // Буфер для чтения + sstr << file.rdbuf(); // Считываем файл + text = sstr.str(); // Преобразуем буфер к строке + file.close(); // Закрываем файл + } + + return text; +} + +// Функция для загрузки шейдеров +void ShaderProgram::load(GLuint type, const char* filename) +{ + // Создание дескрипторов шейдера + GLuint handler = glCreateShader(type); + + // Переменные под результат компиляции + GLint result = GL_FALSE; + int infoLogLength; + + // Считываем текст вершинного шейдера + std::string code = readFile(filename); + const char* pointer = code.c_str(); // Преобразование к указателю на const char, так как функция принимает массив си-строк + + // Компиляция кода вершинного шейдера + glShaderSource(handler, 1, &pointer, NULL); + glCompileShader(handler); + + // Проверка результата компиляции + glGetShaderiv(handler, GL_COMPILE_STATUS, &result); + glGetShaderiv(handler, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) + { + char* errorMessage = new char[infoLogLength + 1]; + glGetShaderInfoLog(handler, infoLogLength, NULL, errorMessage); + std::cout << errorMessage; + delete errorMessage; + } + + // Привязка скомпилированного шейдера + glAttachShader(program, handler); + + // Освобождение дескриптора шейдера + glDeleteShader(handler); +} + +// Формирование программы из загруженных шейдеров +void ShaderProgram::link() +{ + // Переменные под результат компиляции + GLint result = GL_FALSE; + int infoLogLength; + + // Формирование программы из привязанных шейдеров + glLinkProgram(program); + + // Проверка программы + glGetProgramiv(program, GL_LINK_STATUS, &result); + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) + { + char* errorMessage = new char[infoLogLength + 1]; + glGetProgramInfoLog(program, infoLogLength, NULL, errorMessage); + std::cout << errorMessage; + delete errorMessage; + } + + // Используем шейдерную программу объекта из которого вызван метод + this->use(); +} + +// Возвращает местоположение uniform-переменной +GLuint ShaderProgram::getUniformLoc(const char* name) +{ + GLuint result; // Результат + // Если такую переменную ещё не искали - найдем, иначе вернем уже известный дескриптор + if (!uniformLocations.count(name)) + uniformLocations[name] = result = glGetUniformLocation(program, name); + else + result = uniformLocations[name]; + + return result; +} + +// Привязка uniform-блока +void ShaderProgram::bindUniformBlock(const char* name, int binding) +{ + glUniformBlockBinding( program + , glGetUniformBlockIndex(program, name) + , binding); +} + +// Инициализация текстур на шейдере +void ShaderProgram::bindTextures(const char* textures_base_shader_names[], int count) +{ + // Цикл по всем доступным текстурам + for (int i = 0; i < count; i++) + glUniform1i(getUniformLoc(textures_base_shader_names[i]), i); +} diff --git a/src/Texture.cpp b/src/Texture.cpp new file mode 100644 index 0000000..e02aa57 --- /dev/null +++ b/src/Texture.cpp @@ -0,0 +1,374 @@ +#include "Texture.h" + +#define STB_IMAGE_IMPLEMENTATION +#include + +std::map BaseTexture::filename_handler; // Получение дескриптора текстуры по её имени +std::map BaseTexture::handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer) + +// Загрузка текстуры с диска или использование "пустой" +Texture::Texture(GLuint t, const std::string& filename) +{ + type = t; + if (!filename_handler.count(filename)) + { + std::string empty = ""; + int width, height, channels; // Ширина, высота и цветовые каналы текстуры + unsigned char* image = stbi_load(filename.c_str(), &width, &height, &channels, STBI_default); // Загрузка в оперативную память изображения + // Если изображение успешно счиитано с диска или отсутствует пустая текстура + if (image || !filename_handler.count(empty)) + { + glActiveTexture(type + GL_TEXTURE0); + glGenTextures(1, &handler); // Генерация одной текстуры + glBindTexture(GL_TEXTURE_2D, handler); // Привязка текстуры как активной + + filename_handler[filename] = handler; // Запоминим её дескриптор для этого имени файла + handler_count[handler] = 0; // Создадим счетчик использований дескриптора, который будет изменен в конце + + // Если изображение успешно считано + if (image) + { + // Загрузка данных с учетом прозрачности + if (channels == 3) // RGB + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); + else if (channels == 4) // RGBA + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); + + glGenerateMipmap(GL_TEXTURE_2D); // Генерация мипмапа для активной текстуры + glBindTexture(GL_TEXTURE_2D, 0); // Отвязка активной текстуры + + stbi_image_free(image); // Освобождение оперативной памяти + } + // Иначе изображение не считано и надо создать пустую текстуру + else + { + image = new unsigned char[3] {255,255,255}; // RGB по 1 байту на + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, image); // Загрузка данных на видеокарту + delete image; // Освобождение оперативной памяти + + filename_handler[empty] = handler; // Запоминим дополнительно её дескриптор для NULL-строки + } + } + // Иначе используем существующую пустую текстуру (текстура не загружена, пустую создавать не нужно) + else + handler = filename_handler[empty]; + } + // Иначе используем уже существующую по имени файла + else + handler = filename_handler[filename]; + + handler_count[handler]++; +} + +// Конструктор текстуры заданного размера для использования в буфере +Texture::Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType, GLint internalformat, GLint format, GLenum dataType) +{ + type = texType; + // Генерация текстуры заданного размера + glGenTextures(1, &handler); + glBindTexture(GL_TEXTURE_2D, handler); + glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, dataType, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Привязка к буферу кадра + glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, handler, 0); + + // Создаем счетчик использований дескриптора + handler_count[handler] = 1; +} + +// Конструктор текстуры заданного размера без привязки к буферу с загрузкой пикселей по указателю +Texture::Texture(GLuint width, GLuint height, void* data, GLuint texType, GLint internalformat, GLint format, GLenum dataType) +{ + type = texType; + // Генерация текстуры заданного размера + glGenTextures(1, &handler); + glBindTexture(GL_TEXTURE_2D, handler); + glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, dataType, data); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Создаем счетчик использований дескриптора + handler_count[handler] = 1; +} + +// Конструктор копирования +Texture::Texture(const Texture& other) +{ + handler = other.handler; + type = other.type; + // Делаем копию и увеличиваем счетчик + handler_count[handler]++; +} + +// Оператор присваивания +Texture& Texture::operator=(const Texture& other) +{ + // Если это разные текстуры + if (handler != other.handler) + { + this->~Texture(); // Уничтожаем имеющуюся + // Заменяем новой + handler = other.handler; + handler_count[handler]++; + } + type = other.type; + + return *this; +} + +BaseTexture::~BaseTexture() +{ + if (!--handler_count[handler]) // Если количество ссылок = 0 + { + glDeleteTextures(1, &handler); // Удаление текстуры + // Удаление из словаря имен файлов и дескрипторов + for (auto it = filename_handler.begin(); it != filename_handler.end();) + { + if (it->second == handler) + it = filename_handler.erase(it); + else + it++; + } + } +} + +// Привязка текстуры +void Texture::use() +{ + glActiveTexture(type + GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, handler); // Привязка текстуры как активной +} + +// Отвязка текстуры по типу +void BaseTexture::disable(GLuint type) +{ + glActiveTexture(type + GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); // Отвязка текстуры +} + +// Возвращает тип текстуры +GLuint BaseTexture::getType() +{ + return type; +} + +// Задает тип текстуры +void BaseTexture::setType(GLuint type) +{ + this->type = type; +} + +// Конструктор текстуры заданного размера для использования в буфере +TextureArray::TextureArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType, GLint internalformat, GLint format, GLenum dataType) +{ + type = texType; + // Генерация текстуры заданного размера + glGenTextures(1, &handler); + glBindTexture(GL_TEXTURE_2D_ARRAY, handler); + glTexImage3D( + GL_TEXTURE_2D_ARRAY, 0, internalformat, width, height, levels, 0, format, dataType, 0); + + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Привязка к буферу кадра + glFramebufferTexture(GL_FRAMEBUFFER, attachment, handler, 0); + + // Создаем счетчик использований дескриптора + handler_count[handler] = 1; +} + +// Конструктор копирования +TextureArray::TextureArray(const TextureArray& other) +{ + handler = other.handler; + type = other.type; + // Делаем копию и увеличиваем счетчик + handler_count[handler]++; +} + +// Оператор присваивания +TextureArray& TextureArray::operator=(const TextureArray& other) +{ + // Если это разные текстуры + if (handler != other.handler) + { + this->~TextureArray(); // Уничтожаем имеющуюся + // Заменяем новой + handler = other.handler; + handler_count[handler]++; + } + type = other.type; + + return *this; +} + +// Привязка текстуры +void TextureArray::use() +{ + glActiveTexture(type + GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D_ARRAY, handler); // Привязка текстуры как активной +} + +// Загрузка текстуры с диска или использование "пустой" +TextureCube::TextureCube(GLuint t, const std::string (&filename)[6]) +{ + type = t; + std::string complex_name; + for (int i = 0; i < 6; i++) + complex_name += filename[i]; + if (!filename_handler.count(complex_name)) + { + std::string empty = ""; + int width, height, channels; // Ширина, высота и цветовые каналы текстуры + unsigned char* image; + + glActiveTexture(type + GL_TEXTURE0); + glGenTextures(1, &handler); // Генерация одной текстуры + glBindTexture(GL_TEXTURE_CUBE_MAP, handler); // Привязка текстуры как активной + + filename_handler[complex_name] = handler; // Запомним её дескриптор для этого имени файла + handler_count[handler] = 0; // Создадим счетчик использований дескриптора, который будет изменен в конце + + for (int i = 0; i < 6; i++) + { + image = stbi_load(filename[i].c_str(), &width, &height, &channels, STBI_default); // Загрузка в оперативную память изображения + + // Если изображение успешно считано + if (image) + { + // Загрузка данных с учетом прозрачности + if (channels == 3) // RGB + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); + else if (channels == 4) // RGBA + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); + + stbi_image_free(image); // Освобождение оперативной памяти + } + // Иначе изображение не считано и надо создать пустую текстуру + else + { + image = new unsigned char[3] {255,255,255}; // RGB по 1 байту на + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, image); // Загрузка данных на видеокарту + delete image; // Освобождение оперативной памяти + } + } + } + // Иначе используем уже существующую по имени файла + else + handler = filename_handler[complex_name]; + + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + handler_count[handler]++; +} + +// Конструктор текстуры заданного размера для использования в буфере +TextureCube::TextureCube(GLuint width, GLuint height, GLuint attachment, GLuint texType, GLint internalformat, GLint format, GLenum dataType) +{ + type = texType; + // Генерация текстуры заданного размера + glGenTextures(1, &handler); + glBindTexture(GL_TEXTURE_CUBE_MAP, handler); + for (int i = 0; i < 6; ++i) + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalformat, width, height, 0, format, dataType, 0); + + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Привязка к буферу кадра + glFramebufferTexture(GL_FRAMEBUFFER, attachment, handler, 0); + + // Создаем счетчик использований дескриптора + handler_count[handler] = 1; +} + +// Конструктор копирования +TextureCube::TextureCube(const TextureCube& other) +{ + handler = other.handler; + type = other.type; + // Делаем копию и увеличиваем счетчик + handler_count[handler]++; +} + +// Оператор присваивания +TextureCube& TextureCube::operator=(const TextureCube& other) +{ + // Если это разные текстуры + if (handler != other.handler) + { + this->~TextureCube(); // Уничтожаем имеющуюся + // Заменяем новой + handler = other.handler; + handler_count[handler]++; + } + type = other.type; + + return *this; +} + +// Привязка текстуры +void TextureCube::use() +{ + glActiveTexture(type + GL_TEXTURE0); + glBindTexture(GL_TEXTURE_CUBE_MAP, handler); // Привязка текстуры как активной +} + +// Конструктор текстуры заданного размера для использования в буфере +TextureCubeArray::TextureCubeArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType, GLint internalformat, GLint format, GLenum dataType) +{ + type = texType; + // Генерация текстуры заданного размера + glGenTextures(1, &handler); + glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, handler); + glTexImage3D( + GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat, width, height, 6*levels, 0, format, dataType, 0); + + glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Привязка к буферу кадра + glFramebufferTexture(GL_FRAMEBUFFER, attachment, handler, 0); + + // Создаем счетчик использований дескриптора + handler_count[handler] = 1; +} + +// Конструктор копирования +TextureCubeArray::TextureCubeArray(const TextureCubeArray& other) +{ + handler = other.handler; + type = other.type; + // Делаем копию и увеличиваем счетчик + handler_count[handler]++; +} + +// Оператор присваивания +TextureCubeArray& TextureCubeArray::operator=(const TextureCubeArray& other) +{ + // Если это разные текстуры + if (handler != other.handler) + { + this->~TextureCubeArray(); // Уничтожаем имеющуюся + // Заменяем новой + handler = other.handler; + handler_count[handler]++; + } + type = other.type; + + return *this; +} + +// Привязка текстуры +void TextureCubeArray::use() +{ + glActiveTexture(type + GL_TEXTURE0); + glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, handler); // Привязка текстуры как активной +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100755 index 0000000..21aefe9 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,511 @@ + +#include +#include +#include + +#include +#include + +#include "Scene.h" +#include "Shader.h" +#include "Lights.h" + +#define WINDOW_WIDTH 800 +#define WINDOW_HEIGHT 600 +#define WINDOW_CAPTION "OPENGL notes on rekovalev.site" + +// Функция-callback для изменения размеров буфера кадра в случае изменения размеров поверхности окна +void framebuffer_size_callback(GLFWwindow* window, int width, int height) +{ + glViewport(0, 0, width, height); +} + +bool firstMouse = true; +float lastX, lastY; + +void mouse_callback(GLFWwindow* window, double xpos, double ypos) +{ + if (firstMouse) + { + lastX = xpos; + lastY = ypos; + firstMouse = false; + } + + glm::vec2 offset(xpos - lastX, lastY - ypos); + lastX = xpos; + lastY = ypos; + + Camera::current().rotate(offset); +} + +int main(void) +{ + GLFWwindow* window; // Указатель на окно GLFW3 + + // Инициализация GLFW3 + if (!glfwInit()) + { + std::cout << "GLFW init error\n"; + return -1; + } + + // Завершение работы с GLFW3 перед выходом + atexit(glfwTerminate); + + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // Мажорная версия спецификаций OpenGL + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); // Минорная версия спецификаций OpenGL + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Контекст OpenGL, который поддерживает только основные функции + + // Создание окна GLFW3 с заданными шириной, высотой и заголовком окна + window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_CAPTION, NULL, NULL); + if (!window) + { + std::cout << "GLFW create window error\n"; + return -1; + } + + // Установка основного контекста окна + glfwMakeContextCurrent(window); + // Установка callback-функции для изменения размеров окна и буфера кадра + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + glfwSwapInterval(1); // Вертикальная синхронизация + + // Установка callback-функции для мыши и камеры + glfwSetCursorPosCallback(window, mouse_callback); + + // Загрузка функций OpenGL с помощью GLAD + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) + { + std::cout << "GLAD load GL error\n"; + return -1; + } + + // Включаем проверку по буферу глубины + glEnable(GL_DEPTH_TEST); + + // Шейдер для G-буфера + ShaderProgram gShader; + // Загрузка и компиляция шейдеров + gShader.load(GL_VERTEX_SHADER, "shaders/gshader.vert"); + gShader.load(GL_FRAGMENT_SHADER, "shaders/gshader.frag"); + gShader.link(); + // Установим значения текстур + const char* textures_base_shader_names[] = {"tex_diffuse", "tex_ambient", "tex_specular"}; + gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*)); + + // Загрузка сцены из obj файла + Scene scene = loadOBJtoScene("../resources/models/blob.obj", "../resources/models/", "../resources/textures/"); + scene.root.e_scale() = glm::vec3(0.01); + scene.root.e_position().z = 1; + scene.models[0].material.kd = {0.5,0.5,0.5}; + scene.models[0].material.ka = {0.2,0.2,0.2}; + + // Установка цвета очистки буфера цвета + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + // Сдвинем направленный источник света и камеру + Sun::get().e_direction().z = -1.0; + Camera::current().e_position().x = 0.3f; + + // Источники света + Light& first = Light::getNew(); + first.e_color() = {1.0f, 0.0f, 0.0f}; // цвет + first.e_position() = {0.3f, 0.0f, 0.6f}; // Позиция + first.e_angle() = 100.0f; + Light& second = Light::getNew(); + second.e_color() = {0.0f, 0.0f, 1.0f}; // цвет + second.e_position() = {-0.3f, 0.3f, 0.5f}; // Позиция + + // Uniform-буферы + UBO cameraUB(sizeof(CameraData), 0); + UBO material_data(sizeof(Material), 1); + UBO light_data(Light::getUBOsize(), 2); + UBO sun_data(sizeof(Sun), 3); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap + + // Создадим G-буфер с данными о используемых привязках + GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; + FBO gbuffer(attachments, sizeof(attachments) / sizeof(GLuint)); + // Создадим текстуры для буфера кадра + Texture gPosition(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 0, GL_RGB32F, GL_RGB); // Позиция вершины + Texture gNormal(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT1, 1, GL_RGB16F, GL_RGB); // Нормали + Texture gDiffuseP(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT2, 2, GL_RGBA16F); // Диффузная составляющая и коэф. глянцевости + Texture gAmbientSpecular(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT3, 3); // Фоновая составляющая и один канал зеркальной + // Создадим буфер рендера под буфер глубины и привяжем его + RBO grbo(WINDOW_WIDTH, WINDOW_HEIGHT); + gbuffer.assignRenderBuffer(grbo.getHandler()); + // Активируем базовый буфер кадра + FBO::useDefault(); + + // Шейдер для расчета освещенности + ShaderProgram lightShader; + // Загрузка и компиляция шейдеров + lightShader.load(GL_VERTEX_SHADER, "shaders/quad.vert"); + lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag"); + lightShader.link(); + // Привязка текстур + const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular", "sunShadowDepth", "pointShadowDepth", "ssao"}; + lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*)); + // Загрузка данных о границах каскадов + glUniform1fv(lightShader.getUniformLoc("camera_cascade_distances"), CAMERA_CASCADE_COUNT, &camera_cascade_distances[1]); + + glm::vec3 quadVertices[] = { {-1.0f, 1.0f, 0.0f} + , {-1.0f, -1.0f, 0.0f} + , { 1.0f, 1.0f, 0.0f} + , { 1.0f, -1.0f, 0.0f} + }; + + GLuint quadIndices[] = {0,1,2,2,1,3}; + + Model quadModel; + quadModel.load_verteces(quadVertices, 4); + quadModel.load_indices(quadIndices, 6); + + // Размер текстуры тени от солнца + const GLuint sunShadow_resolution = 1024; + // Создадим буфер кадра для рендера теней + FBO sunShadowBuffer; + // Создадим текстуры для буфера кадра + TextureArray sunShadowDepth(CAMERA_CASCADE_COUNT, sunShadow_resolution, sunShadow_resolution, GL_DEPTH_ATTACHMENT, 4, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT); + // Правка фантомных теней + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + float shadowBorderColor[] = { 1.0, 1.0, 1.0, 1.0 }; + glTexParameterfv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR, shadowBorderColor); + // Отключим работу с цветом + glDrawBuffer(GL_NONE); + glReadBuffer(GL_NONE); + // Активируем базовый буфер кадра + FBO::useDefault(); + + // Шейдер для расчета теней + ShaderProgram sunShadowShader; + // Загрузим шейдер + sunShadowShader.load(GL_VERTEX_SHADER, "shaders/sun_shadow.vert"); + sunShadowShader.load(GL_GEOMETRY_SHADER, "shaders/sun_shadow.geom"); + sunShadowShader.load(GL_FRAGMENT_SHADER, "shaders/empty.frag"); + sunShadowShader.link(); + + // Размер одной стороны кубической карты + const GLuint pointShadow_resolution = 500; + // Создадим буфер кадра для рендера теней от источников света + FBO pointShadowBuffer; + // Создадим текстуры для буфера кадра + TextureCubeArray pointShadowDepth(MAX_LIGHTS, pointShadow_resolution, pointShadow_resolution, GL_DEPTH_ATTACHMENT, 5, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT); + // Отключим работу с цветом + glDrawBuffer(GL_NONE); + glReadBuffer(GL_NONE); + // Активируем базовый буфер кадра + FBO::useDefault(); + + // Шейдер для расчета теней от точечных источников + ShaderProgram pointShadowShader; + // Загрузим шейдер + pointShadowShader.load(GL_VERTEX_SHADER, "shaders/sun_shadow.vert"); + pointShadowShader.load(GL_GEOMETRY_SHADER, "shaders/point_shadow.geom"); + pointShadowShader.load(GL_FRAGMENT_SHADER, "shaders/point_shadow.frag"); + pointShadowShader.link(); + + // Создадим буфер для вычисления SSAO + GLuint attachments_ssao[] = { GL_COLOR_ATTACHMENT0 }; + FBO ssaoBuffer(attachments_ssao, sizeof(attachments_ssao) / sizeof(GLuint)); + // Создадим текстуры для буфера кадра + Texture ssaoTexture_raw(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 0, GL_RED, GL_RED); + // Активируем базовый буфер кадра + FBO::useDefault(); + + // Стандартные параметры SSAO + SSAO_data ssao_data; + // Расчет масштабирования текстуры шума + ssao_data.scale = {WINDOW_WIDTH/4,WINDOW_HEIGHT/4}; + // Генерируем случайные векторы + std::uniform_real_distribution randomFloats(0.0, 1.0); // Генерирует случайные вещественные числа в заданном диапазоне + std::default_random_engine generator; + glm::vec3 sample; // Выборка + for (int i = 0; i < ssao_data.size; i++) + { + sample = { randomFloats(generator) * 2.0 - 1.0 + , randomFloats(generator) * 2.0 - 1.0 + , randomFloats(generator) + }; + sample = glm::normalize(sample); + sample *= randomFloats(generator); + + // Отмасштабируем выборку + sample *= 0.1 + 0.9 * (i / (float)ssao_data.size) * (i / (float)ssao_data.size); + ssao_data.samples[i] = sample; + } + // Загрузка данных в uniform-буфер + UBO ssaoUB(&ssao_data, sizeof(SSAO_data), 4); + + // Текстура шума + glm::vec3 noise_vecs[16]; + for (int i = 0; i < 16; i++) + noise_vecs[i] = { randomFloats(generator) * 2.0 - 1.0 + , randomFloats(generator) * 2.0 - 1.0 + , 0.0f + }; + Texture noiseTexture(4,4, noise_vecs, 2, GL_RGBA32F, GL_RGB); + + // Шейдер для расчета SSAO + ShaderProgram ssaoShader; + // Загрузим шейдер + ssaoShader.load(GL_VERTEX_SHADER, "shaders/quad.vert"); + ssaoShader.load(GL_FRAGMENT_SHADER, "shaders/ssao.frag"); + ssaoShader.link(); + // Текстуры, используемые в шейдере + const char* ssaoShader_names[] = {"gPosition", "gNormal", "noise"}; + ssaoShader.bindTextures(ssaoShader_names, sizeof(ssaoShader_names)/sizeof(const char*)); + + // Создадим буфер для размытия SSAO + FBO ssaoBlurBuffer(attachments_ssao, sizeof(attachments_ssao) / sizeof(GLuint)); + // Создадим текстуры для буфера кадра + Texture ssaoTexture(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 6, GL_RED, GL_RED); + // Активируем базовый буфер кадра + FBO::useDefault(); + + // Шейдер для размытия SSAO + ShaderProgram ssaoBlurShader; + // Загрузим шейдер + ssaoBlurShader.load(GL_VERTEX_SHADER, "shaders/quad.vert"); + ssaoBlurShader.load(GL_FRAGMENT_SHADER, "shaders/ssaoBlur.frag"); + ssaoBlurShader.link(); + + // Модель прямоугольника + Model rectangle; + + // Вершины прямоугольника + glm::vec3 rectangle_verticies[] = { {-0.5f, 0.0f, -0.5f} + , { 0.5f, 0.0f, -0.5f} + , { 0.5f, 0.0f, 0.5f} + , {-0.5f, 0.0f, 0.5f} + }; + // Загрузка вершин модели + rectangle.load_verteces(rectangle_verticies, sizeof(rectangle_verticies)/sizeof(glm::vec3)); + + // индексы вершин + GLuint rectangle_indices[] = {0, 1, 2, 2, 3, 0}; + // Загрузка индексов модели + rectangle.load_indices(rectangle_indices, sizeof(rectangle_indices)/sizeof(GLuint)); + + // Нормали + glm::vec3 rectangle_normals[] = { {0.0f, 1.0f, 0.0f} + , {0.0f, 1.0f, 0.0f} + , {0.0f, 1.0f, 0.0f} + , {0.0f, 1.0f, 0.0f} + }; + // Загрузка нормалей модели + rectangle.load_normals(rectangle_normals, sizeof(rectangle_normals)/sizeof(glm::vec3)); + + // Зададим горизонтальное положение перед камерой + rectangle.e_position().y = -1; + rectangle.e_position().z = 2; + rectangle.e_scale() = glm::vec3(4); + + // Параметры материала + rectangle.material.ka = {0.2, 0.2, 0.2}; + rectangle.material.kd = {0.9, 0.9, 0.9}; + + // Шейдер для рисования отладочных лампочек + ShaderProgram bulbShader; + // Загрузка и компиляция шейдеров + bulbShader.load(GL_VERTEX_SHADER, "shaders/bulb.vert"); + bulbShader.load(GL_FRAGMENT_SHADER, "shaders/bulb.frag"); + bulbShader.link(); + + // Вершины для скайбокса + glm::vec3 skybox_verticies[] = { + {-1.0f, 1.0f, -1.0f}, + {-1.0f, -1.0f, -1.0f}, + { 1.0f, -1.0f, -1.0f}, + { 1.0f, -1.0f, -1.0f}, + { 1.0f, 1.0f, -1.0f}, + {-1.0f, 1.0f, -1.0f}, + + {-1.0f, -1.0f, 1.0f}, + {-1.0f, -1.0f, -1.0f}, + {-1.0f, 1.0f, -1.0f}, + {-1.0f, 1.0f, -1.0f}, + {-1.0f, 1.0f, 1.0f}, + {-1.0f, -1.0f, 1.0f}, + + { 1.0f, -1.0f, -1.0f}, + { 1.0f, -1.0f, 1.0f}, + { 1.0f, 1.0f, 1.0f}, + { 1.0f, 1.0f, 1.0f}, + { 1.0f, 1.0f, -1.0f}, + { 1.0f, -1.0f, -1.0f}, + + {-1.0f, -1.0f, 1.0f}, + {-1.0f, 1.0f, 1.0f}, + { 1.0f, 1.0f, 1.0f}, + { 1.0f, 1.0f, 1.0f}, + { 1.0f, -1.0f, 1.0f}, + {-1.0f, -1.0f, 1.0f}, + + {-1.0f, 1.0f, -1.0f}, + { 1.0f, 1.0f, -1.0f}, + { 1.0f, 1.0f, 1.0f}, + { 1.0f, 1.0f, 1.0f}, + {-1.0f, 1.0f, 1.0f}, + {-1.0f, 1.0f, -1.0f}, + + {-1.0f, -1.0f, -1.0f}, + {-1.0f, -1.0f, 1.0f}, + { 1.0f, -1.0f, -1.0f}, + { 1.0f, -1.0f, -1.0f}, + {-1.0f, -1.0f, 1.0f}, + { 1.0f, -1.0f, 1.0f} + }; + // Модель скайбокса + Model skybox; + skybox.load_verteces(skybox_verticies, sizeof(skybox_verticies)/sizeof(glm::vec3)); + TextureCube skybox_texture(TEX_DIFFUSE, { "../resources/textures/skybox/px.jpg" + , "../resources/textures/skybox/nx.jpg" + , "../resources/textures/skybox/py.jpg" + , "../resources/textures/skybox/ny.jpg" + , "../resources/textures/skybox/pz.jpg" + , "../resources/textures/skybox/nz.jpg" + }); + + // Шейдер для скайбокса + ShaderProgram skyboxShader; + // Загрузим шейдеры + skyboxShader.load(GL_VERTEX_SHADER, "shaders/skybox.vert"); + skyboxShader.load(GL_FRAGMENT_SHADER, "shaders/skybox.frag"); + skyboxShader.link(); + // Привязка текстуры скайбокса + const char* skybox_shader_names[] = {"skybox"}; + skyboxShader.bindTextures(skybox_shader_names, sizeof(skybox_shader_names)/sizeof(const char*)); + + + // Пока не произойдет событие запроса закрытия окна + while(!glfwWindowShouldClose(window)) + { + // Загрузка данных о камере + cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData)); + // Загрузим информацию об источниках света + Light::upload(light_data); + // Загружаем информацию о направленном источнике + Sun::upload(sun_data); + + // Активируем G-кадра + gbuffer.use(); + // Используем шейдер с освещением + gShader.use(); + // Очистка буфера цвета и глубины + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Тут производится рендер + scene.render(gShader, material_data); + rectangle.render(gShader, material_data); + + // Активируем буфер SSAO + ssaoBuffer.use(); + // Используем шейдер для расчета SSAO + ssaoShader.use(); + // Очистка буфера цвета + glClear(GL_COLOR_BUFFER_BIT); + // Подключаем текстуры G-буфера + gPosition.use(); + gNormal.use(); + // Подключаем текстуру шума для SSAO + noiseTexture.use(); + // Рендерим прямоугольник + quadModel.render(); + + // Активируем буфер размытия SSAO + ssaoBlurBuffer.use(); + // Используем шейдер для размытия SSAO + ssaoBlurShader.use(); + // Очистка буфера цвета + glClear(GL_COLOR_BUFFER_BIT); + // Подключаем текстуру сырого SSAO + ssaoTexture_raw.use(); + // Рендерим прямоугольник + quadModel.render(); + + // Изменим размер вывода для тени + glViewport(0, 0, sunShadow_resolution, sunShadow_resolution); + // Активируем буфер кадра для теней от солнца + sunShadowBuffer.use(); + // Подключим шейдер для расчета теней + sunShadowShader.use(); + // Очистка буфера глубины + glClear(GL_DEPTH_BUFFER_BIT); + // Рендерим геометрию в буфер глубины + scene.render(sunShadowShader, material_data); + rectangle.render(sunShadowShader, material_data); + + // Изменим размер вывода для стороны кубической карты точечного источника + glViewport(0, 0, pointShadow_resolution, pointShadow_resolution); + // Активируем буфер кадра для теней от солнца + pointShadowBuffer.use(); + // Подключим шейдер для расчета теней + pointShadowShader.use(); + // Очистка буфера глубины + glClear(GL_DEPTH_BUFFER_BIT); + // Для каждого источника вызывается рендер сцены + for (int i = 0; i < Light::getCount(); i++) + { + glUniform1i(pointShadowShader.getUniformLoc("light_i"), i); + // Рендерим геометрию в буфер глубины + scene.render(pointShadowShader, material_data); + rectangle.render(pointShadowShader, material_data); + } + + // Изменим размер вывода для окна + glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); + // Активируем базовый буфер кадра + FBO::useDefault(); + // Подключаем шейдер для прямоугольника + lightShader.use(); + // Очистка буфера цвета и глубины + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + // Подключаем текстуры G-буфера + gPosition.use(); + gNormal.use(); + gDiffuseP.use(); + gAmbientSpecular.use(); + // Подключаем текстуры теней + sunShadowDepth.use(); + pointShadowDepth.use(); + // Подключим текстуру SSAO + ssaoTexture.use(); + // Рендерим прямоугольник с расчетом освещения + quadModel.render(); + + // Перенос буфера глубины + FBO::useDefault(GL_DRAW_FRAMEBUFFER); // Базовый в режиме записи + gbuffer.use(GL_READ_FRAMEBUFFER); // Буфер геометрии в режиме чтения + // Копирование значений глубины + glBlitFramebuffer(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + FBO::useDefault(); // Использование базового буфера для дальнейших работ + + // Отрисовка скайбокса без записи глубины + glDepthMask(GL_FALSE); + // Используем шейдер для скайбокса + skyboxShader.use(); + // Подключаем текстуру скайбокса + skybox_texture.use(); + // Рендерим куб + skybox.render(); + // Возвращаем запись глубины + glDepthMask(GL_TRUE); + + // Отрисовка отладочных лампочек со специальным шейдером + bulbShader.use(); + Light::render(bulbShader, material_data); + + // Представление содержимого буфера цепочки показа на окно + glfwSwapBuffers(window); + // Обработка системных событий + glfwPollEvents(); + } + + // Отключение атрибутов + glDisableVertexAttribArray(0); +}