3

背景画像に単純な水の波紋効果を追加する単純なアプリケーション/壁紙を作成しています。

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 ループで実行します。

4

1 に答える 1

3

フラグメント シェーダーでの大量の計算は、パフォーマンスに悪影響を及ぼします。モバイル OpenGL ES デバイスの最適化の非常に一般的な方法は、重い計算を頂点シェーダーに移動することです。

この場合、シェーダーのロジックを再考し、ジオメトリも変更する必要があります。水波をシミュレートするのに十分なテッセレーションを備えたメッシュを作成し、頂点の位置を変更して波紋効果を作成することを提案します。

別の方法として、すべてのロジックをフラグメント シェーダー内に残して、外部のベイク テクスチャとオフセット データを使用して UV オフセットの計算を変更することもできます。この方法では、同じ品質の効果が得られますが、パフォーマンスが大幅に向上します。特定の距離の UV デルタの別のテクスチャ ベイク データに保存し、このテクスチャから事前に計算された値を読み取る必要があります。すべてのモバイル デバイスの GPU には少なくとも 2 つのテクスチャ サンプラーがあるため、追加のtexture2D()呼び出しはほとんど無料です。

それがどのように機能するかを理解するには、この記事を読んでくださいhttp://prideout.net/blog/?p=56パスの変形に関するものですが、事前に計算された特定のデータをテクスチャからサンプリングする方法を確認する必要があります。 .

于 2012-12-07T09:48:34.213 に答える