[Bf-blender-cvs] [007a2e0] strand_gpu: Common control curve interpolation utility function.

Lukas Tönne noreply at git.blender.org
Wed Jul 13 14:01:39 CEST 2016


Commit: 007a2e09c08e552f96650dc148d5b054775e26d2
Author: Lukas Tönne
Date:   Tue Jul 12 13:00:46 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB007a2e09c08e552f96650dc148d5b054775e26d2

Common control curve interpolation utility function.

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

M	source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
M	source/blender/gpu/shaders/gpu_shader_strand_util.glsl
M	source/blender/gpu/shaders/gpu_shader_strand_vert.glsl

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

diff --git a/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl b/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
index a5ccb80..35019fd 100644
--- a/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
@@ -86,15 +86,13 @@ void main()
 			if (!valid[k])
 				continue;
 
-			int ci0 = min(int(t[k]), num_cverts[k] - 2);
-			int ci1 = ci0 + 1;
-			float lambda = t[k] - float(ci0);
-			/* XXX could use texture filtering to do this for us? */
-			vec3 next_cloc0 = texelFetch(control_points, cvert_begin[k] + ci0).xyz;
-			vec3 next_cloc1 = texelFetch(control_points, cvert_begin[k] + ci1).xyz;
-			vec3 next_cloc = mix(next_cloc0, next_cloc1, lambda) + offset[k];
-
-			next_loc += weight[k] * next_cloc;
+			vec3 cloc;
+			vec3 ctangent;
+			mat3 cframe;
+			interpolate_control_curve(control_points, control_normals, control_tangents,
+				                      t[k], cvert_begin[k], num_cverts[k], cloc, ctangent, cframe);
+
+			next_loc += weight[k] * cloc;
 			t[k] += dt[k];
 		}
 
diff --git a/source/blender/gpu/shaders/gpu_shader_strand_util.glsl b/source/blender/gpu/shaders/gpu_shader_strand_util.glsl
index 433e24d..ca06166 100644
--- a/source/blender/gpu/shaders/gpu_shader_strand_util.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_strand_util.glsl
@@ -4,3 +4,23 @@ mat3 mat3_emu(mat4 m4) {
       m4[1][0], m4[1][1], m4[1][2],
       m4[2][0], m4[2][1], m4[2][2]);
 }
+
+void interpolate_control_curve(in samplerBuffer control_points,
+	                           in samplerBuffer control_normals,
+	                           in samplerBuffer control_tangents,
+	                           in float param, in int verts_begin, in int num_verts,
+	                           out vec3 loc, out vec3 tangent, out mat3 frame)
+{
+	int idx0 = min(int(param), num_verts - 2);
+	int idx1 = idx0 + 1;
+	float lambda = param - float(idx0);
+	vec3 loc0 = texelFetch(control_points, verts_begin + idx0).xyz;
+	vec3 loc1 = texelFetch(control_points, verts_begin + idx1).xyz;
+	
+	/* XXX could use texture filtering to do this for us? */
+	loc = mix(loc0, loc1, lambda);
+	tangent = loc1 - loc0;
+	frame = mat3(1.0, 0.0, 0.0,
+		         0.0, 1.0, 0.0,
+		         0.0, 0.0, 1.0);
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl b/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
index 7a6c868..7034e1a 100644
--- a/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
@@ -57,22 +57,21 @@ void main()
 		uvec2 curve = texelFetch(control_curves, int(control_index[k])).xy;
 		int verts_begin = int(curve.x);
 		int num_verts = int(curve.y);
+		float segment = curve_param * float(num_verts);
 
 		vec3 croot = texelFetch(control_points, verts_begin).xyz;
 		vec3 offset = root - croot;
 		if (k == 0)
 			offset0 = offset;
 
-		float segment = curve_param * float(num_verts);
-		int idx0 = min(int(segment), num_verts - 2);
-		int idx1 = idx0 + 1;
-		float lambda = segment - float(idx0);
-		vec3 cloc0 = texelFetch(control_points, verts_begin + idx0).xyz;
-		vec3 cloc1 = texelFetch(control_points, verts_begin + idx1).xyz;
-		vec3 cloc = mix(cloc0, cloc1, lambda) + offset;
+		vec3 cloc;
+		vec3 ctangent;
+		mat3 cframe;
+		interpolate_control_curve(control_points, control_normals, control_tangents,
+			                      segment, verts_begin, num_verts, cloc, ctangent, cframe);
 
-		loc += control_weight[k] * cloc;
-		tangent += control_weight[k] * (cloc1 - cloc0);
+		loc += control_weight[k] * (cloc + offset);
+		tangent += control_weight[k] * ctangent;
 	}
 
 	displace_vertex(loc, curve_param, offset0, mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0), vec2(0.0, 0.0));




More information about the Bf-blender-cvs mailing list