From acb4b1c6b3e12422c94ffc31a1fb61594543e9ac Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Thu, 2 Feb 2023 12:04:23 -0800 Subject: [PATCH] Finalize color at the vertex level, rather than the fragment level, for fill --- manimlib/shaders/quadratic_bezier_fill/frag.glsl | 14 ++++++-------- manimlib/shaders/quadratic_bezier_fill/geom.glsl | 10 ++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/manimlib/shaders/quadratic_bezier_fill/frag.glsl b/manimlib/shaders/quadratic_bezier_fill/frag.glsl index 22d0edfb..4cfed975 100644 --- a/manimlib/shaders/quadratic_bezier_fill/frag.glsl +++ b/manimlib/shaders/quadratic_bezier_fill/frag.glsl @@ -6,16 +6,12 @@ in vec4 color; in float fill_all; in float orientation; in vec2 uv_coords; -in vec3 point; -in vec3 unit_normal; out vec4 frag_color; -#INSERT finalize_color.glsl - void main() { if (color.a == 0) discard; - frag_color = finalize_color(color, point, unit_normal); + frag_color = color; /* We want negatively oriented triangles to be canceled with positively oriented ones. The easiest way to do this is to give them negative alpha, @@ -33,9 +29,11 @@ void main() { cap is to make sure the original fragment color can be recovered even after blending with an (alpha = 1) color. */ - float a = 0.95 * frag_color.a; - if(winding && orientation < 0) a = -a / (1 - a); - frag_color.a = a; + if(winding){ + float a = 0.95 * frag_color.a; + if(orientation < 0) a = -a / (1 - a); + frag_color.a = a; + } if (bool(fill_all)) return; diff --git a/manimlib/shaders/quadratic_bezier_fill/geom.glsl b/manimlib/shaders/quadratic_bezier_fill/geom.glsl index c9428e67..99e10049 100644 --- a/manimlib/shaders/quadratic_bezier_fill/geom.glsl +++ b/manimlib/shaders/quadratic_bezier_fill/geom.glsl @@ -14,8 +14,6 @@ in vec3 v_unit_normal[3]; out vec4 color; out float fill_all; out float orientation; -out vec3 point; -out vec3 unit_normal; // uv space is where the curve coincides with y = x^2 out vec2 uv_coords; @@ -28,9 +26,12 @@ const vec2 SIMPLE_QUADRATIC[3] = vec2[3]( // Analog of import for manim only #INSERT emit_gl_Position.glsl +#INSERT finalize_color.glsl void emit_triangle(vec3 points[3], vec4 v_color[3]){ + vec3 unit_normal = v_unit_normal[1]; + orientation = sign(determinant(mat3( unit_normal, points[1] - points[0], @@ -39,8 +40,7 @@ void emit_triangle(vec3 points[3], vec4 v_color[3]){ for(int i = 0; i < 3; i++){ uv_coords = SIMPLE_QUADRATIC[i]; - color = v_color[i]; - point = points[i]; + color = finalize_color(v_color[i], points[i], unit_normal); emit_gl_Position(points[i]); EmitVertex(); } @@ -61,8 +61,6 @@ void main(){ // the first anchor is set equal to that anchor if (verts[0] == verts[1]) return; - unit_normal = v_unit_normal[1]; - if(winding){ // Emit main triangle fill_all = 1.0;