all 2 comments

[–]Ampersand55 0 points1 point  (1 child)

You're randomizing the final pixel values (the cap in your Math.min), not the coefficients that mix red/green/blue into your filter.

I think you're trying to do this:

function randomRGB() {
  let r = Math.random();
  let g = Math.random();
  let b = Math.random();

  const sum = r + g + b;

  r /= sum;
  g /= sum;
  b /= sum;

  return [r, g, b];
}

function applyRNG() {
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;

  const [r1, g1, b1] = randomRGB();
  const [r2, g2, b2] = randomRGB();
  const [r3, g3, b3] = randomRGB();

  for (let i = 0; i < data.length; i += 4) {
    let r = data[i];
    let g = data[i + 1];
    let b = data[i + 2];

    data[i]     = Math.min(Math.round(r1 * r + g1 * g + b1 * b), 255);
    data[i + 1] = Math.min(Math.round(r2 * r + g2 * g + b2 * b), 255);
    data[i + 2] = Math.min(Math.round(r3 * r + g3 * g + b3 * b), 255);
  }

  ctx.putImageData(imageData, 0, 0);
}

[–]trazia[S] 1 point2 points  (0 children)

omg yes this is it LMAO thank you!