p5.js webgl 多边形线关节解决方法?

p5.js webgl polygon line joints workaround?

关于在 p5.js WEBGL 模式下使用描边的自定义形状(使用 beginShape 函数): 在 WEBGL 模式下,lineJoint() 和 lineCap() 函数不可用。 这就是形状中的线条不能无缝连接的原因。 我尝试在我的自定义形状中使用轮廓来解决这个问题,但这也没有在 WEBGL 模式下实现。

还有其他方法可以让这些线路连接起来吗?

非常感谢!

Codepen 有问题: https://codepen.io/sebastianwinter/pen/eYNNEEx?editors=1010

轮廓不工作

function setup() { 
   createCanvas(window.innerWidth, window.innerHeight, WEBGL);
} 

function draw() { 

    let strokeSize = 20;
    background(2,8,51);
    smooth();
    noFill();
    strokeWeight(strokeSize);
    stroke(255,255,255);

    polygon(0, 0, 200, 7);
}

function polygon(x, y, radius, npoints) {
    let angle = TWO_PI / npoints;
    beginShape();
    for (let a = 0; a < TWO_PI; a += angle) {
        let sx = x + cos(a) * radius;
        let sy = y + sin(a) * radius;
        vertex(sx, sy);
    }
    /* not working:
    beginContour();
    for (let a = 0; a < TWO_PI; a += angle) {
        let sx = x + cos(a) * (radius - strokeSize);
        let sy = y + sin(a) * (radius - strokeSize);
        vertex(sx, sy);
    }
    endContour();*/
    endShape(CLOSE);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.10.2/p5.js"></script>

AFAIK p5.js' WEBGL 模式仍处于试验阶段,您在 2D 模式下习惯使用的一些功能仍然 in the works.

目前我可以建议一个 hacky 解决方法:使用内部形状,类似于 beginContour():

function setup() { 
 createCanvas(window.innerWidth, window.innerHeight, WEBGL);
} 


function draw() { 

 let strokeSize = 20;
 background(2,8,51);
 smooth();
 fill(255);
 //strokeJoin(BEVEL);
 //strokeWeight(1);
 stroke(255,255,255);

 polygon(0, 0, 200, 7, 0.85);
 
 
}


function polygon(x, y, radius, npoints, thicknessRatio) {
 let angle = TWO_PI / npoints;
 beginShape();
 //CW
 for (let a = 0; a <= TWO_PI; a += angle) {
  let sx = x + cos(a) * radius;
  let sy = y + sin(a) * radius;
  vertex(sx, sy);
 }
 // beginContour();
 // CCW
 for (let a = TWO_PI; a >= 0; a -= angle) {
  let sx = x + cos(a) * radius * thicknessRatio;
  let sy = y + sin(a) * radius * thicknessRatio;
  vertex(sx, sy);
 }
 // endContour();
 endShape(CLOSE);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.10.2/p5.min.js"></script>