#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; vec3 position; } camera; layout(std140, binding = 1) uniform Material { vec3 ka; vec3 kd; vec3 ks; float p; } material_v; layout(std140, binding = 2) uniform Light { vec3 position; vec3 color; } light_v; uniform mat4 model; out vec2 texCoord; out float diffuse; // Диффузная составляющая out float specular; // Зеркальная составляющая void main() { vec4 P = model * vec4(pos, 1.0); // трансформация вершины // Позиция камеры относительно вершины 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 gl_Position = camera.projection * camera.view * P; texCoord = inTexCoord; }