#version 310 es layout(location = 0) in vec3 in_pos; layout(location = 1) in vec3 in_normal; layout(std140, set = 0, binding = 0) readonly buffer param_block { vec3 light_pos; vec3 light_color; mat4 model; mat4 view_projection; } params; layout(location = 0) out vec3 color; void main() { vec3 world_light = vec3(params.model * vec4(params.light_pos, 1.0)); vec3 world_pos = vec3(params.model * vec4(in_pos, 1.0)); vec3 world_normal = mat3(params.model) * in_normal; vec3 light_dir = world_light - world_pos; float brightness = dot(light_dir, world_normal) / length(light_dir) / length(world_normal); brightness = abs(brightness); gl_Position = params.view_projection * vec4(world_pos, 1.0); color = params.light_color * brightness; }