3


驚くべき GPU 画像フレームワークを使用して、いくつかの色ベクトルをユニフォームとして渡すカスタム フラグメント シェーダーを使用してカスタム フィルターを作成しようとしています。私は Quartz を使ってそれを作成しましたが、動作しますが、このフレームワークを使用して OpenGL の世界に最初の一歩を踏み出すので、GPU 処理を試してみたいと思います。
私が作ったフラグメントシェーダは問題なく動作しているようですが、出力に問題があります。ネズミイルカをデバッグするためのサンプルを投稿します

varying highp vec2 textureCoordinate;

uniform sampler2D inputImageTexture;


bool compareVectors (lowp vec3 x,lowp vec3 y){
    bool result;
    if (x.r != y.r) {
        return result = false;
    }
    if (x.b != y.b) {
       return result = false;
    }
    if (x.g  != y.g ) {
       return result = false;
    }
    return result = true;
}

void main()
{
    lowp vec3 tc = vec3(0.0, 0.0, 0.0);

    lowp vec4 pixcol = texture2D(inputImageTexture, textureCoordinate).rgba;
    lowp vec3 sampleColors[3];
    lowp vec3 newColors[3];
    sampleColors[0] = vec3(0.2, 0.2, 0.2);
    sampleColors[1] = vec3(0.0, 0.0, 0.0);
    sampleColors[2] = vec3(1.0, 1.0, 1.0);

    newColors[0] = vec3(0.4, 0.4, 1.0);
    newColors[1] = vec3(0.3, 0.4, 1.0);
    newColors[2] = vec3(0.6, 0.7, 0.5);
    if (pixcol.a >= 0.2) {
        if (compareVectors (sampleColors[0],pixcol.rgb))
            tc = newColors[0];
        else if (compareVectors (sampleColors[1],pixcol.rgb))
            tc = newColors[1];
        else if (compareVectors (sampleColors[2],pixcol.rgb))
            tc = newColors[2];
        else
            tc = pixcol.rgb;
    }
    else
        tc = pixcol.rgb;

    gl_FragColor = vec4(tc.rgb, pixcol.a);
}

結果の画像には多くのアーティファクトがあります。画面上ではピクセルレートのように見え、ディスクに書き込むとうまく作成されません。ここにいくつかの画面があります。
開始イメージ 画面からのフィルタリングされた画像 ディスクからのフィルタリングされた画像

最初の画像は開始画像、2 番目は iPhone 画面上のフィルタリングされた mage のスクリーンショット、3 番目はディスクに書き込まれたフィルタリングされた画像です。それを掘り下げてみると、テクセルとピクセルは同じものではないことを思い出したので、おそらくそれらを正しくマッピングしていません。掲載順位を 1:1 にしたいのですが、おそらく実現していません。
どうすればそれを達成できますか?
ありがとう、アンドレア

4

1 に答える 1

5

Brad のコメントで述べたように、解決策は単純にテクセル カラーをさまざまな値で対峙させることでした。これは float の精度によるものです (私は今それを書いているのがばかげていると感じています。それはかなり明白でした)。最初の画像は制御された色が固定されていましたが、元の画像がサンプリングされているため、おそらく情報は最初の画像と同じではありません。正しいフラグメント シェーダーは次のとおりです。

varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;


bool compareVectors (lowp vec3 sample,lowp vec3 texel){
    bool result;
    if ( abs(texel.r-sample.r) > 0.1 ) {
        return result = false;
    }
    if ( abs(texel.g-sample.g) > 0.1 ) {
        return result = false;
    }
    if ( abs(texel.b-sample.b) > 0.1 ) {
        return result = false;
    }

    return result = true;
}

void main()
{
    lowp vec3 tc = vec3(0.0, 0.0, 0.0);

    lowp vec4 pixcol = texture2D(inputImageTexture, textureCoordinate).rgba;
    lowp vec3 sampleColors[3];
    lowp vec3 newColors[3];
    sampleColors[0] = vec3(0.5, 0.5, 0.5);
    sampleColors[1] = vec3(0.0, 0.0, 0.0);
    sampleColors[2] = vec3(1.0, 1.0, 1.0);

    newColors[0] = vec3(0.4, 0.4, 1.0);
    newColors[1] = vec3(0.3, 0.4, 1.0);
    newColors[2] = vec3(0.6, 0.7, 0.5);

    if (pixcol.a >= 0.2) {
        if (compareVectors (sampleColors[0],pixcol.rgb))
            tc = newColors[0];
        else if (compareVectors (sampleColors[1],pixcol.rgb))
            tc = newColors[1];
        else if (compareVectors (sampleColors[2],pixcol.rgb))
            tc = newColors[2];
        else
            tc = pixcol.rgb;
    }
    else
        tc = pixcol.rgb;

    gl_FragColor = vec4(tc.rgb, pixcol.a);
}

答えを見つけてくれたブラッドに感謝します。お役に立てれば。

于 2013-01-17T07:43:19.030 に答える