Шейдер с цветовой манипуляцией

#android #opengl-es #shader #fragment-shader

#Android #opengl-es #шейдер #фрагмент-шейдер

Вопрос:

Я хочу применить шейдер с цветовой манипуляцией для своего приложения. Для этого я использовал плагин 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";
  

Во всех других сообщениях на форуме я нашел аналогичную программу для достижения chroma keying.
Но эта программа теперь работает у меня. У меня нет хороших знаний в программах 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.

Больше кода того же класса. Если вам нужна дополнительная информация, предоставьте подробную информацию об этом.

Комментарии:

1. О чем ты спрашиваешь? Вы имели в виду, что программа не работает у вас? Вам необходимо предоставить более подробную информацию о том, как это не работает.

2. Эта программа не работает у меня. После применения этого шейдера исходное изображение не изменяется. Я отредактировал свой вопрос с дополнительной информацией.