簡體   English   中英

GPUImage創建一個自定義過濾器,用於更改所選顏色

[英]GPUImage create a custom Filter that change selected colors


使用驚人的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);
}

生成的圖像有很多偽影。 它似乎在屏幕上像素化,如果寫入磁盤則不能很好地創建。 這是一些屏幕。
開始圖片屏幕上的過濾圖像從磁盤過濾的圖像

第一個圖像是起始圖像,第二個是iphone屏幕上過濾圖像的屏幕截圖,第三個是寫入磁盤的過濾圖像。 深入研究我記得texel和像素不是一回事,所以可能我沒有正確映射它們。 我想要1:1的比例,可能沒有發生。
我怎樣才能做到這一點?
謝謝,安德烈

正如Brad的評論中所述,解決方案是簡單地在一系列值中面對紋理顏色。 這是由於浮動精度(我現在感覺很愚蠢,很明顯)。 起始圖像具有固定的受控顏色,但由於原始圖像被采樣,因此信息可能與起始圖像不相等。 這是正確的片段着色器:

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);
}

我要感謝Brad找到答案。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM