Java 通过反复绘制透明矩形逐渐淡入淡出

Java 通过反复绘制透明矩形逐渐淡入淡出,java,colors,processing,alphablending,Java,Colors,Processing,Alphablending,这是一个关于我的问题 我通过在视图上为每一帧绘制一个半透明的白色矩形来淡出以前绘制的对象 然而,它们似乎从未褪色为完全白色。褪色在一些明显的非白色灰色阴影处有一个固定点。当尝试淡入黑色时也会发生同样的情况 这是阿尔法混合在加工过程中的标准功能吗?是否有一种相对简单的方法来实现完全白色的背景(给定足够的步骤) 我想象得到的颜色将是混合颜色的线性组合,这意味着极限应为白色。也许非白色固定点是舍入的人工制品 说明问题的示例代码: void setup() { size(300,300); ba

这是一个关于我的问题

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

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

这是阿尔法混合在加工过程中的标准功能吗?是否有一种相对简单的方法来实现完全白色的背景(给定足够的步骤)

我想象得到的颜色将是混合颜色的线性组合,这意味着极限应为白色。也许非白色固定点是舍入的人工制品

说明问题的示例代码:

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标记,希望引起更多关注

我不确定发生了什么,看起来你应该是对的,如果绘制的矩形数量*这些矩形的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
}
inta;
无效设置(){
尺寸(300300);
仰泳();
帧率(15);
a=0;
}
作废提款(){
背景(0);
a+=1;

如果(a我做了大量的挖掘,现在我很有信心地说,阿尔法通道的完全衰落是不可能的。但是有一种东西叫做亮度,所以让我们使用它

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();
}
void setup(){
尺寸(300300);
背景(0);
仰泳();
帧率(15);
//白色矩形,用于褪色比较。
填充(255);
rect(0,0,50,50);
}
作废提款(){
褪色(10);
}
无效淡入淡出(最终整数淡入淡出){
loadPixels();
对于(int row=0;row>>16)和0xFF)+fadeSpeed;
int绿色=((像素>>>8)和0xFF)+fadeSpeed;
蓝色整数=(像素和0xFF)+淡色速度;
如果(红色>255){red=255;}
如果(绿色>255){green=255;}
如果(蓝色>255){blue=255;}
//将钻头移回支撑器位置,然后

红色我发现,虽然舍入误差(如果是这样的话)适用于几乎所有你可以尝试的东西,但使用
blendMode(SUBTRACT)
,然后用非常小的灰度填充(如
fill(2)
)可以在许多
draw()
周期中实现无“重影”的渐变所有其他方法似乎都具有的图像,同时保持较高的帧速率(这在实时绘图情况下通常非常关键)


我的观点不是要淡出一个矩形,而是要逐渐淡出屏幕上迄今为止绘制的所有内容,所有这些都是在仍然绘制新事物的情况下进行的。想象一下,在屏幕中移动一个“球”,而不是删除上一帧中绘制的球,而是“淡出它”有一点。最终的结果是球会留下一条淡入淡出的轨迹。这对更复杂的动画效果很好。你概述的方法只能产生一个淡入淡出的矩形,而不是这个效果。你找到解决这个问题的方法了吗?@LaserJesus不太好,我已经停止玩它了。它不会淡入com的原因是什么完全白色是指颜色被编码为整数(即不允许分数值)。
 // The only reasonable way to actually "fade" out the pixels.
blendMode(SUBTRACT);
fill(2);
rect(0, 0, width, height);
blendMode(NORMAL);