Files
gpu-renderer/default-frag.glsl

85 lines
2.3 KiB
GLSL

#version 450
#define PI 3.14159265358979
float floor_light_coeff = 0.01;
float sunny_sky_light_coeff = 0.5;
float cloudy_sky_light_coeff = 0.4;
float sunny_sun_light_coeff = 0.8;
float cloudy_sun_light_coeff = 0.3;
float sunny_shadow_pcf_radius = 1;
float cloudy_shadow_pcf_radius = 24;
vec3 sunny_sky_colour = vec3(0.5, 0.7, 1.0);
vec3 cloudy_sky_colour = vec3(0.7, 0.7, 1.0);
vec3 sunny_sun_colour = vec3(1.0, 0.95, 0.8);
vec3 cloudy_sun_colour = vec3(0.7, 0.7, 1.0);
vec3 material_colour = vec3(1.0, 0.94, 0.8);
float shadow_bias = 0.005;
float shadow_map_size = 4096;
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;
layout(push_constant) uniform params_t {
layout(offset = 128) vec3 sun_dir;
layout(offset = 140) float cloudiness;
} params;
void main()
{
const float sky_light_coeff
= mix(sunny_sky_light_coeff, cloudy_sky_light_coeff,
params.cloudiness);
const float sun_light_coeff
= mix(sunny_sun_light_coeff, cloudy_sun_light_coeff,
params.cloudiness);
const float shadow_pcf_radius
= mix(sunny_shadow_pcf_radius, cloudy_shadow_pcf_radius,
params.cloudiness);
const vec3 sky_colour
= mix(sunny_sky_colour, cloudy_sky_colour,
params.cloudiness);
const vec3 sun_colour
= mix(sunny_sun_colour, cloudy_sun_colour,
params.cloudiness);
const float lambertian = max(dot(frag_normal, params.sun_dir), 0.0);
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 = 0.0;
for (int x = -2; x <= 2; ++x) {
for (int y = -2; y < 3; ++y) {
const vec2 offset
= shadow_pcf_radius * vec2(x, y) / shadow_map_size;
shadow += texture(
shadow_map,
vec3(shadow_map_pos.xy + offset,
shadow_map_pos.z - shadow_bias));
}
}
shadow /= 25;
const vec3 sun_light = shadow * lambertian * sun_colour;
const vec3 floor_colour = floor_light_coeff * material_colour;
const float t = 0.5 * clamp(frag_normal.y, -1, 1) + 0.5;
const vec3 sky_light = mix(floor_colour, sky_colour, t);
const vec3 lighting
= sun_light_coeff * sun_light
+ sky_light_coeff * sky_light;
out_colour = vec4(lighting * material_colour, 1.0);
}