@@ -29,6 +29,14 @@ float egacGeometrySmith(float roughness, float NoL, float NoV)
2929 return ggx1 * ggx2;
3030}
3131
32+ float egacDiffuseBurley(float roughness, float NoV, float NoL, float VoH)
33+ {
34+ float FD90 = 0.5 + 2 * VoH * VoH * roughness;
35+ float lightScatter = 1 + (FD90 - 1 ) * pow (1 - NoL, 5 );
36+ float viewScatter = 1 + (FD90 - 1 ) * pow (1 - NoV, 5 );
37+ return (lightScatter * viewScatter) / PI;
38+ }
39+
3240vec3 brdf(vec3 N, vec3 L, vec3 V, vec3 albedo, float roughness, float metallic)
3341{
3442 vec3 H = normalize (L + V);
@@ -37,16 +45,23 @@ vec3 brdf(vec3 N, vec3 L, vec3 V, vec3 albedo, float roughness, float metallic)
3745 float NoH = max (dot (N, H), 0 );
3846 float VoH = max (dot (V, H), 0 );
3947
48+ // frenel
4049 // https://learnopengl.com/PBR/Lighting
4150 // https://github.com/pumexx/pumex/blob/86fda7fa351d00bd5918ad90899ce2d6bb8b1dfe/examples/pumexdeferred/shaders/deferred_composite.frag
4251 vec3 F0 = mix (vec3 (0.04 ), albedo, metallic);
4352 vec3 F = egacFresnelSchlick(F0, VoH); // VoH or NoV
4453 vec3 kD = (vec3 (1 ) - F) * (1 - metallic);
4554
55+ // diffuse (Burley)
56+ float diffuseTerm = egacDiffuseBurley(roughness, NoV, NoL, VoH);
57+ vec3 diffuse = kD * albedo * diffuseTerm;
58+
59+ // specular (Cook-Torrance GGX)
4660 float NDF = egacDistributionGGX(roughness, NoH);
4761 float G = egacGeometrySmith(roughness, NoL, NoV);
48-
4962 vec3 nominator = NDF * G * F;
5063 float denominator = 4 * NoV * NoL + 0.001 ;
51- return min (kD * albedo / PI + nominator / denominator, 1 ) * NoL;
64+ vec3 specular = nominator / denominator;
65+
66+ return min (diffuse + specular, 1 ) * NoL;
5267}
0 commit comments