diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index c8eaba64182f8d6ced4b73614494d8a2a225f4aa..46ce7d66526e4a6e04211770aed7a7d97d1275e8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -375,6 +375,12 @@ vec2 BRDF(float NoV, float roughness) return texture(brdfLut, vec2(NoV, roughness)).rg; } +// Lagarde and de Rousiers 2014, "Moving Frostbite to PBR" +float computeSpecularAO(float NoV, float ao, float roughness) +{ + return clamp(pow(NoV + ao, exp2(-16.0 * roughness - 1.0)) - 1.0 + ao, 0.0, 1.0); +} + // set colorDiffuse and colorSpec to the results of GLTF PBR style IBL vec3 pbrIbl(vec3 diffuseColor, vec3 specularColor, @@ -386,16 +392,20 @@ vec3 pbrIbl(vec3 diffuseColor, out vec3 specContrib) { // retrieve a scale and bias to F0. See [1], Figure 3 - vec2 brdf = BRDF(clamp(nv, 0, 1), 1.0-perceptualRough); - vec3 diffuseLight = irradiance; - vec3 specularLight = radiance; + vec2 brdf = BRDF(clamp(nv, 0, 1), 1.0-perceptualRough); + vec3 diffuseLight = irradiance; + vec3 specularLight = radiance; - vec3 diffuse = diffuseLight * diffuseColor; - vec3 specular = specularLight * (specularColor * brdf.x + brdf.y); + vec3 energy = mix(brdf.xxx, brdf.yyy, specularColor); + + vec3 diffuse = diffuseLight * diffuseColor * (1.0 - energy); + vec3 specular = specularLight * energy; + + specular *= computeSpecularAO(nv, ao, perceptualRough * perceptualRough) * (1.0 + specularColor * (1.0 / brdf.y - 1.0)); - specContrib = specular * ao; + specContrib = specular; - return (diffuse + specular) * ao; + return (diffuse * ao) + specular; } vec3 pbrIbl(vec3 diffuseColor, diff --git a/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl b/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl index e40d070268ef6223c861aa88e2fc15e998f1b312..df0d21b43231e597d32f5b713805457721456939 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl @@ -129,7 +129,7 @@ vec2 BRDF(float NoV, float roughness) float G = G_SchlicksmithGGX(dotNL, dotNV, roughness); float G_Vis = (G * dotVH) / (dotNH * dotNV); float Fc = pow(1.0 - dotVH, 5.0); - LUT += vec2((1.0 - Fc) * G_Vis, Fc * G_Vis); + LUT += vec2(Fc * G_Vis, G_Vis); } } return LUT / float(NUM_SAMPLES);