diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-04-26 00:48:26 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-04-26 00:51:05 +0300 |
commit | 82686f0a0c2c1d5c42b07288935440aea4713cad (patch) | |
tree | b9b750c1849c2446d420deb14b229e792d5bb594 /source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl | |
parent | bb75b0bcbcea35fe32e439c8f3e618b66f5110cf (diff) |
Eevee: World default shader.
- Use uniform color world for the world probe.
- Refactored the Fresnel expression to be better with Area Lights.
- Squared the roughness for default materials.
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl index 105b637c371..b0f31a403c7 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl @@ -83,14 +83,17 @@ float direct_diffuse_unit_disc(vec3 N, vec3 L) #endif /* ----------- GGx ------------ */ -float direct_ggx_point(ShadingData sd, float roughness) +vec3 direct_ggx_point(ShadingData sd, float roughness, vec3 f0) { float bsdf = bsdf_ggx(sd.N, sd.L, sd.V, roughness); bsdf /= sd.l_distance * sd.l_distance; - return bsdf; + + /* Fresnel */ + float VH = max(dot(sd.V, normalize(sd.V + sd.L)), 0.0); + return F_schlick(f0, VH) * bsdf; } -float direct_ggx_sphere(LightData ld, ShadingData sd, float roughness) +vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0) { #ifdef USE_LTC vec3 P = line_aligned_plane_intersect(vec3(0.0), sd.spec_dominant_dir, sd.l_vector); @@ -128,9 +131,13 @@ float direct_ggx_sphere(LightData ld, ShadingData sd, float roughness) /* sqrt(pi/2) difference between square and disk area */ bsdf *= 1.25331413731; #endif - - bsdf *= texture(brdfLut, uv).b; /* Bsdf intensity */ + vec3 lut = texture(brdfLut, uv).rgb; + bsdf *= lut.b; /* Bsdf intensity */ bsdf *= M_1_2PI * M_1_PI; + + /* Rough fresnel approximation using the LUT */ + lut.xy = normalize(lut.xy); + vec3 spec = bsdf * lut.y + f0 * bsdf * lut.x; #else float energy_conservation; vec3 L = mrp_sphere(ld, sd, sd.spec_dominant_dir, roughness, energy_conservation); @@ -138,11 +145,15 @@ float direct_ggx_sphere(LightData ld, ShadingData sd, float roughness) bsdf *= energy_conservation / (sd.l_distance * sd.l_distance); bsdf *= max(ld.l_radius * ld.l_radius, 1e-16); /* radius is already inside energy_conservation */ + + /* Fresnel */ + float VH = max(dot(sd.V, normalize(sd.V + sd.L)), 0.0); + vec3 spec = F_schlick(f0, NV) * bsdf; #endif - return bsdf; + return spec; } -float direct_ggx_rectangle(LightData ld, ShadingData sd, float roughness) +vec3 direct_ggx_rectangle(LightData ld, ShadingData sd, float roughness, vec3 f0) { #ifdef USE_LTC float NV = max(dot(sd.N, sd.V), 1e-8); @@ -150,8 +161,13 @@ float direct_ggx_rectangle(LightData ld, ShadingData sd, float roughness) mat3 ltcmat = ltc_matrix(uv); float bsdf = ltc_evaluate(sd.N, sd.V, ltcmat, sd.area_data.corner); - bsdf *= texture(brdfLut, uv).b; /* Bsdf intensity */ + vec3 lut = texture(brdfLut, uv).rgb; + bsdf *= lut.b; /* Bsdf intensity */ bsdf *= M_1_2PI; + + /* Rough fresnel approximation using the LUT */ + lut.xy = normalize(lut.xy); + vec3 spec = bsdf * lut.y + f0 * bsdf * lut.x; #else float energy_conservation; vec3 L = mrp_area(ld, sd, sd.spec_dominant_dir, roughness, energy_conservation); @@ -161,8 +177,12 @@ float direct_ggx_rectangle(LightData ld, ShadingData sd, float roughness) /* fade mrp artifacts */ bsdf *= max(0.0, dot(-sd.spec_dominant_dir, ld.l_forward)); bsdf *= max(0.0, -dot(L, ld.l_forward)); + + /* Fresnel */ + float VH = max(dot(sd.V, normalize(sd.V + sd.L)), 0.0); + vec3 spec = F_schlick(f0, NV) * bsdf; #endif - return bsdf; + return spec; } #if 0 |