Eevee: Add support for hair random property.
authorClément Foucault <foucault.clem@gmail.com>
Sat, 2 Jun 2018 07:25:23 +0000 (09:25 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Sat, 2 Jun 2018 19:16:40 +0000 (21:16 +0200)
Do note that it does not match cycles implementation.

Also we could precompute the hash per strand before rendering but that would
suggest it's not per engine specific.

If we make the random value internal to blender then it won't be a matter
because other renderers will have access to the same value.

source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
source/blender/gpu/shaders/gpu_shader_material.glsl

index 704b039..a189043 100644 (file)
@@ -143,6 +143,20 @@ vec2 mip_ratio_interp(float mip) {
        float low_mip = floor(mip);
        return mix(mipRatio[int(low_mip)], mipRatio[int(low_mip + 1.0)], mip - low_mip);
 }
+
+/* ------- RNG ------- */
+
+float wang_hash_noise(uint s)
+{
+       s = (s ^ 61u) ^ (s >> 16u);
+       s *= 9u;
+       s = s ^ (s >> 4u);
+       s *= 0x27d4eb2du;
+       s = s ^ (s >> 15u);
+
+       return fract(float(s) / 4294967296.0);
+}
+
 /* ------- Fast Math ------- */
 
 /* [Drobot2014a] Low Level Optimizations for GCN */
index ad97595..daeef1d 100644 (file)
@@ -26,6 +26,7 @@ in vec3 hairTangent; /* world space */
 in float hairThickTime;
 in float hairThickness;
 in float hairTime;
+flat in int hairStrandID;
 
 uniform int hairThicknessRes = 1;
 #endif
index 611a561..58bcea7 100644 (file)
@@ -35,11 +35,13 @@ out vec3 hairTangent;
 out float hairThickTime;
 out float hairThickness;
 out float hairTime;
+flat out int hairStrandID;
 #endif
 
 void main()
 {
 #ifdef HAIR_SHADER
+       hairStrandID = hair_get_strand_id();
        vec3 pos, binor;
        hair_get_pos_tan_binor_time(
                (ProjectionMatrix[3][3] == 0.0),
index 9c04aef..6f253a4 100644 (file)
@@ -2486,7 +2486,7 @@ void node_hair_info(out float is_strand, out float intercept, out float thicknes
        intercept = hairTime;
        thickness = hairThickness;
        tangent = normalize(hairTangent);
-       random = 0.0;
+       random = wang_hash_noise(uint(hairStrandID)); /* TODO: could be precomputed per strand instead. */
 #else
        is_strand = 0.0;
        intercept = 0.0;