2011-07-25 66 views
4

这是一个关于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标签中的更多关注

+0

你找到一个解决这个问题了吗? – LaserJesus

+0

@LaserJesus不是真的,我已经停止玩它了。它不褪色以完成白色的原因是颜色被编码为整数(即​​不允许小数值)。 – Szabolcs

回答

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 
} 
+0

我的观点并不是淡出一个矩形,而是逐渐淡出到目前为止在屏幕上绘制的所有东西,所有这些同时还吸取了新的东西。想象一下,通过屏幕移动一个“球”,而不是删除在前一帧画出的球,而只是“淡出”了一下。最终的结果将会是球会离开一条褪色的小路。这对更复杂的动画可以产生很好的效果。你列出的方法只能产生一个渐变的矩形,而不是这个效果。 – Szabolcs

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(); 
} 

通过在同一时间我们不改变颜色,但亮度增加所有三个颜色通道(红,绿,蓝)。

0

我发现,尽管舍入误差(如果那是它是什么),适用于几乎所有你可以试试,用blendMode(SUBTRACT),然后用一个非常小的灰度颜色填充(如fill(2))实现了逐步淡出许多draw()周期没有所有其他方法似乎具有的“鬼影”图像,同时保持帧速率(在实时绘图情况下这通常是关键的)。

// The only reasonable way to actually "fade" out the pixels. 
blendMode(SUBTRACT); 
fill(2); 
rect(0, 0, width, height); 
blendMode(NORMAL);