dynamic壁纸水波纹效果

我正在做一个dynamic的壁纸,在触摸屏幕上包含一些水波纹效果,但我有点卡住了。

创build多个图像并通过它们循环来创build涟漪animation会更好吗?还是在将位图放置在canvas上之前稍微扭曲位图会更好?

这是一个通过OpenGL完成的非常漂亮的video效果。

我还没有OpenGL的经验,并想知道是否仍然有可能在dynamic壁纸上创build2D水效果?

Solutions Collecting From Web of "dynamic壁纸水波纹效果"

我也想在Android中实现一个逼真的涟漪效应,所以将分享我的经验:

作为参考实现,我使用了Neil Wallis Javaalgorithm的Sergey的Chikuyonok JavaScript端口。 这里有一个操场,你可以尝试原始的JS代码: http : //jsfiddle.net/esteewhy/5Ht3b/6/

起初,我把JS代码移植到了Java上,才意识到我的华为U8100硬件上没有超过1 fps的压缩率。 (在网上有几个类似的尝试,唯一的结论是:他们的速度很慢)。

顺便说一句,这个SO的答案是非常有用的基本了解如何在Android中的交互式graphics编码: https : //stackoverflow.com/a/4946893/35438 。 我从那里借了fps柜台。

然后我决定尝试Android NDK来重新实现纯C中的原始algorithm(我第一次遇到它在10年以上!)。 尽pipeNDK的文档有些混乱(特别是对于需求和先决条件),但它都像一个魅力,所以我能够达到30帧/秒 – 它可能不会太令人印象深刻,但仍然是对Java代码的彻底改进。

最后,我把所有的工作放在网上: https : //github.com/esteewhy/whater ,随时随地玩。 它包含:

  1. 上面提到的交互式弹跳球代码(仅供参考)。
  2. 水涟漪Java端口(像地狱一样慢!)
  3. 水涟漪C实现(需要NDK编译和JDK创build.h文件)。

(该项目不是“干净的”,即:所有的二进制文件都存在,所以即使没有NDK,也可以按“原样”运行。)

在这里输入图像说明

你可以在这里find一个触摸波纹效应的例子:

https://github.com/MasDennis/RajawaliExamples

它利用rajawali OpenGL ES框架/库。 您可以从市场上下载rajawali示例应用程序,看看它的外观。 浏览“src”文件夹,您将看到TouchRippleEffect活动和渲染器。 希望有所帮助。

我不是这方面的专家,但我相信在OpenGL中做水效应的典型方法是使用片段着色器。 使用静态图像作为纹理,着色器可以改变用于采样该图像的纹理坐标,以任意方式对其进行变形。

根据距离的正弦函数计算像素的方向和距离圆心的距离,并根据距离的正弦函数调整朝向​​或远离圆心的纹理坐标,并且您应该得到一个很好的涟漪效应。

根据您所链接的YouTubevideo的描述来判断,这听起来像是通过使用三angular形网格并仅在顶点调整纹理坐标来完成的。 这也应该工作,但它不会看起来不错,除非你使用一个相当好的网格。 使用片段着色器进行每像素处理是最理想的,但我不知道这是否会导致手机GPU上的性能问题。