[Bf-blender-cvs] [566a4a96cb5] blender2.8: Fix T57891: Radius of strip hair doesn't scale with object scale

Clément Foucault noreply at git.blender.org
Tue Nov 20 13:31:56 CET 2018


Commit: 566a4a96cb516d7e7981cf78d24fcb7546deaaf4
Author: Clément Foucault
Date:   Mon Nov 19 18:24:08 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB566a4a96cb516d7e7981cf78d24fcb7546deaaf4

Fix T57891: Radius of strip hair doesn't scale with object scale

Note that this only works fine with uniformly scaled objects.
Otherwise, the hair thickness will vary in a weird way depending on viewing
angles.

===================================================================

M	source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
M	source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/modes/shaders/common_hair_lib.glsl

===================================================================

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 142afa5705b..a6e6f1fac42 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
@@ -52,6 +52,7 @@ void main()
 	vec3 pos, binor;
 	hair_get_pos_tan_binor_time(
 	        (ProjectionMatrix[3][3] == 0.0),
+	        ModelMatrixInverse,
 	        ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz,
 	        pos, hairTangent, binor, hairTime, hairThickness, hairThickTime);
 
diff --git a/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl b/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
index e110937c5aa..1a8dbc97317 100644
--- a/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
@@ -1,6 +1,7 @@
 
 uniform mat4 ModelViewProjectionMatrix;
 uniform mat4 ModelMatrix;
+uniform mat4 ModelMatrixInverse;
 
 #ifdef CLIP_PLANES
 /* keep in sync with DRWManager.view_data */
@@ -20,6 +21,7 @@ void main()
 	vec3 pos, tan, binor;
 	hair_get_pos_tan_binor_time(
 	        (ProjectionMatrix[3][3] == 0.0),
+	        ModelMatrixInverse,
 	        ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz,
 	        pos, tan, binor, time, thickness, thick_time);
 
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 66b529fcf5e..62040da8524 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -1,4 +1,5 @@
 uniform mat4 ModelViewProjectionMatrix;
+uniform mat4 ModelMatrixInverse;
 uniform mat4 ProjectionMatrix;
 uniform mat4 ViewProjectionMatrix;
 uniform mat4 ViewMatrixInverse;
@@ -41,6 +42,7 @@ void main()
 	vec3 pos, tan, binor;
 	hair_get_pos_tan_binor_time(
 	        (ProjectionMatrix[3][3] == 0.0),
+	        ModelMatrixInverse,
 	        ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz,
 	        pos, tan, binor, time, thickness, thick_time);
 	/* To "simulate" anisotropic shading, randomize hair normal per strand. */
diff --git a/source/blender/draw/modes/shaders/common_hair_lib.glsl b/source/blender/draw/modes/shaders/common_hair_lib.glsl
index e272db02318..c0c5f84d166 100644
--- a/source/blender/draw/modes/shaders/common_hair_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_hair_lib.glsl
@@ -135,7 +135,7 @@ float hair_shaperadius(float shape, float root, float tip, float time)
 }
 
 void hair_get_pos_tan_binor_time(
-        bool is_persp, vec3 camera_pos, vec3 camera_z,
+        bool is_persp, mat4 invmodel_mat, vec3 camera_pos, vec3 camera_z,
         out vec3 wpos, out vec3 wtan, out vec3 wbinor, out float time, out float thickness, out float thick_time)
 {
 	int id = hair_get_base_id();
@@ -159,7 +159,11 @@ void hair_get_pos_tan_binor_time(
 		thick_time = float(gl_VertexID % hairThicknessRes) / float(hairThicknessRes - 1);
 		thick_time = thickness * (thick_time * 2.0 - 1.0);
 
-		wpos += wbinor * thick_time;
+		/* Take object scale into account.
+		 * NOTE: This only works fine with uniform scaling. */
+		float scale = 1.0 / length(mat3(invmodel_mat) * wbinor);
+
+		wpos += wbinor * thick_time * scale;
 	}
 }



More information about the Bf-blender-cvs mailing list