Множество источников

This commit is contained in:
2023-10-19 16:15:03 +03:00
committed by re.kovalev
parent 721dc90c0c
commit 94cbecf491
4 changed files with 86 additions and 20 deletions

View File

@@ -9,10 +9,16 @@ layout(std140, binding = 0) uniform Camera
vec3 position;
} camera;
layout(std140, binding = 2) uniform Light
struct LightData
{
vec3 position;
vec3 color;
};
layout(std140, binding = 2) uniform Light
{
LightData data[300];
int count;
} light_f;
uniform sampler2D gPosition;
@@ -32,20 +38,35 @@ void main()
float ks = texture(gAmbientSpecular, texCoord).a;
float p = texture(gDiffuseP, texCoord).a;
// Данные о камере относительно фрагмента
vec3 Cam_vertex = normalize(camera.position - fragPos);
// Данные об источнике отностиельно фрагмента
vec3 L_vertex = normalize(light_f.position - fragPos);
// Диффузная составляющая
float diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0
// Переменные используемые в цикле:
vec3 L_vertex; // Данные об источнике относительно фрагмента
vec3 Cam_vertex = normalize(camera.position - fragPos); // Данные о камере относительно фрагмента
float diffuse; // Диффузная составляющая
vec3 H; // Вектор половины пути
float specular; // Зеркальная составляющая
// Вектор половины пути
vec3 H = normalize(L_vertex + Cam_vertex);
// Зеркальная составляющая
float specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p
// Фоновая освещенность
color = vec4(ka, 1);
color = vec4(ka, 1)
+ vec4(light_f.color*kd*diffuse, 1)
+ vec4(light_f.color*ks*specular, 1);
// Цикл по источникам света
int i;
for (i = 0; i < light_f.count; i++)
{
// Данные об источнике относительно фрагмента
L_vertex = light_f.data[i].position - fragPos;
// Нормирование вектора
L_vertex = normalize(L_vertex);
// Диффузная составляющая
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(light_f.data[i].color*kd*diffuse, 1)
+ vec4(light_f.data[i].color*ks*specular, 1);
}
}