2015-10-27 17 views
45

目前BlendModes(減法,排除等)使用LauncherImage作爲掩碼。我可以將這些BlendModes應用於ColorMatrix嗎?在BlendModeFilter中使用ColorMatrix或HexColor - Android?

我使用GPUImageLibrary

colorMatrix[ 
    0.393, 0.7689999, 0.18899999, 0, 0, 
    0.349, 0.6859999, 0.16799999, 0, 0, 
    0.272, 0.5339999, 0.13099999, 0, 0, 
    0,  0,   0,   1, 0]; 

SubtractBlendFilter.java

public class GPUImageSubtractBlendFilter extends GPUImageTwoInputFilter { 
public static final String SUBTRACT_BLEND_FRAGMENT_SHADER = "varying highp vec2 textureCoordinate;\n" + 
     " varying highp vec2 textureCoordinate2;\n" + 
     "\n" + 
     " uniform sampler2D inputImageTexture;\n" + 
     " uniform sampler2D inputImageTexture2;\n" + 
     " \n" + 
     " void main()\n" + 
     " {\n" + 
     " lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" + 
     " lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);\n" + 
     "\n" + 
     " gl_FragColor = vec4(textureColor.rgb - textureColor2.rgb, textureColor.a);\n" + 
     " }"; 

public GPUImageSubtractBlendFilter() { 
    super(SUBTRACT_BLEND_FRAGMENT_SHADER); 
} 
} 

GPUIMageTwoInputFilter.java

public class GPUImageTwoInputFilter extends GPUImageFilter { 
private static final String VERTEX_SHADER = "attribute vec4 position;\n" + 
     "attribute vec4 inputTextureCoordinate;\n" + 
     "attribute vec4 inputTextureCoordinate2;\n" + 
     " \n" + 
     "varying vec2 textureCoordinate;\n" + 
     "varying vec2 textureCoordinate2;\n" + 
     " \n" + 
     "void main()\n" + 
     "{\n" + 
     " gl_Position = position;\n" + 
     " textureCoordinate = inputTextureCoordinate.xy;\n" + 
     " textureCoordinate2 = inputTextureCoordinate2.xy;\n" + 
     "}"; 

public int mFilterSecondTextureCoordinateAttribute; 
public int mFilterInputTextureUniform2; 
public int mFilterSourceTexture2 = OpenGlUtils.NO_TEXTURE; 
private ByteBuffer mTexture2CoordinatesBuffer; 
private Bitmap mBitmap; 

public GPUImageTwoInputFilter(String fragmentShader) { 
    this(VERTEX_SHADER, fragmentShader); 
} 

public GPUImageTwoInputFilter(String vertexShader, String fragmentShader) { 
    super(vertexShader, fragmentShader); 
    setRotation(Rotation.NORMAL, false, false); 
} 

@Override 
public void onInit() { 
    super.onInit(); 

    mFilterSecondTextureCoordinateAttribute = GLES20.glGetAttribLocation(getProgram(), "inputTextureCoordinate2"); 
    mFilterInputTextureUniform2 = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture2"); // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader 
    GLES20.glEnableVertexAttribArray(mFilterSecondTextureCoordinateAttribute); 

    if (mBitmap != null&&!mBitmap.isRecycled()) { 
     setBitmap(mBitmap); 
    } 
} 

public void setBitmap(final Bitmap bitmap) { 
    if (bitmap != null && bitmap.isRecycled()) { 
     return; 
    } 
    mBitmap = bitmap; 
    if (mBitmap == null) { 
     return; 
    } 
    runOnDraw(new Runnable() { 
     public void run() { 
      if (mFilterSourceTexture2 == OpenGlUtils.NO_TEXTURE) { 
       if (bitmap == null || bitmap.isRecycled()) { 
        return; 
       } 
       GLES20.glActiveTexture(GLES20.GL_TEXTURE3); 
       mFilterSourceTexture2 = OpenGlUtils.loadTexture(bitmap, OpenGlUtils.NO_TEXTURE, false); 
      } 
     } 
    }); 
} 

public Bitmap getBitmap() { 
    return mBitmap; 
} 

public void recycleBitmap() { 
    if (mBitmap != null && !mBitmap.isRecycled()) { 
     mBitmap.recycle(); 
     mBitmap = null; 
    } 
} 

public void onDestroy() { 
    super.onDestroy(); 
    GLES20.glDeleteTextures(1, new int[]{ 
      mFilterSourceTexture2 
    }, 0); 
    mFilterSourceTexture2 = OpenGlUtils.NO_TEXTURE; 
} 

@Override 
protected void onDrawArraysPre() { 
    GLES20.glEnableVertexAttribArray(mFilterSecondTextureCoordinateAttribute); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE3); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFilterSourceTexture2); 
    GLES20.glUniform1i(mFilterInputTextureUniform2, 3); 

    mTexture2CoordinatesBuffer.position(0); 
    GLES20.glVertexAttribPointer(mFilterSecondTextureCoordinateAttribute, 2, GLES20.GL_FLOAT, false, 0, mTexture2CoordinatesBuffer); 
} 

public void setRotation(final Rotation rotation, final boolean flipHorizontal, final boolean flipVertical) { 
    float[] buffer = TextureRotationUtil.getRotation(rotation, flipHorizontal, flipVertical); 

    ByteBuffer bBuffer = ByteBuffer.allocateDirect(32).order(ByteOrder.nativeOrder()); 
    FloatBuffer fBuffer = bBuffer.asFloatBuffer(); 
    fBuffer.put(buffer); 
    fBuffer.flip(); 

    mTexture2CoordinatesBuffer = bBuffer; 
} 
} 

我的猜測它涉及到用String SUBTRACT_BLEND_GRAGMENT_SHADER & String VERTEX_SHADER改變一些東西。

+0

對不起,我的誤解,但請你提供什麼樣的數據作爲輸入,你想作爲輸出接收什麼? –

+0

嗨。我有一個位圖作爲輸入,最終的輸出也應該是一個位圖 – Zen

+0

你到底想要達到什麼目的?我嘗試過幾次閱讀您的問題,但無法理解要求。 – codetiger

回答

1

顏色矩陣是將某些像素的新顏色分量值定義爲同一像素當前顏色分量的線性函數的實體。即顏色矩陣轉換的唯一輸入是像素,應該轉換顏色。沒有辦法讓其他像素參與這種轉換。無論它們是來自其他圖像的像素還是變換像素的鄰居 - 都不可能。

相關問題