Параллельный источник

This commit is contained in:
Ковалев Роман Евгеньевич 2022-12-20 16:02:31 +03:00 committed by R.E. Kovalev
parent 60aa8fea1f
commit 044731350e
4 changed files with 51 additions and 1 deletions

View File

@ -28,4 +28,14 @@ class Bulb
static GrouptedModel bulb_model; 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 #endif // LIGHTS_H

View File

@ -25,7 +25,8 @@ layout(std140, binding = 2) uniform Light
int count; int count;
} light_f; } light_f;
uniform vec3 Sun_direction;
uniform vec3 Sun_color;
uniform sampler2D gPosition; uniform sampler2D gPosition;
uniform sampler2D gNormal; uniform sampler2D gNormal;
@ -58,6 +59,23 @@ void main()
// Фоновая освещенность // Фоновая освещенность
color = vec4(ka, 1); 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; int i;
for (i = 0; i < light_f.count; i++) for (i = 0; i < light_f.count; i++)

View File

@ -74,3 +74,20 @@ void Bulb::setRadius(float r)
K[0] = 4.5/radius; K[0] = 4.5/radius;
K[1] = 4 * K[0] * K[0]; 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]);
}

View File

@ -115,6 +115,9 @@ int main(void)
bulbShader.load(GL_FRAGMENT_SHADER, "shaders/bulb.frag"); bulbShader.load(GL_FRAGMENT_SHADER, "shaders/bulb.frag");
bulbShader.link(); bulbShader.link();
// Направленный источник света
Sun sun;
// Источники света // Источники света
Bulb lights[MAX_LIGHTS]; Bulb lights[MAX_LIGHTS];
// Количество используемых источников // Количество используемых источников
@ -195,6 +198,8 @@ int main(void)
gNormal.use(); gNormal.use();
gDiffuseP.use(); gDiffuseP.use();
gAmbientSpecular.use(); gAmbientSpecular.use();
// Загружаем информацию о направленном источнике
sun.upload(lightShader);
// Загружаем информацию об источниках света и их количестве // Загружаем информацию об источниках света и их количестве
light_data.loadSub(lights, sizeof(Bulb) * lights_count); light_data.loadSub(lights, sizeof(Bulb) * lights_count);
light_data.loadSub(&lights_count, sizeof(GLint), sizeof(lights)); light_data.loadSub(&lights_count, sizeof(GLint), sizeof(lights));