mirror of
https://github.com/3b1b/manim.git
synced 2025-07-31 22:13:30 +08:00
Minor simplifications for stroke shader
This commit is contained in:
@ -20,7 +20,7 @@ uniform float reflectiveness;
|
|||||||
uniform float gloss;
|
uniform float gloss;
|
||||||
uniform float shadow;
|
uniform float shadow;
|
||||||
|
|
||||||
in vec3 bp[3];
|
in vec3 verts[3];
|
||||||
|
|
||||||
in float v_joint_angle[3];
|
in float v_joint_angle[3];
|
||||||
in float v_stroke_width[3];
|
in float v_stroke_width[3];
|
||||||
@ -59,24 +59,6 @@ const float DISJOINT_CONST = 404.0;
|
|||||||
#INSERT finalize_color.glsl
|
#INSERT finalize_color.glsl
|
||||||
|
|
||||||
|
|
||||||
void flatten_points(in vec3[3] points, out vec2[3] flat_points){
|
|
||||||
for(int i = 0; i < 3; i++){
|
|
||||||
float sf = perspective_scale_factor(points[i].z, focal_distance);
|
|
||||||
flat_points[i] = sf * points[i].xy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
float angle_between_vectors(vec2 v1, vec2 v2){
|
|
||||||
float v1_norm = length(v1);
|
|
||||||
float v2_norm = length(v2);
|
|
||||||
if(v1_norm == 0 || v2_norm == 0) return 0.0;
|
|
||||||
float dp = dot(v1, v2) / (v1_norm * v2_norm);
|
|
||||||
float angle = acos(clamp(dp, -1.0, 1.0));
|
|
||||||
float sn = sign(cross2d(v1, v2));
|
|
||||||
return sn * angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool find_intersection(vec2 p0, vec2 v0, vec2 p1, vec2 v1, out vec2 intersection){
|
bool find_intersection(vec2 p0, vec2 v0, vec2 p1, vec2 v1, out vec2 intersection){
|
||||||
// Find the intersection of a line passing through
|
// Find the intersection of a line passing through
|
||||||
@ -160,24 +142,6 @@ int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 c
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void set_adjascent_info(vec2 c0, vec2 tangent,
|
|
||||||
int degree,
|
|
||||||
vec2 adj[3],
|
|
||||||
out float bevel,
|
|
||||||
out float angle
|
|
||||||
){
|
|
||||||
bool linear_adj = (angle_between_vectors(adj[1] - adj[0], adj[2] - adj[1]) < 1e-3);
|
|
||||||
angle = angle_between_vectors(c0 - adj[1], tangent);
|
|
||||||
// Decide on joint type
|
|
||||||
bool one_linear = (degree == 1 || linear_adj);
|
|
||||||
bool should_bevel = (
|
|
||||||
(joint_type == AUTO_JOINT && one_linear) ||
|
|
||||||
joint_type == BEVEL_JOINT
|
|
||||||
);
|
|
||||||
bevel = should_bevel ? 1.0 : 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void find_joint_info(){
|
void find_joint_info(){
|
||||||
angle_from_prev = v_joint_angle[0];
|
angle_from_prev = v_joint_angle[0];
|
||||||
angle_to_next = v_joint_angle[2];
|
angle_to_next = v_joint_angle[2];
|
||||||
@ -201,20 +165,15 @@ void find_joint_info(){
|
|||||||
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
// Convert control points to a standard form if they are linear or null
|
bezier_degree = (abs(v_joint_angle[1]) < 1e-3) ? 1.0 : 2.0;
|
||||||
vec3 controls[3];
|
unit_normal = get_unit_normal(vec3[3](verts[0], verts[1], verts[2]));
|
||||||
bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), controls);
|
|
||||||
if(bezier_degree == 0.0) return; // Null curve
|
|
||||||
int degree = int(bezier_degree);
|
|
||||||
unit_normal = get_unit_normal(controls);
|
|
||||||
|
|
||||||
|
|
||||||
// Adjust stroke width based on distance from the camera
|
// Adjust stroke width based on distance from the camera
|
||||||
float scaled_strokes[3];
|
float scaled_strokes[3];
|
||||||
for(int i = 0; i < 3; i++){
|
for(int i = 0; i < 3; i++){
|
||||||
float sf = perspective_scale_factor(controls[i].z, focal_distance);
|
float sf = perspective_scale_factor(verts[i].z, focal_distance);
|
||||||
if(bool(flat_stroke)){
|
if(bool(flat_stroke)){
|
||||||
vec3 to_cam = normalize(vec3(0.0, 0.0, focal_distance) - controls[i]);
|
vec3 to_cam = normalize(vec3(0.0, 0.0, focal_distance) - verts[i]);
|
||||||
sf *= abs(dot(unit_normal, to_cam));
|
sf *= abs(dot(unit_normal, to_cam));
|
||||||
}
|
}
|
||||||
scaled_strokes[i] = v_stroke_width[i] * sf;
|
scaled_strokes[i] = v_stroke_width[i] * sf;
|
||||||
@ -224,14 +183,21 @@ void main() {
|
|||||||
// gets tranlated to a uv plane. The z-coordinate information will be remembered
|
// gets tranlated to a uv plane. The z-coordinate information will be remembered
|
||||||
// by what's sent out to gl_Position, and by how it affects the lighting and stroke width
|
// by what's sent out to gl_Position, and by how it affects the lighting and stroke width
|
||||||
vec2 flat_controls[3];
|
vec2 flat_controls[3];
|
||||||
flatten_points(controls, flat_controls);
|
for(int i = 0; i < 3; i++){
|
||||||
|
float sf = perspective_scale_factor(verts[i].z, focal_distance);
|
||||||
|
flat_controls[i] = sf * verts[i].xy;
|
||||||
|
}
|
||||||
|
// If the curve is flat, put the middle control in the midpoint
|
||||||
|
if (bezier_degree == 1.0){
|
||||||
|
flat_controls[1] = 0.5 * (flat_controls[0] + flat_controls[2]);
|
||||||
|
}
|
||||||
|
|
||||||
// Set joint angles, etc.
|
// Set joint angles, etc.
|
||||||
find_joint_info();
|
find_joint_info();
|
||||||
|
|
||||||
// Corners of a bounding region around curve
|
// Corners of a bounding region around curve
|
||||||
vec2 corners[5];
|
vec2 corners[5];
|
||||||
int n_corners = get_corners(flat_controls, degree, scaled_strokes, corners);
|
int n_corners = get_corners(flat_controls, int(bezier_degree), scaled_strokes, corners);
|
||||||
|
|
||||||
int index_map[5] = int[5](0, 0, 1, 2, 2);
|
int index_map[5] = int[5](0, 0, 1, 2, 2);
|
||||||
if(n_corners == 4) index_map[2] = 2;
|
if(n_corners == 4) index_map[2] = 2;
|
||||||
@ -247,8 +213,7 @@ void main() {
|
|||||||
uv_coords = (xy_to_uv * vec3(corners[i], 1.0)).xy;
|
uv_coords = (xy_to_uv * vec3(corners[i], 1.0)).xy;
|
||||||
uv_stroke_width = scaled_strokes[index_map[i]] / scale_factor;
|
uv_stroke_width = scaled_strokes[index_map[i]] / scale_factor;
|
||||||
// Apply some lighting to the color before sending out.
|
// Apply some lighting to the color before sending out.
|
||||||
// vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z);
|
vec3 xyz_coords = vec3(corners[i], verts[index_map[i]].z);
|
||||||
vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z);
|
|
||||||
color = finalize_color(
|
color = finalize_color(
|
||||||
v_color[index_map[i]],
|
v_color[index_map[i]],
|
||||||
xyz_coords,
|
xyz_coords,
|
||||||
@ -261,7 +226,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
gl_Position = vec4(
|
gl_Position = vec4(
|
||||||
get_gl_Position(vec3(corners[i], 0.0)).xy,
|
get_gl_Position(vec3(corners[i], 0.0)).xy,
|
||||||
get_gl_Position(controls[index_map[i]]).zw
|
get_gl_Position(verts[index_map[i]]).zw
|
||||||
);
|
);
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ in float stroke_width;
|
|||||||
in vec4 color;
|
in vec4 color;
|
||||||
|
|
||||||
// Bezier control point
|
// Bezier control point
|
||||||
out vec3 bp;
|
out vec3 verts;
|
||||||
|
|
||||||
out float v_joint_angle;
|
out float v_joint_angle;
|
||||||
out float v_stroke_width;
|
out float v_stroke_width;
|
||||||
@ -20,7 +20,7 @@ const float STROKE_WIDTH_CONVERSION = 0.01;
|
|||||||
#INSERT position_point_into_frame.glsl
|
#INSERT position_point_into_frame.glsl
|
||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
bp = position_point_into_frame(point);
|
verts = position_point_into_frame(point);
|
||||||
|
|
||||||
v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width * frame_shape[1] / 8.0;
|
v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width * frame_shape[1] / 8.0;
|
||||||
v_joint_angle = joint_angle;
|
v_joint_angle = joint_angle;
|
||||||
|
Reference in New Issue
Block a user