@@ -535,6 +535,7 @@ glUtils._regionsVS = `
535
535
#define MAX_NUM_IMAGES 192
536
536
537
537
uniform mat2 u_viewportTransform;
538
+ uniform vec2 u_canvasSize;
538
539
uniform int u_transformIndex;
539
540
uniform vec4 u_imageBounds;
540
541
uniform int u_numScanlines;
@@ -551,6 +552,7 @@ glUtils._regionsVS = `
551
552
out vec2 v_texCoord;
552
553
out vec2 v_localPos;
553
554
out float v_scanline;
555
+ flat out float v_pixelWidth;
554
556
555
557
void main()
556
558
{
@@ -568,6 +570,13 @@ glUtils._regionsVS = `
568
570
ndcPos.y = -ndcPos.y;
569
571
ndcPos = u_viewportTransform * ndcPos;
570
572
573
+ // Calculate pixel width in local coordinates. Need to do it here in the
574
+ // vertex shader, because using pixel derivatives in the fragment shader
575
+ // can cause broken stroke lines for large coordinates.
576
+ vec2 ndcPos2 = ndcPos + 0.7 / u_canvasSize;
577
+ mat2 viewportToLocal = inverse(u_viewportTransform * mat2(imageToViewport));
578
+ v_pixelWidth = length(viewportToLocal * (ndcPos2 - ndcPos));
579
+
571
580
gl_Position = vec4(ndcPos, 0.0, 1.0);
572
581
}
573
582
` ;
@@ -599,6 +608,7 @@ glUtils._regionsFS = `
599
608
in vec2 v_texCoord;
600
609
in vec2 v_localPos;
601
610
in float v_scanline;
611
+ flat in float v_pixelWidth;
602
612
603
613
layout(location = 0) out vec4 out_color;
604
614
@@ -625,7 +635,9 @@ glUtils._regionsFS = `
625
635
vec2 p = v_localPos; // Current sample position
626
636
int scanline = int(v_scanline);
627
637
628
- float pixelWidth = length(dFdx(p.xy));
638
+ // float pixelWidth = length(dFdx(p.xy)); // Can cause precision problems!
639
+ float pixelWidth = v_pixelWidth; // Safer
640
+
629
641
float strokeWidthPixels = u_regionStrokeWidth *
630
642
(u_regionFillRule == FILL_RULE_NEVER ? STROKE_WIDTH : STROKE_WIDTH_FILLED);
631
643
// For proper anti-aliasing, clamp stroke width to at least 1 pixel, and
@@ -2129,6 +2141,7 @@ glUtils._drawRegionsColorPass = function(gl, viewportTransform) {
2129
2141
2130
2142
// Set per-scene uniforms
2131
2143
gl . uniformMatrix2fv ( gl . getUniformLocation ( program , "u_viewportTransform" ) , false , viewportTransform ) ;
2144
+ gl . uniform2fv ( gl . getUniformLocation ( program , "u_canvasSize" ) , [ gl . canvas . width , gl . canvas . height ] ) ;
2132
2145
gl . uniform1i ( gl . getUniformLocation ( program , "u_transformIndex" ) , collectionIndex ) ;
2133
2146
gl . uniform4fv ( gl . getUniformLocation ( program , "u_imageBounds" ) , imageBounds ) ;
2134
2147
gl . uniform1i ( gl . getUniformLocation ( program , "u_numScanlines" ) , numScanlines ) ;
0 commit comments