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:
authorCampbell Barton <ideasman42@gmail.com>2017-10-09 12:49:27 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-10-09 12:49:27 +0300
commita5b4b0f21c1ae8c96e4fea9abdcfac2fab1cf300 (patch)
tree0658d8bdfb8ec03652aa04f82ee8a4d243ec6370 /source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
parentd68f698cf0321477c0734474150eb4bc43c4e85f (diff)
parentabcda06934aba054de8540b66b13c2bbc5f8f515 (diff)
Merge branch '28' into custom-manipulatorscustom-manipulators
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.glsl106
1 files changed, 54 insertions, 52 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 a1a5fab03af..d0a365f5a3e 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
@@ -11,32 +11,32 @@
/* ------------ Diffuse ------------- */
-float direct_diffuse_point(LightData ld, ShadingData sd)
+float direct_diffuse_point(vec3 N, vec4 l_vector)
{
- float dist = length(sd.l_vector);
- vec3 L = sd.l_vector / dist;
- float bsdf = max(0.0, dot(sd.N, L));
+ float dist = l_vector.w;
+ vec3 L = l_vector.xyz / dist;
+ float bsdf = max(0.0, dot(N, L));
bsdf /= dist * dist;
return bsdf;
}
/* infinitly far away point source, no decay */
-float direct_diffuse_sun(LightData ld, ShadingData sd)
+float direct_diffuse_sun(LightData ld, vec3 N)
{
- float bsdf = max(0.0, dot(sd.N, -ld.l_forward));
+ float bsdf = max(0.0, dot(N, -ld.l_forward));
bsdf *= M_1_PI; /* Normalize */
return bsdf;
}
/* From Frostbite PBR Course
- * Analitical irradiance from a sphere with correct horizon handling
+ * Analytical irradiance from a sphere with correct horizon handling
* http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf */
-float direct_diffuse_sphere(LightData ld, ShadingData sd)
+float direct_diffuse_sphere(LightData ld, vec3 N, vec4 l_vector)
{
- float dist = length(sd.l_vector);
- vec3 L = sd.l_vector / dist;
+ float dist = l_vector.w;
+ vec3 L = l_vector.xyz / dist;
float radius = max(ld.l_sizex, 0.0001);
- float costheta = clamp(dot(sd.N, L), -0.999, 0.999);
+ float costheta = clamp(dot(N, L), -0.999, 0.999);
float h = min(ld.l_radius / dist , 0.9999);
float h2 = h*h;
float costheta2 = costheta * costheta;
@@ -61,15 +61,15 @@ float direct_diffuse_sphere(LightData ld, ShadingData sd)
/* From Frostbite PBR Course
* http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf */
-float direct_diffuse_rectangle(LightData ld, ShadingData sd)
+float direct_diffuse_rectangle(LightData ld, vec3 N, vec3 V, vec4 l_vector)
{
vec3 corners[4];
- corners[0] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey;
- corners[1] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey;
- corners[2] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey;
- corners[3] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey;
+ corners[0] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey;
+ corners[1] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey;
+ corners[2] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey;
+ corners[3] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey;
- float bsdf = ltc_evaluate(sd.N, sd.V, mat3(1.0), corners);
+ float bsdf = ltc_evaluate(N, V, mat3(1.0), corners);
bsdf *= M_1_2PI;
return bsdf;
}
@@ -83,35 +83,37 @@ float direct_diffuse_unit_disc(vec3 N, vec3 L)
#endif
/* ----------- GGx ------------ */
-vec3 direct_ggx_point(ShadingData sd, float roughness, vec3 f0)
+vec3 direct_ggx_point(vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0)
{
- float dist = length(sd.l_vector);
- vec3 L = sd.l_vector / dist;
- float bsdf = bsdf_ggx(sd.N, L, sd.V, roughness);
+ roughness = max(1e-3, roughness);
+ float dist = l_vector.w;
+ vec3 L = l_vector.xyz / dist;
+ float bsdf = bsdf_ggx(N, L, V, roughness);
bsdf /= dist * dist;
/* Fresnel */
- float VH = max(dot(sd.V, normalize(sd.V + L)), 0.0);
+ float VH = max(dot(V, normalize(V + L)), 0.0);
return F_schlick(f0, VH) * bsdf;
}
-vec3 direct_ggx_sun(LightData ld, ShadingData sd, float roughness, vec3 f0)
+vec3 direct_ggx_sun(LightData ld, vec3 N, vec3 V, 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);
+ roughness = max(1e-3, roughness);
+ float bsdf = bsdf_ggx(N, -ld.l_forward, V, roughness);
+ float VH = dot(V, -ld.l_forward) * 0.5 + 0.5;
return F_schlick(f0, VH) * bsdf;
}
-vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0)
+vec3 direct_ggx_sphere(LightData ld, vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0)
{
- vec3 L = normalize(sd.l_vector);
- vec3 spec_dir = get_specular_dominant_dir(sd.N, reflect(-sd.V, sd.N), roughness);
- vec3 P = line_aligned_plane_intersect(vec3(0.0), spec_dir, sd.l_vector);
+ vec3 L = l_vector.xyz / l_vector.w;
+ vec3 spec_dir = get_specular_reflection_dominant_dir(N, V, roughness);
+ vec3 P = line_aligned_plane_intersect(vec3(0.0), spec_dir, l_vector.xyz);
- vec3 Px = normalize(P - sd.l_vector) * ld.l_radius;
+ vec3 Px = normalize(P - l_vector.xyz) * ld.l_radius;
vec3 Py = cross(Px, L);
- vec2 uv = lut_coords(dot(sd.N, sd.V), sqrt(roughness));
+ vec2 uv = lut_coords(dot(N, V), sqrt(roughness));
vec3 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rgb;
vec4 ltc_lut = texture(utilTex, vec3(uv, 0.0)).rgba;
mat3 ltc_mat = ltc_matrix(ltc_lut);
@@ -123,22 +125,22 @@ vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0)
/* counter clockwise */
vec3 points[8];
- points[0] = sd.l_vector + Px;
- points[1] = sd.l_vector - Pxy2;
- points[2] = sd.l_vector - Py;
- points[3] = sd.l_vector - Pxy1;
- points[4] = sd.l_vector - Px;
- points[5] = sd.l_vector + Pxy2;
- points[6] = sd.l_vector + Py;
- points[7] = sd.l_vector + Pxy1;
- float bsdf = ltc_evaluate_circle(sd.N, sd.V, ltc_mat, points);
+ points[0] = l_vector.xyz + Px;
+ points[1] = l_vector.xyz - Pxy2;
+ points[2] = l_vector.xyz - Py;
+ points[3] = l_vector.xyz - Pxy1;
+ points[4] = l_vector.xyz - Px;
+ points[5] = l_vector.xyz + Pxy2;
+ points[6] = l_vector.xyz + Py;
+ points[7] = l_vector.xyz + Pxy1;
+ float bsdf = ltc_evaluate_circle(N, V, ltc_mat, points);
#else
vec3 points[4];
- points[0] = sd.l_vector + Px;
- points[1] = sd.l_vector - Py;
- points[2] = sd.l_vector - Px;
- points[3] = sd.l_vector + Py;
- float bsdf = ltc_evaluate(sd.N, sd.V, ltc_mat, points);
+ points[0] = l_vector.xyz + Px;
+ points[1] = l_vector.xyz - Py;
+ points[2] = l_vector.xyz - Px;
+ points[3] = l_vector.xyz + Py;
+ float bsdf = ltc_evaluate(N, V, ltc_mat, points);
/* sqrt(pi/2) difference between square and disk area */
bsdf *= 1.25331413731;
#endif
@@ -151,19 +153,19 @@ vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0)
return spec;
}
-vec3 direct_ggx_rectangle(LightData ld, ShadingData sd, float roughness, vec3 f0)
+vec3 direct_ggx_rectangle(LightData ld, vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0)
{
vec3 corners[4];
- corners[0] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey;
- corners[1] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey;
- corners[2] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey;
- corners[3] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey;
+ corners[0] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey;
+ corners[1] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey;
+ corners[2] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey;
+ corners[3] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey;
- vec2 uv = lut_coords(dot(sd.N, sd.V), sqrt(roughness));
+ vec2 uv = lut_coords(dot(N, V), sqrt(roughness));
vec3 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rgb;
vec4 ltc_lut = texture(utilTex, vec3(uv, 0.0)).rgba;
mat3 ltc_mat = ltc_matrix(ltc_lut);
- float bsdf = ltc_evaluate(sd.N, sd.V, ltc_mat, corners);
+ float bsdf = ltc_evaluate(N, V, ltc_mat, corners);
bsdf *= brdf_lut.b; /* Bsdf intensity */
bsdf *= M_1_2PI;