07/shaders/shader.vert

60 lines
1.8 KiB
GLSL
Raw Normal View History

2022-11-14 17:24:58 +00:00
#version 420 core
layout(location = 0) in vec3 pos;
layout(location = 1) in vec2 inTexCoord;
layout(location = 2) in vec3 normals;
layout(std140, binding = 0) uniform Camera
{
mat4 projection;
mat4 view;
2022-11-23 11:14:20 +00:00
vec3 position;
} camera;
2022-11-14 17:24:58 +00:00
2022-11-23 11:18:08 +00:00
layout(std140, binding = 1) uniform Material
{
vec3 ka;
vec3 kd;
vec3 ks;
float p;
} material_v;
2022-11-23 11:12:55 +00:00
layout(std140, binding = 2) uniform Light
{
vec3 position;
vec3 color;
} light_v;
2022-11-14 17:24:58 +00:00
uniform mat4 model;
out vec2 texCoord;
2022-11-23 11:18:08 +00:00
out float diffuse; // Диффузная составляющая
out float specular; // Зеркальная составляющая
2022-11-23 11:16:23 +00:00
2022-11-14 17:24:58 +00:00
void main()
{
2022-11-23 11:16:23 +00:00
vec4 P = model * vec4(pos, 1.0); // трансформация вершины
2022-11-23 11:18:08 +00:00
// Позиция камеры относительно вершины
vec3 Cam_vertex = normalize(camera.position - P.xyz);
// Позиция источника света относительно вершины
vec3 L_vertex = normalize(light_v.position - P.xyz);
vec3 N = normalize(mat3(model) * normals); // трансформация нормали
// Диффузная составляющая
diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0
// Отраженный вектор
vec3 R = normalize(reflect(-L_vertex, N));
// Зеркальная составляющая
specular = 0;
// Если есть диффузная составляющая, то считаем зеркальную
if (diffuse > 0)
specular = pow(max(dot(Cam_vertex, R), 0.0), material_v.p); // скалярное произведение с отсеканием значений < 0 в степени p
2022-11-23 11:16:23 +00:00
gl_Position = camera.projection * camera.view * P;
2022-11-14 17:24:58 +00:00
texCoord = inTexCoord;
2022-11-23 11:18:08 +00:00
}