通过重复绘制透明矩形逐渐消失

时间:2011-07-25 14:33:33

标签: java colors processing alphablending

这是关于Processing.org的问题。

我通过在每个帧的视图上绘制一个半透明的白色矩形来淡出以前绘制的对象。

然而,它们似乎永不褪色为完全白色。褪色在一些明显非白色的灰色阴影处有一个固定点。当试图淡化为黑色时也会发生同样的事情。

这是alpha混合在处理过程中的标准功能吗?是否有一种相对简单的方式,以实现完全白色的背景(给定足够的步骤)?

我想象得到的颜色是混合颜色的线性组合,这意味着限制应该是白色。也许非白色的固定点是圆形的人工制品?

说明问题的示例代码:

void setup() {
  size(300,300);
  background(0);
  noStroke();
  frameRate(15);
}

void draw() {
  fill(255,10);
  rect(0,0,width,height);
  fill(255);
  rect(0,0,50,50); // for comparison to white
}

编辑:添加了 java 标签,希望得到更多关注

3 个答案:

答案 0 :(得分:0)

我不确定最新情况,看起来你应该是正确的,如果绘制的矩形数量*这些矩形的alpha值大于255,它应该是完全白色的。无论如何,为什么不只是重绘每一帧(就像我通过将背景(0)线移动到绘制循环)然后只是增加你的alpha值。我认为这条道路将在未来为您的动画提供更多控制。

int a;

void setup() {
  size(300,300);
  noStroke();
  frameRate(15);
  a = 0;
}

void draw() {
  background(0);
  a += 1;
  if(a<=255){
    fill(255,a);
  }
  rect(0,0,width,height);
  fill(255);
  rect(0,0,50,50); // for comparison to white
}

答案 1 :(得分:0)

我做了很多挖掘,现在我很自信地说,不可能完全消失alpha通道。然而,有一种称为亮度的东西,所以让我们使用它。

void setup() {
  size(300,300);
  background(0);
  noStroke();
  frameRate(15);

  // White rectangle for fading comparison.
  fill(255);
  rect(0, 0, 50, 50);
}

void draw() {
  fade(10);
}

void fade(final int fadeSpeed) {
  loadPixels();
  for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
      final int pixelIndex = row * width + col;
      int pixel = pixels[pixelIndex];
      int red   = ((pixel >>> 16) & 0xFF) + fadeSpeed;
      int green = ((pixel >>>  8) & 0xFF) + fadeSpeed;
      int blue  =  (pixel         & 0xFF) + fadeSpeed;
      if (red   > 255) { red   = 255; }
      if (green > 255) { green = 255; }
      if (blue  > 255) { blue  = 255; }

      // Shift bits back into propper position and 
      red   <<= 16;
      green <<=  8;
      pixel &= 0xFF000000;  // Keep alpha bits.
      pixel |= red |= green |= blue;

      pixels[pixelIndex] = color(pixel);
    }
  }
  updatePixels();
}

通过增加所有三个颜色通道(红色,绿色,蓝色),我们不会改变颜色而是亮度。

答案 2 :(得分:0)

我发现,虽然舍入错误(如果它就是这样)适用于您可以尝试的几乎所有内容,使用blendMode(SUBTRACT),然后填充非常小的灰度颜色(如{{1} })在没有所有其他方法似乎具有的“重影”图像的情况下实现逐渐淡出fill(2)个周期,同时保持帧速率(这在实时绘图情况下通常是关键的)。

draw()