这个YouTube上的翻页显示视频(物理黑白像素)显示了一种相反的效果,这种效果可能称为溶解或分散,即,由于像素进入并形成字母,文本从噪声中浮现出来。这是一个短切的剪辑,仅显示“结晶”(这不是一个合适的名称吗?):在这种或类似的效果上,我发现了“后效应:像沙子一样吹散的文本,具有碎裂效果,显然是具有物理模拟的3D粒子系统。 ”(字符)的每个像素都不会太难。反转视频中所示的效果可以使用预先计算的序列,甚至每个字母仅使用动画的精灵来完成。或者,选择噪声中的每个像素使之趋向于一个字母(似乎更复杂,可能需要聚类)。 br />
粒子文本效果

使用具有搜寻行为的粒子组成单词。
单词被加载到内存中,以便每个粒子可以找出自己的位置他们需要寻求帮助。
灵感来自丹尼尔·谢夫曼(Daniel Shiffman)从《密码的本质》中的到来。 (natureofcode.com)

https://www.openprocessing.org/sketch/377231

该引用解析为


http://natureofcode.com/book/chapter-4-particle-systems

http://natureofcode.com/book/chapter-6-autonomous-agents/(6.4到达行为)



我认为效果非常相似,所以我认为他们使用了粒子系统。

问:有没有一种不需要粒子的方法(即降低内存消耗)?


只是为了进行比较,这是在注释中建议的一种尝试创建“正常”动画噪声溶解(随机抖动)的尝试,但是我认为很明显原始像素确实会移动,而不仅仅是二进制混合效果:



每个像素至少需要一个随机值:在动画的哪一帧上生效。 br />这就是trichoplax的解决方案的样子(伪随机交换每100帧中的10,000个相邻像素,然后使用相同的伪随机数字序列将其反转,只是反转):

评论

您是在寻找一种有效的记忆方式来产生这种精确的效果(粒子移动到所需位置),还是在寻找看起来不尽相同但实现起来更容易/更节省内存的类似效果?例如。在最终文本中淡入淡出,同时淡出动画白噪声时也会有类似的感觉,但实际上看起来并不像在移动粒子,因此我们需要准确地知道您需要什么才能回答。

在我看来,溶解在文本中的随机点根本不像点移动一样。看起来像随机噪声,然后使用“噪声消除”混合模式或过渡将其与字母混合。

@trichoplax与“移动”二进制像素具有相同效果

@ user118321我想我明白您的意思:这是否不需要非随机噪声混合遮罩(以混合几个过渡帧内的所有像素)?那将需要全帧动画蒙版(以及相应的内存)。

@trichoplax如果我理解正确,那听起来确实不错-但是我需要花费一些时间才能尝试。现在谢谢,我会回报!

#1 楼

一种非常简单的低内存方法

如果您真的想使用尽可能少的内存,则可以用不超过存储单个图像(第一帧)所需的内存来完成此操作可以接受预先进行一些预处理。

如果复制以下混乱的图像,则此jsfiddle将其作为输入:



然后,它将一次将像素移动大约一个步骤,从而使它们漂移到位以再次提供原始图像:

。该算法非常简单:


随机拾取一个像素
与它的四个邻居之一交换它
重复一百万次

>由于不使用颗粒,因此不需要额外的内存。我们只是在不考虑目标位置的情况下随机交换像素。关键在于选择看似混乱的初始图像,以将像素放置在正确的位置,以便应用一百万次随机交换将所有像素留在正确的位置以提供所需的文本。 />设置初始的混杂图像

为此,该准备好的jsfiddle将图像作为输入,并输出经过精确排列的混杂图像,以用作主要jsfiddle的输入。

这会占用更多内存,但仍然是一个非常简单的算法:


生成大量随机数并存储它们
以相反的顺序使用这些数字*(使用倒数第二个):


随机选择一个像素
与四个邻居之一交换它
重复一百万次



这与主要jsfiddle所做的恰好相反,因此搅动将被完全反转,从而还原原始图像。您可以粘贴彩色图像,也可以只粘贴黑白像素的文本。上面显示的示例图像介于这两个极端之间,因为它具有用于抗锯齿的灰度像素,并且在黑白像素旁边徘徊。

一百万个像素交换适用于相当小的图像。对于较大的尺寸,这不会使它们杂乱无章以至于完全遮盖原始图像,因此您需要调整交换次数。只能这样做是因为在两种算法的开始都重新植入了伪随机数生成器,以确保它们都使用完全相同的“随机”数列表。大多数语言将允许您重新设定随机数生成器的种子,这使此方法很简单。 JavaScript不支持,所以jsfiddles包含xorshift的实现以允许重新播种。

即使使用允许重新播种的语言,如果硬件特别受限制,那么您可能也要考虑xorshift,因为它非常快速且仅使用4个字节的内存作为其状态。它也只有几行代码。


*请注意,顺序与反转的顺序并不完全相同。在此示例代码中,三个随机数用于要交换的每对像素。因此,每个三元组的顺序必须保持相同,以避免选择不同的像素对。例如:

[1、2、3],[4、5、6],[7、8、9]

必须反转为

[7、8、9],[4、5、6],[1、2、3]

,以便为x选择相同的x值,y值和方向反向运行时每个像素对。

评论


$ \ begingroup $
如果此站点在某个时候获得了堆栈摘录,我将用堆栈摘录替换jsfiddles,以便可以从答案中查看它们。
$ \ endgroup $
– trichoplax
17年5月18日在0:30

$ \ begingroup $
感谢您的初步想法演示。我明天将发布动画的快照,以供您集成到您的帖子中。我认为这可以称为(伪)随机行走吗?这可能会以更多的方向性扩展,但会增加每个像素(3位)的额外状态存储。但是效果与原始的假定粒子效果足够接近。我将尝试找出是否有任何RNG / LSFR的状态无需迭代即可设置(用于反向操作),然后在微控制器上实现。再次感谢。
$ \ endgroup $
–句柄
17年5月18日在5:36



$ \ begingroup $
我必须承认,这是更好的答案。 +1
$ \ endgroup $
–杰卡洛普
17年5月18日在22:34

$ \ begingroup $
@Jackalope谢谢!我的方法不太复杂,我无法想象为什么需要如此限制内存,但是假设是这样,这是我能想到的最简单的方法。
$ \ endgroup $
– trichoplax
17年5月22日在12:11

#2 楼

您可以完全在OpenGL / WebGL片段着色器中完成此操作:

将希望出现的图像作为Texture / sampler2D附加。
附加当前时间和时间的制服您想要效果完成。

接下来,应用确定性伪随机噪声算法将像素移动给定距离和罗盘方向。像这样:

uniform sampler2D myTexture;
uniform float currentTime;
uniform float finishTime;

#define TWO_PI 6.283185307179586476925286766559


注意,上面的钳制在适当的时间停止了效果,并设置了最大持续时间(在此示例中为10秒)效果。

最后,查找您的纹理样本:

float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
float R = rand(thisPixel.xy);

var float timeLeft = clamp((finishTime - currentTime) * R, 0.0, 10000.0);

float direction = classic1dPerlinNoise( R + currentTime ) * TWO_PI;
float offsetX = thisPixel.x + sin(direction) * timeLeft / 500.0;
float offsetY = thisPixel.Y + cos(direction) * timeLeft / 500.0;
vec2 texCoord = vec2( offsetX, offsetY );


Voila!尽管像素可能不会彼此导航,但它们至少会游荡到适当的位置,每个像素在分配给效果的时间范围内到达其自己的不同时间,并且占用的内存和CPU时间很少。

评论


$ \ begingroup $
我第一次尝试在shadertoy.com上运行此程序缺少了几块。如果您知道该站点,可以请看一下?
$ \ endgroup $
–句柄
17年5月16日在6:47



$ \ begingroup $
是的,这并不是一个完整的程序。我只是想解释我的方法。再次查看时,我认为需要对其进行修改。我现在没有时间,但是我将尝试尽快建立一个示例并开始运行。
$ \ endgroup $
–杰卡洛普
17年5月16日在19:23

$ \ begingroup $
当然可以。如果不花太多时间在WebGL / Shadertoy上,我就无法独自填补空白,但是我想我可以尝试一下。但是,虽然我很想知道这是如何工作的,并能一窥结果,但最终并不是我要找的方法,因为它需要复杂的图形硬件,并且远远超出了“简单”算法的范围。
$ \ endgroup $
–句柄
17年5月16日在19:42

$ \ begingroup $
实际上,几乎每个人都有查看WebGL所需的硬件。 caniuse.com/#feat=webgl
$ \ endgroup $
–杰卡洛普
17年5月17日在3:50