diff options
4 files changed, 18 insertions, 1 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index 704b039e0f6..a1890433b0f 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -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 */ 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 ad975957be9..daeef1dbf01 100644 --- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl @@ -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 diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl index 611a561c750..58bcea7d605 100644 --- a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl @@ -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), diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 9c04aef894c..6f253a48f86 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -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; |