Utilizar ColorMatrix o HexColor en BlendModeFilter – Android?
Actualmente, los BlendModes (Restar, Exclusión, etc.) usan LauncherImage como la máscara. ¿Puedo aplicar estos BlendModes a una ColorMatrix?
Estoy usando la GPUImageLibrary
- ¿Por qué está bloqueando glClear en OpenGLES?
- La construcción de un visor de modelo 3d Android?
- Android Video Recording de la superficie de OpenGL (GLSURFACEVIEW)
- Android OpenGLES Render-to-Texture
- OpenGL ES 2.0 vs OpenGL 3 - Similitudes y diferencias
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; } }
Supongo que implica cambiar algo con String SUBTRACT_BLEND_GRAGMENT_SHADER
& String VERTEX_SHADER
.
- Imagen de mapa de bits de opengl de Android no renderizada con texImage2D
- NVidia PerfHUD ES Tegra en Google Nexus 7
- Android OpenGL ES Soporte en todas partes?
- Cómo crear un mapa interactivo en Android
- Opengl fondo transparente y Vista previa de cámara no les gusta texturing
- Dibuja Pixel con OpenGLEs para Android
- Cómo transferir texturas de un contexto de OpenGL a otro
- Máximo agarre de la cámara y rendimiento de la pantalla
La matriz de color es la entidad que define nuevos valores de componentes de color para algunos píxeles como funciones lineales de las componentes de color actuales del mismo píxel. Es decir, la única entrada para la conversión de matriz de color es el píxel, que los colores deben ser transformados. No hay forma de involucrar a otros píxeles en dicha conversión. Independientemente si son píxeles de otra imagen o incluso vecinos de pixel transformado – es imposible.
- Windows 8.1 Device Manager muestra ahora el dispositivo ACER en lugar del dispositivo Android para Google Nexus 7
- Cómo cambiar el icono predeterminado en el SearchView, para ser utilizado en la barra de acción de Android?