Lighting.gdshader 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. shader_type canvas_item;
  2. render_mode unshaded;
  3. uniform mat4 global_transform;
  4. uniform int n_lights = 0;
  5. uniform vec4 dark_color : source_color = vec4(0.1, 0.08, 0.15, 1.0);
  6. uniform vec4 default_light_color : source_color;
  7. uniform float light_level : hint_range(0.0, 1.0) = 0.0;
  8. uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
  9. varying vec2 world_position;
  10. #define MAX_LIGHTS 64
  11. uniform vec4 light_data[MAX_LIGHTS];
  12. uniform vec4 color_data[MAX_LIGHTS];
  13. void vertex()
  14. {
  15. world_position = (global_transform * vec4(VERTEX, 0.0, 1.0)).xy;
  16. }
  17. void fragment()
  18. {
  19. vec2 frag_position = floor(world_position);
  20. float m_value = 1.0; // 1.0 == dark, 0.0 == light
  21. vec4 light_color = default_light_color;
  22. for (int i = 0; i < n_lights; ++i)
  23. {
  24. vec4 light_instance = light_data[i];
  25. vec2 normalized_position = light_instance.xy - frag_position;
  26. normalized_position.y *= 1.3;
  27. float squared_dist = dot(normalized_position, normalized_position);
  28. float squared_radius = light_instance.w * light_instance.w;
  29. if (squared_dist < squared_radius)
  30. {
  31. float dist = squared_dist / squared_radius;
  32. float value = dist < light_instance.z ? 0.0 : 1.0/light_instance.z*(dist-light_instance.z);
  33. if (value < m_value)
  34. {
  35. vec4 new_color = color_data[i];
  36. light_color.rgb = mix(light_color.rgb, new_color.rgb, m_value);
  37. light_color.a = max(light_color.r, new_color.r);
  38. }
  39. m_value *= value;
  40. if (m_value <= 0.0)
  41. break;
  42. }
  43. }
  44. light_color.rgb = mix(light_color.rgb, dark_color.rgb, max(-0.2, (m_value - 0.5) / 0.5));
  45. vec4 ambient_color = mix(light_color, dark_color, m_value);
  46. ambient_color.a *= 1.0 - light_level;
  47. vec4 screen_color = texture(SCREEN_TEXTURE, SCREEN_UV);
  48. COLOR = screen_color * ambient_color;
  49. }