diff --git a/include/Lights.h b/include/Lights.h index 926a7df..a6bd444 100644 --- a/include/Lights.h +++ b/include/Lights.h @@ -28,4 +28,14 @@ class Bulb static GrouptedModel bulb_model; }; +// Класс направленного источника освещения +class Sun +{ + public: + 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; // Цвет + void upload(ShaderProgram &shaderProgram); // Загрузка данных об источнике на шейдер +}; + #endif // LIGHTS_H diff --git a/shaders/lighting.frag b/shaders/lighting.frag index d69ed60..9774026 100644 --- a/shaders/lighting.frag +++ b/shaders/lighting.frag @@ -25,7 +25,8 @@ layout(std140, binding = 2) uniform Light int count; } light_f; - +uniform vec3 Sun_direction; +uniform vec3 Sun_color; uniform sampler2D gPosition; uniform sampler2D gNormal; @@ -58,6 +59,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 824e101..4467f06 100644 --- a/src/Lights.cpp +++ b/src/Lights.cpp @@ -74,3 +74,20 @@ void Bulb::setRadius(float r) K[0] = 4.5/radius; K[1] = 4 * K[0] * K[0]; } + +// Конструктор направленного источника с параметрами направления и цвета +Sun::Sun(const glm::vec3 &dir, const glm::vec3 &c) : direction(dir), color(c) +{ + +} + +// Загрузка данных об источнике на шейдер +void Sun::upload(ShaderProgram &shaderProgram) +{ + GLuint direction_uniform = shaderProgram.getUniformLoc("Sun_direction"); + GLuint color_uniform = shaderProgram.getUniformLoc("Sun_color"); + + // Загрузим данные + glUniform3fv(direction_uniform, 1, &direction[0]); + glUniform3fv(color_uniform, 1, &color[0]); +} diff --git a/src/main.cpp b/src/main.cpp index 907652f..2917b8c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -115,6 +115,9 @@ int main(void) bulbShader.load(GL_FRAGMENT_SHADER, "shaders/bulb.frag"); bulbShader.link(); + // Направленный источник света + Sun sun; + // Источники света Bulb lights[MAX_LIGHTS]; // Количество используемых источников @@ -195,6 +198,8 @@ int main(void) gNormal.use(); gDiffuseP.use(); gAmbientSpecular.use(); + // Загружаем информацию о направленном источнике + sun.upload(lightShader); // Загружаем информацию об источниках света и их количестве light_data.loadSub(lights, sizeof(Bulb) * lights_count); light_data.loadSub(&lights_count, sizeof(GLint), sizeof(lights));