FrankMonza
FrankMonza

Reputation: 2044

Use Android 4x5 ColorMatrix in OpenGL ES 2 Shader

I am trying to use Android Color Matrix in OpenGL ES 2. I have been able to use a 4x4 Matrix using the following code in the Shader (this adds also an intensity parameter):

varying vec2 textureCoordinate;
uniform lowp mat4 colorMatrix;
uniform lowp float intensity;
void main()
{
    vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
    vec4 outputColor = textureColor * colorMatrix;
    gl_FragColor = (intensity * outputColor) + ((1.0 - intensity) *     textureColor);
}    

But i am struggling on how i could convert Android 4x5 matrix to a vec4 matrix usable in the shader. I am not interested in Alpha channel.

Upvotes: 0

Views: 573

Answers (1)

Reto Koradi
Reto Koradi

Reputation: 54602

The most direct approach is probably to split the ColorMatrix into a mat4 and a vec4, where the mat4 contains the multipliers for the input components, and the vec4 the constant offsets.

One detail to watch out for is the order of the matrix elements in memory. OpenGL uses column major storage, where the ColorMatrix appears to be in row major order. But it looks like you're already correcting for this discrepancy by multiplying the input vector from the right in the shader code.

The shader code will then look like this:

uniform lowp mat4 colorMatrix
uniform lowp vec4 colorOffset;
...
    vec4 outputColor = textureColor * colorMatrix + colorOffset;

In the Java code, say you have a ColorMatrix named mat:

ColorMatrix mat = ...;
float[] matArr = mat.getArray();
float[] oglMat = {
    matArr[0],  matArr[1],  matArr[2],  matArr[3],
    matArr[5],  matArr[6],  matArr[7],  matArr[8],
    matArr[10], matArr[11], matArr[12], matArr[13],
    matArr[15], matArr[16], matArr[17], matArr[18]};
// Set value of colorMatrix uniform using oglMat.

float[] oglOffset = {matArr[4], matArr[9], matArr[14], matArr[19]};
// Set value of colorOffset uniform using oglOffset.

Upvotes: 1

Related Questions