我想为我的应用程序应用色度键控着色器。为此,我使用了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类。
同一类的更多代码。如果您需要更多信息,请提供相关详细信息。