From ac1d6be8c4a7c9cefb732bf4aa13997140b41dd0 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 20 Dec 2022 16:02:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D1=80=D0=B0=D0=BB=D0=BB=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=B8=D1=81=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Lights.h | 23 ++++++++++++++++++ shaders/lighting.frag | 23 ++++++++++++++++++ src/Lights.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 3 +++ 4 files changed, 103 insertions(+) diff --git a/include/Lights.h b/include/Lights.h index 04caa92..621e954 100644 --- a/include/Lights.h +++ b/include/Lights.h @@ -63,4 +63,27 @@ class Light : public Node 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; // Цвет + + static Sun instance; // Экземпляр синглтона + static bool uploadReq; // Необходимость загрузки в следствии изменений +}; + #endif // LIGHTS_H diff --git a/shaders/lighting.frag b/shaders/lighting.frag index 56649af..3afaeab 100644 --- a/shaders/lighting.frag +++ b/shaders/lighting.frag @@ -23,6 +23,12 @@ layout(std140, binding = 2) uniform Light int count; } light_f; +layout(std140, binding = 3) uniform Sun +{ + vec3 direction; + vec3 color; +} sun; + uniform sampler2D gPosition; uniform sampler2D gNormal; uniform sampler2D gDiffuseP; @@ -54,6 +60,23 @@ void main() // Фоновая освещенность color = vec4(ka, 1); + // Расчет солнца, если его цвет не черный + if (length(sun.color) > 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); + } + // Цикл по источникам света int i; for (i = 0; i < light_f.count; i++) diff --git a/src/Lights.cpp b/src/Lights.cpp index 7e7aa2f..2a15b30 100644 --- a/src/Lights.cpp +++ b/src/Lights.cpp @@ -8,6 +8,9 @@ GLuint Light::count = 0; // количество используемых ист LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света Light Light::lights[MAX_LIGHTS]; // Массив источников-узлов сцены +Sun Sun::instance; // Экземпляр синглтона +bool Sun::uploadReq = true; // Необходимость загрузки в следствии изменений + // возвращает размер буфера в байтах int Light::getUBOsize() { @@ -245,3 +248,54 @@ float& Light::e_angle() 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) +{ + 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; +} diff --git a/src/main.cpp b/src/main.cpp index 2579500..6d47cb3 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -145,6 +145,7 @@ int main(void) 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 @@ -204,6 +205,8 @@ int main(void) cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData)); // Загрузим информацию об источниках света Light::upload(light_data); + // Загружаем информацию о направленном источнике + Sun::upload(sun_data); // Активируем G-кадра gbuffer.use();