背景画像に単純な水の波紋効果を追加する単純なアプリケーション/壁紙を作成しています。
HTC Desire (Android 2.2) でテストしています。
これがどのように行われるかについてのこの説明を見つけて、Android Adrian Boeing: Blogに実装しました。
現在の問題は、パフォーマンスが非常に低いことです。静止画像 (通常のシェーダーを使用) がある場合、fps は約 40 ~ 50 fps です。sinc 関数を計算する部分を追加し、テクスチャ fps に新しい計算値を使用すると、20fps に低下します。
問題は、リップルを 1 つ以上追加したいのですが、リップルの数だけ fps が /2 低下します (ti 2 リップル = 10fps、3 リップル 5 fps など...)。
このシェーダーの実装が不適切で、大幅に最適化する余地があるのでしょうか、それともこのような効果は別の方法で行われているのでしょうか?
この効果は、水と呼ばれる Android のデフォルトのライブ壁紙に似ています (下の波打つ池に紅葉が転がります)。
ここに私のシェーダーのコードがあります:
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform sampler2D uTexture;"+
"varying vec2 vTexCoordinate;"+
"uniform float mTime;"+ //time variable
"uniform float offX;"+//center of wave
"uniform float offY;"+//center of wave
"uniform float size;"+//size of wave (so you can make it smaller over time)
"void main() {" +
" vec2 off2 = vec2(offX,offY);"+
" vec2 cPos = -1.0 + 2.0 * vTexCoordinate.xy;" + //bring coordinate to middle of screen
" vec2 ofvec = cPos+off2;"+ //doda offset
" float r = length(ofvec);"+ //length of vector
" cPos = vTexCoordinate + (size)/(r*2.0)*sin(r*100.0-mTime); "+ //sinc function for wave simulation
" gl_FragColor = texture2D(uTexture,cPos);" + //draw texture
"}";
注: 読みやすくするために、このコードを追加しました。複数のタッチ イベントを使用するコードは、offX、offY に vector を使用するだけで、以下のコードを for ループで実行します。