From 4fcfb2690a9757c02a3f7b618548e5bf9800db1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Wed, 20 Mar 2024 22:49:11 +0100 Subject: [PATCH] improve pbr analytical lights --- demos/06-material.c | 6 ++++-- engine/art/shaders/fs_32_4_model.glsl | 20 ++++++-------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/demos/06-material.c b/demos/06-material.c index aa1b22d..19af976 100644 --- a/demos/06-material.c +++ b/demos/06-material.c @@ -7,15 +7,15 @@ const char *skyboxes[][2] = { // reflection, env, metadata - {"hdr/mesto.hdr","hdr/mesto_Env.hdr"}, + {"hdr/Tokyo_BigSight_1k.hdr","hdr/Tokyo_BigSight_Env.hdr"}, {"hdr/graffiti_shelter_4k.hdr","hdr/graffiti_shelter_Env.hdr"}, {"hdr/music_hall_01_4k.hdr","hdr/music_hall_01_Env.hdr"}, {"hdr/the_sky_is_on_fire_2k.hdr","hdr/the_sky_is_on_fire_Env.hdr"}, - {"hdr/Tokyo_BigSight_1k.hdr","hdr/Tokyo_BigSight_Env.hdr"}, {"hdr/GCanyon_C_YumaPoint_1k.hdr","hdr/GCanyon_C_YumaPoint_Env.hdr"}, {"hdr/Factory_Catwalk_1k.hdr","hdr/Factory_Catwalk_Env.hdr"}, {"hdr/MonValley_G_DirtRoad_1k.hdr","hdr/MonValley_G_DirtRoad_Env.hdr"}, {"hdr/Shiodome_Stairs_1k.hdr","hdr/Shiodome_Stairs_Env.hdr"}, + {"hdr/mesto.hdr","hdr/mesto_Env.hdr"}, }; int main() { @@ -73,8 +73,10 @@ int main() { object_pivot(obj4, vec3(0,0,90)); // create point light + scene_spawn_light(); // sun light_t* l = scene_spawn_light(); light_type(l, LIGHT_POINT); + l->diffuse = vec3(1,0,0); // load skybox scene_get_active()->skybox = skybox_pbr(skyboxes[0][0], skyboxes[0][0], skyboxes[0][1]); diff --git a/engine/art/shaders/fs_32_4_model.glsl b/engine/art/shaders/fs_32_4_model.glsl index f0ddf70..f2f1604 100644 --- a/engine/art/shaders/fs_32_4_model.glsl +++ b/engine/art/shaders/fs_32_4_model.glsl @@ -535,6 +535,7 @@ void main(void) F0 = mix( F0, baseColor, metallic ); bool use_ibl = has_tex_skysphere; + // use_ibl = false; // Add contributions from analytic lights. @@ -569,21 +570,12 @@ void main(void) continue; } - // vec3 n = normalize(v_normal_ws); - - // float diffuse = max(dot(n, lightDir), 0.0); - - // vec3 halfVec = normalize(lightDir + u_cam_dir); - // float specular = pow(max(dot(n, halfVec), 0.0), l.power); - - // return (attenuation*l.ambient + diffuse*attenuation*l.diffuse + specular*attenuation*l.specular); - - vec3 radiance = l.diffuse; + vec3 radiance = l.diffuse * BOOST_LIGHTING; vec3 L = normalize( lightDir ); - vec3 H = normalize( u_cam_dir + L ); + vec3 H = normalize( V + L ); - vec3 F = fresnel_schlick( H, u_cam_dir, F0 ); + vec3 F = fresnel_schlick( H, V, F0 ); vec3 kS = F; vec3 kD = vec3(1.0) - kS; kD *= 1.0 - metallic; @@ -592,10 +584,10 @@ void main(void) kD *= alpha; float D = distribution_ggx( N, H, roughness ); - float G = geometry_smith( N, u_cam_dir, L, roughness ); + float G = geometry_smith( N, V, L, roughness ); vec3 num = D * F * G; - float denom = 4. * max( 0., dot( N, u_cam_dir ) ) * max( 0., dot( N, L ) ); + float denom = 4. * max( 0., dot( N, V ) ) * max( 0., dot( N, L ) ); vec3 specular = kS * (num / max( 0.001, denom ));