45 lines
1.1 KiB
GLSL
45 lines
1.1 KiB
GLSL
#version 440
|
|
out vec4 FragColor;
|
|
|
|
in vec2 uv;
|
|
|
|
uniform sampler2D pos_tex;
|
|
uniform sampler2D normal_tex;
|
|
uniform sampler2D color_tex;
|
|
|
|
struct Light {
|
|
vec3 Position;
|
|
vec3 Color;
|
|
};
|
|
|
|
uniform int NLights;
|
|
uniform Light lights[64];
|
|
|
|
uniform vec3 view_pos;
|
|
|
|
void main()
|
|
{
|
|
vec3 FragPos = texture(pos_tex, uv).rgb;
|
|
vec3 Normal = texture(normal_tex, uv).rgb;
|
|
vec3 Albedo = texture(color_tex, uv).rgb;
|
|
float Specular = 0.5f;
|
|
|
|
// then calculate lighting as usual
|
|
vec3 lighting = Albedo * 0.1; // hard-coded ambient component
|
|
vec3 viewDir = normalize(view_pos - FragPos);
|
|
for (int i = 0; i < NLights; ++i)
|
|
{
|
|
vec3 L = normalize(lights[i].Position.xyz - FragPos);
|
|
vec3 V = normalize(view_pos - FragPos);
|
|
vec3 H = normalize(V + L);
|
|
|
|
vec3 diffuse = max(dot(Normal, L), 0.0) * Albedo * lights[i].Color;
|
|
// specular
|
|
float spec = pow(max(dot(Normal, H), 0.0), 16.0);
|
|
vec3 specular = lights[i].Color * spec * Specular;
|
|
lighting += diffuse + specular;
|
|
}
|
|
|
|
FragColor = vec4(lighting, 1.0);
|
|
}
|