色度键控着色器

时间:2014-07-01 13:02:44

标签: android opengl-es shader fragment-shader

我想为我的应用程序应用色度键控着色器。为此,我使用了GPUImage插件。在那里我找到了GPUImageChromaKeyingBlendFilter类来满足我的需求。

在插件中,GPUImageChromaKeyingBlendFilter类包含错误的色度键控程序,因此我用类似的插件替换了iOS版本。

节目内容如下所示。

public static final String CHROMA_KEY_BLEND_FRAGMENT_SHADER = "precision highp float;\n"
        + "\n"
        + " varying highp vec2 textureCoordinate;\n"
        + " varying highp vec2 textureCoordinate2;\n"
        + "\n"
        + " uniform float thresholdSensitivity;\n"
        + " uniform float smoothing;\n"
        + " uniform vec3 colorToReplace;\n"
        + " uniform sampler2D inputImageTexture;\n"
        + " uniform sampler2D inputImageTexture2;\n"
        + "\n"
        + " void main()\n"
        + " {\n"
        + "     vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n"
        + "     vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);\n"
        + "\n"
        + "     float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b;\n"
        + "     float maskCr = 0.7132 * (colorToReplace.r - maskY);\n"
        + "     float maskCb = 0.5647 * (colorToReplace.b - maskY);\n"
        + "\n"
        + "     float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b;\n"
        + "     float Cr = 0.7132 * (textureColor.r - Y);\n"
        + "     float Cb = 0.5647 * (textureColor.b - Y);\n"
        + "\n"
        + "     float blendValue = 1.0 - smoothstep(thresholdSensitivity - smoothing, thresholdSensitivity , abs(Cr - maskCr) + abs(Cb - maskCb));\n"
        + "//     float blendValue = smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb)));\n"
        + "//     gl_FragColor = mix(textureColor, textureColor2,blendValue);\n"
        + "     vec4 chromaTexture = vec4(textureColor.rgb, textureColor.a *  blendValue);\n"
        + "      gl_FragColor = chromaTexture;\n" + " }\n";

在所有其他论坛帖子中,我找到了类似的程序来实现色度键控。 但是这个程序现在适合我。我对opengl课程并不了解。

所以请朋友们帮忙解决这个问题。

修改

private int mThresholdSensitivityLocation;
private int mSmoothingLocation;
private int mColorToReplaceLocation;
private float mSmoothing = 1.0f;
private float mThresholdSensitivity = 0.4f;
private float[] mColorToReplace = new float[] { 0.0f, 1.0f, 0.0f };

public GPUImageChromaKeyBlendFilter() {
    super(CHROMA_KEY_BLEND_FRAGMENT_SHADER);
}

@Override
public void onInit() {
    super.onInit();
    mThresholdSensitivityLocation = GLES20.glGetUniformLocation(
            getProgram(), "thresholdSensitivity");
    mSmoothingLocation = GLES20.glGetUniformLocation(getProgram(),
            "smoothing");
    mColorToReplaceLocation = GLES20.glGetUniformLocation(getProgram(),
            "colorToReplace");
}

@Override
public void onInitialized() {
    super.onInitialized();
    setSmoothing(mSmoothing);
    setThresholdSensitivity(mThresholdSensitivity);
    setColorToReplace(mColorToReplace[0], mColorToReplace[1],
            mColorToReplace[2]);
}

public void setSmoothing(final float smoothing) {
    mSmoothing = smoothing;
    setFloat(mSmoothingLocation, mSmoothing);

}

/**
 * The threshold sensitivity controls how similar pixels need to be colored
 * to be replaced The default value is 0.3
 */
public void setThresholdSensitivity(final float thresholdSensitivity) {
    mThresholdSensitivity = thresholdSensitivity;
    setFloat(mThresholdSensitivityLocation, mThresholdSensitivity);
}


public void setColorToReplace(float redComponent, float greenComponent,
        float blueComponent) {
    mColorToReplace = new float[] { redComponent, greenComponent,
            blueComponent };
    setFloatVec3(mColorToReplaceLocation, mColorToReplace);
}

在此代码中,我可以在mSmoothing和mThresholdSensitivity中获得值更改,但实际图像输出中不会出现任何更改。

此类还扩展了GPUImageTwoInputFilter类。

同一类的更多代码。如果您需要更多信息,请提供相关详细信息。

0 个答案:

没有答案