Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-06-05 13:17:37 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-06-05 13:20:49 +0300
commit98cea7edcefa58d5eb7e2350461b8efe33fe7d9e (patch)
treed7bfb1d88d07ddc954560e3df29f23c9e8b391de /source/blender/draw/engines/eevee
parentcd1ac4d908a89e4eb5c3da50bbe748aec2b36692 (diff)
Fix T65298 Eevee: Principled BSDF doesn't use specular with metals
This does add some more register pressure as it passes a new vec3 down the shading function. But for now we care more about accuracy than efficiency.
Diffstat (limited to 'source/blender/draw/engines/eevee')
-rw-r--r--source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl8
-rw-r--r--source/blender/draw/engines/eevee/shaders/default_frag.glsl3
-rw-r--r--source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl10
3 files changed, 12 insertions, 9 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index 0f3e7ba7efb..c332f68728f 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -644,19 +644,19 @@ vec3 F_schlick(vec3 f0, float cos_theta)
}
/* Fresnel approximation for LTC area lights (not MRP) */
-vec3 F_area(vec3 f0, vec2 lut)
+vec3 F_area(vec3 f0, vec3 f90, vec2 lut)
{
/* Unreal specular matching : if specular color is below 2% intensity,
* treat as shadowning */
- return saturate(50.0 * dot(f0, vec3(0.3, 0.6, 0.1))) * lut.y + lut.x * f0;
+ return saturate(50.0 * dot(f0, vec3(0.3, 0.6, 0.1))) * lut.y * f90 + lut.x * f0;
}
/* Fresnel approximation for IBL */
-vec3 F_ibl(vec3 f0, vec2 lut)
+vec3 F_ibl(vec3 f0, vec3 f90, vec2 lut)
{
/* Unreal specular matching : if specular color is below 2% intensity,
* treat as shadowning */
- return saturate(50.0 * dot(f0, vec3(0.3, 0.6, 0.1))) * lut.y + lut.x * f0;
+ return saturate(50.0 * dot(f0, vec3(0.3, 0.6, 0.1))) * lut.y * f90 + lut.x * f0;
}
/* GGX */
diff --git a/source/blender/draw/engines/eevee/shaders/default_frag.glsl b/source/blender/draw/engines/eevee/shaders/default_frag.glsl
index c568b4d94be..64a1c725a6b 100644
--- a/source/blender/draw/engines/eevee/shaders/default_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/default_frag.glsl
@@ -29,8 +29,9 @@ Closure nodetree_exec(void)
vec3 dielectric = vec3(0.034) * specular * 2.0;
vec3 albedo = mix(basecol, vec3(0.0), metallic);
vec3 f0 = mix(dielectric, basecol, metallic);
+ vec3 f90 = mix(vec3(1.0), f0, (1.0 - specular) * metallic);
vec3 out_diff, out_spec, ssr_spec;
- eevee_closure_default(N, albedo, f0, 1, roughness, 1.0, out_diff, out_spec, ssr_spec);
+ eevee_closure_default(N, albedo, f0, f90, 1, roughness, 1.0, out_diff, out_spec, ssr_spec);
Closure result = Closure(out_spec + out_diff * albedo,
1.0,
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index fe3225b1086..e96667c0488 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -119,6 +119,7 @@ void CLOSURE_NAME(vec3 N
#ifdef CLOSURE_GLOSSY
,
vec3 f0,
+ vec3 f90,
int ssr_id
#endif
#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION)
@@ -264,12 +265,12 @@ void CLOSURE_NAME(vec3 N
#ifdef CLOSURE_GLOSSY
vec2 brdf_lut_lights = texture(utilTex, vec3(lut_uv, 1.0)).ba;
- out_spec *= F_area(f0, brdf_lut_lights.xy);
+ out_spec *= F_area(f0, f90, brdf_lut_lights.xy);
#endif
#ifdef CLOSURE_CLEARCOAT
vec2 brdf_lut_lights_clear = texture(utilTex, vec3(lut_uv_clear, 1.0)).ba;
- out_spec_clear *= F_area(vec3(0.04), brdf_lut_lights_clear.xy);
+ out_spec_clear *= F_area(vec3(0.04), vec3(1.0), brdf_lut_lights_clear.xy);
out_spec += out_spec_clear * C_intensity;
#endif
@@ -454,7 +455,7 @@ void CLOSURE_NAME(vec3 N
/* This factor is outputted to be used by SSR in order
* to match the intensity of the regular reflections. */
- ssr_spec = F_ibl(f0, brdf_lut);
+ ssr_spec = F_ibl(f0, f90, brdf_lut);
float spec_occlu = specular_occlusion(NV, final_ao, roughness);
/* The SSR pass recompute the occlusion to not apply it to the SSR */
@@ -475,7 +476,8 @@ void CLOSURE_NAME(vec3 N
NV = dot(C_N, V);
vec2 C_uv = lut_coords(NV, C_roughness);
vec2 C_brdf_lut = texture(utilTex, vec3(C_uv, 1.0)).rg;
- vec3 C_fresnel = F_ibl(vec3(0.04), C_brdf_lut) * specular_occlusion(NV, final_ao, C_roughness);
+ vec3 C_fresnel = F_ibl(vec3(0.04), vec3(1.0), C_brdf_lut) *
+ specular_occlusion(NV, final_ao, C_roughness);
out_spec += C_spec_accum.rgb * C_fresnel * C_intensity;
#endif