2017-07-02 24 views
0

これは恐らく疑問な質問ですが、私はしばらくこのことに気をつけていますので、とにかく尋ねます。GPUImage Swiftライブラリを使用してカスタムフィルタを実装する

ペットプロジェクトにHudson/Nashvilleフィルタを実装しようとしています。私はちょっと調べて、いくつかのオープンソースプロジェクトをチェックアウトし、(これは私が理解できない)ベースのプロジェクトを見つけました。彼らはGPUImage2を使用して実装されたフィルタを持っていますが、私は彼らのアプローチについてはわかりませんでした。

私は、使用しているオーバーレイとその他の画像とGLSLファイルを持っています。

私の質問は、この画像とシェーダファイルを使用してカスタムフィルタを実装する方法です。

注:LookupFilterのアプローチを示唆したように使用してみましたが、結果はあまり良くありませんでした。私にいくつかのコードを教えてもらえれば非常に役に立ちます。おかげ

アップデート:私はこれを理解しようとしています何

。下のようなカスタムシェーダがある場合、入力画像をuniform inputImageTexture2inputImageTexture3 & inputImageTexture4にどのように渡す必要がありますか?それをサブクラス化してPictureInputBasicOperationとして渡しますか?もしそうなら、どうですか?私は何が欠けていますか?私は適切な文書がないためにコードをかなり歩くことができませんでした。私は今シェーダとさまざまなコンポーネントを読みましたが、まだGPUImage2のカスタムフィルタを使用する方法を理解することはできません。助けてください。

precision highp float; 

varying highp vec2 textureCoordinate; 

uniform sampler2D inputImageTexture; 
uniform sampler2D inputImageTexture2; //blowout; 
uniform sampler2D inputImageTexture3; //overlay; 
uniform sampler2D inputImageTexture4; //map 

uniform float strength; 

void main() 
{ 
    vec4 originColor = texture2D(inputImageTexture, textureCoordinate); 

    vec4 texel = texture2D(inputImageTexture, textureCoordinate); 

    vec3 bbTexel = texture2D(inputImageTexture2, textureCoordinate).rgb; 

    texel.r = texture2D(inputImageTexture3, vec2(bbTexel.r, texel.r)).r; 
    texel.g = texture2D(inputImageTexture3, vec2(bbTexel.g, texel.g)).g; 
    texel.b = texture2D(inputImageTexture3, vec2(bbTexel.b, texel.b)).b; 

    vec4 mapped; 
    mapped.r = texture2D(inputImageTexture4, vec2(texel.r, .16666)).r; 
    mapped.g = texture2D(inputImageTexture4, vec2(texel.g, .5)).g; 
    mapped.b = texture2D(inputImageTexture4, vec2(texel.b, .83333)).b; 
    mapped.a = 1.0; 

    mapped.rgb = mix(originColor.rgb, mapped.rgb, strength); 

    gl_FragColor = mapped; 
} 

答えて

3

GPUImage規則は、シェーダへの第1の入力テクスチャように第二inputTextureCoordinate2inputTextureCoordinate、と呼ばれ、ということです。 GPUImageのオリジナルのObjective-Cバージョンでは、シェーダの入力テクスチャの数に一致するフィルタタイプを手動でサブクラス化することができます。

Swift GPUImage 2では、BasicOperationクラスまたはサブクラスを使用するだけで済み、シェーダに必要な数の入力に自動的にテクスチャをアタッチするようにしました。あなたの上記のシェーダに一致する、4に

let myOperation = BasicOperation(fragmentShaderFile:myFragmentShader, numberOfInputs:4) 

上記セットnumberOfInputs:あなたはBasicOperationを初期化し、入力数を設定することにより、これを行います。 vertexShaderFile引数をnil(デフォルト)のままにすると、BasicOperationは4つのテクスチャ入力を持つ適切な単純な頂点シェーダを選択します。

新しいBasicOperationをイメージソースのターゲットとして追加することで、そうする必要があるのは、他の場合と同じように、そのフィルタへの入力を設定するだけです。入力を添付する順序は、シェーダ内の最初のテクスチャから始まり、下に進むため重要です。

ほとんどの場合、BasicOperationはそのままの状態で柔軟なので、サブクラス化する必要はありません。ほとんどの場合、カスタム頂点シェーダを用意する必要がありますが、上記のフラグメントシェーダコードでは必要ありません。

関連する問題