处理:分层形状时 Alpha 停止增加

Processing: Alpha Stops Increasing When Layering Shapes

我正在处理,试图产生 "glow" 效果。 我想如果我将 255 个同心圆层叠在一起,每个同心圆的 alpha = 1,那么中心应该有 alpha = 255,而外面应该有 alpha = 1;

void setup()
{
  size(800, 800);
}

void draw()
{
  noStroke();
  background(0);
  translate(width/2, height/2);

  //Red Circle behind glow
  fill(255, 0, 0, 255);
  ellipse(0, 0, 10, 10);

  //Create glow circles
  for (int i=0; i<255; i++)
   {
     fill(255, 1);
     ellipse(0,0,i,i);
   }
}

This is the result。 在 128 alpha 处有一个明显的分界线,在添加更多圆圈后似乎停止增加。

使用不同的混合类型似乎也无法解决问题。

我是否缺少一些明显的东西来让它工作?

通过堆叠圆圈,您必须将所有先前的 alpha 相乘,而不是相加。

具有 50% alpha 的圆圈显示 50% 的背景。如果您添加第二个具有 50% alpha 的圆圈,它会显示下方内容的 50%,这是第一个圆圈,下方是背景。最终结果为 50% * 50% = 25% 背景。

这意味着您绘制的最后一个圆圈的 alpha = 1,它显示了下方 99% 的所有内容。这与 alpha = 255 不同。

无论如何,这就是理论。我真的无法解释为什么它最大为 128,我测试了一些东西,在我看来这是处理的幕后黑手。

得到你想要的效果的解决方案是这样的:

for (int i=128; i>0; i--)
  {
    fill(255, 255, 255, 1);
    ellipse(0, 250, i*2, i*2);
  }

如果你想让它更亮,你可以增加 alpha,但 'ring' 伪影将开始显示。