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:
authorLuca Rood <dev@lucarood.com>2017-06-14 13:39:57 +0300
committerLuca Rood <dev@lucarood.com>2017-06-14 15:04:36 +0300
commitc59abb4c9a371e709c4904ce87d74c5c6c8a0792 (patch)
treeebf85687cafff7973fccf57aaa28f8edbc1b95b8 /source/blender/draw/engines/eevee/shaders
parent0d9611718d89636d0d407555252b3a6a1d7ef2f9 (diff)
Implement hair in eevee
New implementation of hair for Eevee. Note: A hard coded "transmission" property is being used. This should eventually be exposed to the UI, possibly in the form of SSS properties.
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders')
-rw-r--r--source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl81
1 files changed, 79 insertions, 2 deletions
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 e361f08b26b..8f11835a1cc 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -88,11 +88,74 @@ vec4 texture_octahedron(sampler2DArray tex, vec4 cubevec)
return texture(tex, vec3(uvs, cubevec.w));
}
+#ifdef HAIR_SHADER
+vec3 light_diffuse(LightData ld, ShadingData sd, vec3 albedo)
+{
+ if (ld.l_type == SUN) {
+ return direct_diffuse_sun(ld, sd) * albedo;
+ }
+ else if (ld.l_type == AREA) {
+ return direct_diffuse_rectangle(ld, sd) * albedo;
+ }
+ else {
+ return direct_diffuse_sphere(ld, sd) * albedo;
+ }
+}
+
+vec3 light_specular(LightData ld, ShadingData sd, float roughness, vec3 f0)
+{
+ if (ld.l_type == SUN) {
+ return direct_ggx_sun(ld, sd, roughness, f0);
+ }
+ else if (ld.l_type == AREA) {
+ return direct_ggx_rectangle(ld, sd, roughness, f0);
+ }
+ else {
+ return direct_ggx_sphere(ld, sd, roughness, f0);
+ }
+}
void light_shade(
LightData ld, ShadingData sd, vec3 albedo, float roughness, vec3 f0,
out vec3 diffuse, out vec3 specular)
{
+ const float transmission = 0.3; /* Uniform internal scattering factor */
+ ShadingData sd_new = sd;
+
+ vec3 lamp_vec;
+
+ if (ld.l_type == SUN || ld.l_type == AREA) {
+ lamp_vec = ld.l_forward;
+ }
+ else {
+ lamp_vec = -sd.l_vector;
+ }
+
+ vec3 norm_view = cross(sd.V, sd.N);
+ norm_view = normalize(cross(norm_view, sd.N)); /* Normal facing view */
+
+ vec3 norm_lamp = cross(lamp_vec, sd.N);
+ norm_lamp = normalize(cross(sd.N, norm_lamp)); /* Normal facing lamp */
+
+ /* Rotate view vector onto the cross(tangent, light) plane */
+ vec3 view_vec = normalize(norm_lamp * dot(norm_view, sd.V) + sd.N * dot(sd.N, sd.V));
+
+ float occlusion = (dot(norm_view, norm_lamp) * 0.5 + 0.5);
+ float occltrans = transmission + (occlusion * (1.0 - transmission)); /* Includes transmission component */
+
+ sd_new.N = -norm_lamp;
+
+ diffuse = light_diffuse(ld, sd_new, albedo) * occltrans;
+
+ sd_new.V = view_vec;
+
+ specular = light_specular(ld, sd_new, roughness, f0) * occlusion;
+}
+#else
+void light_shade(
+ LightData ld, ShadingData sd, vec3 albedo, float roughness, vec3 f0,
+ out vec3 diffuse, out vec3 specular)
+{
#ifdef USE_LTC
if (ld.l_type == SUN) {
/* TODO disk area light */
@@ -118,6 +181,7 @@ void light_shade(
}
#endif
}
+#endif
void light_visibility(LightData ld, ShadingData sd, out float vis)
{
@@ -254,20 +318,33 @@ vec3 eevee_surface_lit(vec3 world_normal, vec3 albedo, vec3 f0, float roughness,
sd.W = worldPosition;
vec3 radiance = vec3(0.0);
+
+#ifdef HAIR_SHADER
+ /* View facing normal */
+ vec3 norm_view = cross(sd.V, sd.N);
+ norm_view = normalize(cross(norm_view, sd.N)); /* Normal facing view */
+#endif
+
+
/* Analitic Lights */
for (int i = 0; i < MAX_LIGHT && i < light_count; ++i) {
LightData ld = lights_data[i];
vec3 diff, spec;
- float vis;
+ float vis = 1.0;
sd.l_vector = ld.l_position - worldPosition;
+#ifndef HAIR_SHADER
light_visibility(ld, sd, vis);
+#endif
light_shade(ld, sd, albedo, roughnessSquared, f0, diff, spec);
radiance += vis * (diff + spec) * ld.l_color;
}
+#ifdef HAIR_SHADER
+ sd.N = -norm_view;
+#endif
/* Envmaps */
vec3 R = reflect(-sd.V, sd.N);
@@ -314,4 +391,4 @@ vec3 eevee_surface_lit(vec3 world_normal, vec3 albedo, vec3 f0, float roughness,
diff_accum.rgb * albedo;
return radiance + indirect_radiance * ao;
-} \ No newline at end of file
+}