Pencil Filter

SVG displacement filter that gives geometry a hand-drawn pencil feel.

Parameters
120
5
0.38
1.25
Display
Camera
  const geometryGroup = scene.geometry.group();
  scene.enableFilter(true);
  scene.setFilterIntensity(filterIntensity); // reactive state

  const ROSE = "#e11d48";
  const roseFillId = scene.addHatchFill(ROSE);
  const roseStroke = ROSE;

  const starStartAngle = Math.PI / 2;
  scene.draw((p) => {
    const { size, points, innerRadiusRatio } = p;
    const path = geometryGroup.path({
      stroke: roseStroke,
      fill: roseFillId,
    });
    const pointCount = Math.max(3, Math.floor(points));
    const step = Math.PI / pointCount;
    const outerRadius = size;
    const innerRadius = size * innerRadiusRatio;
    const startX = outerRadius * Math.cos(starStartAngle);
    const startY = outerRadius * Math.sin(starStartAngle);

    // outer point 1
    path.moveToAbs(startX, startY);

    let previousX = startX;
    let previousY = startY;

    for (let vertexIndex = 1; vertexIndex < pointCount * 2; vertexIndex++) {
      const isOuterPoint = vertexIndex % 2 === 0;
      const pointRadius = isOuterPoint ? outerRadius : innerRadius;
      const pointAngle = starStartAngle + step * vertexIndex;
      const pointX = pointRadius * Math.cos(pointAngle);
      const pointY = pointRadius * Math.sin(pointAngle);

      path.lineTo(pointX - previousX, pointY - previousY);

      previousX = pointX;
      previousY = pointY;
    }

    // close the star
    path.close();
  });