69 lines
2.2 KiB
Text
69 lines
2.2 KiB
Text
|
#version 330 core
|
||
|
|
||
|
uniform vec3 fg_SunDirection;
|
||
|
|
||
|
// shadowing.glsl
|
||
|
float get_shadowing(vec3 P, vec3 N, vec3 L);
|
||
|
vec3 debug_shadow_color(vec3 color, vec3 P, vec3 N, vec3 L);
|
||
|
// surface.glsl
|
||
|
vec3 f0_from_pbr(vec3 base_color, float metallic);
|
||
|
vec3 surface_eval_analytical(
|
||
|
vec3 base_color, float metallic, float roughness, vec3 f0,
|
||
|
vec3 light_intensity, float occlusion,
|
||
|
vec3 N, vec3 L, vec3 V);
|
||
|
// ibl.glsl
|
||
|
vec3 get_reflected(vec3 N, vec3 V, mat4 view_matrix_inverse);
|
||
|
vec3 eval_ibl(vec3 base_color, float metallic, float roughness, vec3 f0,
|
||
|
float occlusion, vec3 ws_N, vec3 ws_refl, float NdotV);
|
||
|
// aerial_perspective.glsl
|
||
|
vec3 mix_aerial_perspective(vec3 color, vec4 ap);
|
||
|
vec3 get_sun_radiance(vec3 p);
|
||
|
// clustered.glsl
|
||
|
vec3 eval_scene_lights(vec3 base_color, float metallic, float roughness, vec3 f0,
|
||
|
vec3 P, vec3 N, vec3 V);
|
||
|
// exposure.glsl
|
||
|
vec3 apply_exposure(vec3 color);
|
||
|
|
||
|
vec3 eval_lights_transparent(
|
||
|
vec3 base_color, float metallic, float roughness, float occlusion,
|
||
|
vec3 emissive, vec3 P, vec3 N, vec3 V, vec2 uv, vec4 ap,
|
||
|
mat4 view_matrix_inverse)
|
||
|
{
|
||
|
vec3 f0 = f0_from_pbr(base_color, metallic);
|
||
|
vec3 ws_P = (view_matrix_inverse * vec4(P, 1.0)).xyz;
|
||
|
|
||
|
// Evaluate sunlight
|
||
|
vec3 sun_radiance = get_sun_radiance(ws_P);
|
||
|
float shadow_factor = get_shadowing(P, N, fg_SunDirection);
|
||
|
vec3 color = surface_eval_analytical(
|
||
|
base_color, metallic, roughness, f0,
|
||
|
sun_radiance, shadow_factor,
|
||
|
N, fg_SunDirection, V);
|
||
|
|
||
|
// Evaluate all scene lights
|
||
|
color += eval_scene_lights(
|
||
|
base_color, metallic, roughness, f0,
|
||
|
P, N, V);
|
||
|
|
||
|
// Evaluate image-based lights
|
||
|
vec3 ws_N = (view_matrix_inverse * vec4(N, 0.0)).xyz;
|
||
|
vec3 ws_refl = get_reflected(N, V, view_matrix_inverse);
|
||
|
float NdotV = max(dot(N, V), 1e-4);
|
||
|
color += eval_ibl(
|
||
|
base_color, metallic, roughness, f0,
|
||
|
occlusion, ws_N, ws_refl, NdotV);
|
||
|
|
||
|
// Add emissive contribution
|
||
|
color += emissive;
|
||
|
|
||
|
// Add aerial perspective
|
||
|
color = mix_aerial_perspective(color, ap);
|
||
|
|
||
|
// Pre-expose
|
||
|
color = apply_exposure(color);
|
||
|
|
||
|
color = debug_shadow_color(color, P, N, fg_SunDirection);
|
||
|
|
||
|
return color;
|
||
|
}
|