处理:分层形状时 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' 伪影将开始显示。
我正在处理,试图产生 "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' 伪影将开始显示。