Определение угла и рисование части отладочной сферы

This commit is contained in:
2022-12-20 15:58:42 +03:00
parent 8ef0116aef
commit 1a74ce4d41
6 changed files with 72 additions and 14 deletions

View File

@@ -8,9 +8,18 @@ layout(std140, binding = 1) uniform Material
float p;
};
in vec3 pos_local;
out vec4 color;
uniform float angle;
uniform vec3 direction;
void main()
{
color = vec4(ka, 1);
float cosA = dot(normalize(pos_local), normalize(direction));
if (degrees(acos(cosA)) <= angle)
color = vec4(ka, 1);
else
discard;
}

View File

@@ -11,7 +11,10 @@ layout(std140, binding = 0) uniform Camera
uniform mat4 model;
out vec3 pos_local;
void main()
{
pos_local = pos;
gl_Position = camera.projection * camera.view * model * vec4(pos, 1.0);
}

View File

@@ -14,6 +14,7 @@ struct LightData
vec3 position;
vec3 color;
vec3 attenuation;
vec4 direction_angle;
};
layout(std140, binding = 2) uniform Light
@@ -47,6 +48,8 @@ void main()
float specular; // Зеркальная составляющая
float L_distance; // Расстояние от поверхности до источника
float attenuation; // Коэф. угасания
float acosA; // Косинус между вектором от поверхности к источнику и обратным направлением источника
// Фоновая освещенность
color = vec4(ka, 1);
@@ -66,20 +69,25 @@ void main()
{
// Нормирование вектора
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
// Диффузная составляющая
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);
// Угасание с учетом расстояния
attenuation = 1 / (1 + light_f.data[i].attenuation[1] * L_distance + light_f.data[i].attenuation[2] * L_distance * L_distance);
color += vec4(light_f.data[i].color*kd*diffuse * attenuation, 1)
+ vec4(light_f.data[i].color*ks*specular * attenuation, 1);
color += vec4(light_f.data[i].color*kd*diffuse * attenuation, 1)
+ vec4(light_f.data[i].color*ks*specular * attenuation, 1);
}
}
}
}