07/shaders/shader.vert

60 lines
1.8 KiB
GLSL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}