2

私はlibGdxヒットをシミュレートする顔を歪めることができる小さなアプリケーションを書いています (に似たものFaceSmash) が、どの種類のフィルターを適用すればよいか、バルジ効果のようなものを達成するための数学アルゴリズムに関する情報も見つかりません。

私は SphereFilter から始めました

http://www.jhlabs.com/

しかし、間違いなくその効果は私が探しているものではありません。

私は知っている

イメージ ワーピング - バルジ効果アルゴリズム

Androidで画像をワープする方法は?

最初のスレッドで言及されたバルジ効果を「翻訳」することに成功しましたが、比較的遅く、画像全体ではなく、領域にバルジを作成する方法が見つかりません。

(2 番目のスレッド)のワープ サンプルApi demosは非常に高速で、イメージの一部のみを変更しますが、正確にはバルジ エフェクトではありません。画像処理の計算では、アルゴリズムを変更してエフェクトを変更する方法を理解するにはほど遠いものです。

正しい方向に進んでいるように感じますが、完全に立ち往生しています。画像内に「局所的な」膨らみを得るために、これらのアルゴリズムをどのように変更できるかについてのアイデアはありますか?

編集

ちょうどこのスレッドを見つけました.-

OpenGL ESを使用してUIImageに歪みを適用するにはどうすればよいですか?

アンドロイドではありませんが、有望に見えます。OpenGL シェーダーを試して、(できれば) 私のシナリオの解決策を共有します。

4

1 に答える 1

1

私自身の質問に答えて、GPUImageフレームワークshadersに基づくOpenGL を使用して解決策を見つけることができました

結果のフラグメント シェーダーは次のようになります。

#ifdef GL_ES
    precision mediump float;
#endif

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform float aspectRatio;
uniform vec2 center;
uniform float radius;
uniform float scale;

void main() 
{  
    vec2 textureCoordinateToUse = vec2(v_texCoords.x, (v_texCoords.y * aspectRatio + center.y - center.y * aspectRatio));
    float dist = distance(center, textureCoordinateToUse);
    textureCoordinateToUse = v_texCoords;
    if (dist < radius)
    {
        textureCoordinateToUse -= center;
        float percent = 1.0 - ((radius - dist) / radius) * scale;
        percent = percent * percent;
        textureCoordinateToUse = textureCoordinateToUse * percent;
        textureCoordinateToUse += center;
    }
    gl_FragColor = texture2D(u_texture, textureCoordinateToUse);
}

誰かが役に立てば幸いです。

于 2013-07-19T11:33:41.500 に答える