[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