活动壁纸水波纹效果

9
我正在开发一个动态壁纸,希望在触摸屏幕时可以加入一些水波纹效果,但是我遇到了一些问题。
是否最好创建多个图像并循环播放以创建波纹动画,或者是否最好在将位图放置在画布上之前略微扭曲它? 是通过OpenGL实现的非常漂亮的波纹效果的视频。
我没有使用OpenGL的经验,想知道是否仍然可以在动态壁纸上创建2D水效果?

Android内置的动态壁纸之一是水波纹,因此这是完全可行的。 - Wyzard
3个回答

18

我也想在Android中实现逼真的涟漪效果,所以我会分享我的经验:

作为一个参考实现,我采用了Sergey的Chikuyonok JavaScript版本Neil Wallis Java算法。这是一个游乐场,您可以尝试使用原始JS代码:http://jsfiddle.net/esteewhy/5Ht3b/6/

起初,我将JS代码移植到Java中,只发现在我的华为U8100硬件上无法超过1 fps。(网络上有几个类似的尝试,唯一的结论是:它们非常慢)。

顺便说一下,这个SO答案对我理解如何在Android中编写交互式图形很有用:https://dev59.com/Q2445IYBdhLWcg3wTIZf#4946893。我从那里借鉴了fps计数器。

然后我决定尝试Android NDK,在纯C中重新实现原始算法(我10多年来第一次遇到它!)。尽管NDK的文档有些令人困惑(特别是关于要求和先决条件方面),但一切都像魔术一样顺利,所以我能够实现高达30 fps的效果——这可能并不令人印象深刻,但仍然是比Java代码的根本改进。

最后,我把所有的工作都放在了网上:https://github.com/esteewhy/whater,所以请随意玩耍。它包含:

  1. 上面提到的交互式弹跳球代码(仅供参考)。
  2. 水波纹Java端口(非常慢!)
  3. 水波纹C实现(需要NDK编译和JDK创建.h文件)。

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

输入图像说明


你能告诉我如何在你的代码中将背景更改为我的图像吗? 当我尝试时,出现了空指针异常 谢谢 - metalink

6
您可以在此处找到一个触摸波纹效果的示例: https://github.com/MasDennis/RajawaliExamples 它使用了rajawali OpenGL ES框架/库。您可以从市场上下载rajawali示例应用程序,查看其外观。浏览“src”文件夹,您将看到TouchRippleEffect活动和渲染器。希望这能帮到您。

我已经从Play商店下载了Rajawali示例。在那个应用中,27是“Touch Ripples Effect”,但是当我运行源代码时,这部分被注释掉了。我的源代码中有以下行...org.rajawali3d:rajawali:1.1.346-SNAPSHOT@aar。有人可以帮忙解决这个问题吗? - Ravi Yadav

4
我不是专家,但我认为在OpenGL中实现水效果的典型方法是使用片段着色器。通过一个静态图像作为纹理,您的着色器可以改变用于采样该图像的纹理坐标,以任意方式扭曲它。
计算像素相对于圆心的方向和距离,并根据距离的正弦函数调整纹理坐标朝向或远离圆心,这样您就可以获得漂亮的涟漪效果。
根据您提供的YouTube视频的描述,似乎是使用三角形网格并仅在顶点处调整纹理坐标来完成。这也可以实现,但除非使用相当密集的网格,否则效果不会很好。使用片段着色器进行每像素处理是最理想的,但我不知道这是否会导致手机GPU性能问题。

您是否知道OpenGL中如何实现此类操作的任何可能示例? - Gatekeeper
不好意思,我暂时想不起来了。如果你是OpenGL新手,我建议你先学习片段着色器和纹理采样的基础知识,一旦你理解了这些,再考虑如何使用它们制作涟漪效果。 - Wyzard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接