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>2017-05-30 16:23:57 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-05-30 18:18:00 +0300
commit470d66397d579944d2cbc54e9596073015b4493e (patch)
treebdfdbe219e4c4f54b67ba3a1a4306058c0346674
parenteed26b25d2cabf39ceee76ed87fed51d03d5d360 (diff)
Eevee: Fix ggx sun light.
-rw-r--r--source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl22
-rw-r--r--source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl7
2 files changed, 19 insertions, 10 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 07fff8ac2d2..e91c4a4411b 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
@@ -20,6 +20,14 @@ float direct_diffuse_point(LightData ld, ShadingData sd)
return bsdf;
}
+/* infinitly far away point source, no decay */
+float direct_diffuse_sun(LightData ld, ShadingData sd)
+{
+ float bsdf = max(0.0, dot(sd.N, -ld.l_forward));
+ bsdf *= M_1_PI; /* Normalize */
+ return bsdf;
+}
+
/* From Frostbite PBR Course
* Analitical irradiance from a sphere with correct horizon handling
* http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf */
@@ -66,13 +74,6 @@ float direct_diffuse_rectangle(LightData ld, ShadingData sd)
return bsdf;
}
-/* infinitly far away point source, no decay */
-float direct_diffuse_sun(LightData ld, ShadingData sd)
-{
- float bsdf = max(0.0, dot(sd.N, -ld.l_forward));
- bsdf *= M_1_PI; /* Normalize */
- return bsdf;
-}
#if 0
float direct_diffuse_unit_disc(vec3 N, vec3 L)
@@ -94,6 +95,13 @@ vec3 direct_ggx_point(ShadingData sd, float roughness, vec3 f0)
return F_schlick(f0, VH) * bsdf;
}
+vec3 direct_ggx_sun(LightData ld, ShadingData sd, float roughness, vec3 f0)
+{
+ float bsdf = bsdf_ggx(sd.N, -ld.l_forward, sd.V, roughness);
+ float VH = max(dot(sd.V, normalize(sd.V - ld.l_forward)), 0.0);
+ return F_schlick(f0, VH) * bsdf;
+}
+
vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0)
{
vec3 L = normalize(sd.l_vector);
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 ca3cec62bdb..92069dc37e4 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -86,9 +86,9 @@ void light_shade(
{
#ifdef USE_LTC
if (ld.l_type == SUN) {
- diffuse = direct_diffuse_sun(ld, sd) * albedo;
/* TODO disk area light */
- specular = direct_ggx_point(sd, roughness, f0);
+ diffuse = direct_diffuse_sun(ld, sd) * albedo;
+ specular = direct_ggx_sun(ld, sd, roughness, f0);
}
else if (ld.l_type == AREA) {
diffuse = direct_diffuse_rectangle(ld, sd) * albedo;
@@ -101,11 +101,12 @@ void light_shade(
#else
if (ld.l_type == SUN) {
diffuse = direct_diffuse_sun(ld, sd) * albedo;
+ specular = direct_ggx_sun(ld, sd, roughness, f0);
}
else {
diffuse = direct_diffuse_point(ld, sd) * albedo;
+ specular = direct_ggx_point(sd, roughness, f0);
}
- specular = direct_ggx_point(sd, roughness, f0);
#endif
}