#version 450 float ambient = 0.1; vec3 light_dir = normalize(vec3(2, 2, -1)); vec3 base_colour = vec3(1.0, 0.94, 0.8); layout(location = 0) in vec3 frag_normal; layout(location = 1) in vec4 light_pos; layout(location = 0) out vec4 out_colour; layout(binding = 2) uniform sampler2DShadow shadow_map; void main() { const float lambertian = max(dot(frag_normal, light_dir), 0.0); const float shadow_bias = 0.005; const vec3 proj_coords = light_pos.xyz / light_pos.w; const vec3 shadow_map_pos = vec3(0.5 * proj_coords.xy + 0.5, proj_coords.z); float shadow = texture( shadow_map, vec3(shadow_map_pos.xy, shadow_map_pos.z - shadow_bias)); const float intensity = min(shadow * lambertian + ambient, 1.0); out_colour = vec4(intensity * base_colour, 1.0); }