画面に触れると水の波及効果が組み込まれたライブ壁紙に取り組んでいますが、少し行き詰まっています。
複数の画像を作成し、それらをループしてリップルアニメーションを作成する方がよいでしょうか、それとも、キャンバスに配置する前にビットマップを少し歪ませた方がよいでしょうか。
これは、OpenGLを介して行われた非常に優れた波及効果のビデオです。
私はまだOpenGLの経験がなく、ライブ壁紙に2Dウォーターエフェクトを作成することはまだ可能かどうか疑問に思っていましたか?
Androidにもリアルな波及効果を実装したかったので、私の経験を共有します。
リファレンス実装として、SergeyのChikuyonokJavaScriptポートであるNeilWallisJavaアルゴリズムを使用しました。オリジナルのJSコードを試すことができる遊び場は次のとおりです。http://jsfiddle.net/esteewhy/5Ht3b/6/
最初は、JSコードをJavaに移植しましたが、HuaweiU8100ハードウェアで1fpsを超える値を圧縮する方法がないことに気づきました。(ネット上でいくつかの同様の試みがありますが、唯一の結論は、途方もなく遅いということです)。
ところで、このSOの回答は、Androidでインタラクティブグラフィックをコーディングする方法の基本を理解するのに非常に役立ちました:https ://stackoverflow.com/a/4946893/35438 。そこからfpsカウンターを借りてきました。
次に、Android NDKを試して、元のアルゴリズムを純粋なCで再実装することにしました(10年以上で初めて遭遇しました!)。NDKのドキュメントは(特に要件と前提条件に関して)やや混乱していますが、すべてが魅力のように機能したため、最大30 fpsを達成できました-それほど印象的ではないかもしれませんが、それでもJavaコードを大幅に改善しています。
最後に、すべての作業をオンラインで公開しました:https ://github.com/esteewhy/whaterなので、気軽に試してみてください。を含む:
(プロジェクトは「クリーン」ではありません。つまり、すべてのバイナリが存在するため、NDKがなくても「そのまま」実行してみることができます。)
タッチリップル効果の例は、次の場所にあります。
https://github.com/MasDennis/RajawaliExamples
これは、rajawaliOpenGLESフレームワーク/ライブラリを利用します。市場からrajawaliの例のアプリをダウンロードして、どのように見えるかを確認できます。「src」フォルダーを参照すると、TouchRippleEffectアクティビティとレンダラーが表示されます。お役に立てば幸いです。
私はこれについての専門家ではありませんが、OpenGLで水効果を行う一般的な方法は、フラグメントシェーダーを使用することだと思います。静止画像をテクスチャとして使用すると、シェーダーはその画像のサンプリングに使用されるテクスチャ座標を変更して、任意の方法で画像を歪めることができます。
ピクセルの方向と円の中心からの距離を計算し、距離の正弦関数に基づいて円の中心に近づいたり遠ざかったりするテクスチャ座標を調整すると、素晴らしい波及効果が得られるはずです。
リンクしたYouTube動画の説明から判断すると、三角形のグリッドを使用し、頂点でのみテクスチャ座標を調整することで行われているように聞こえます。それも機能するはずですが、かなり細かいグリッドを使用しない限り、見栄えは良くありません。フラグメントシェーダーを使用してピクセルごとに実行するのが理想的ですが、それが電話のGPUでパフォーマンスの問題を引き起こすかどうかはわかりません。