在 OpenGL ES 2 着色器中使用 Android 4x5 ColorMatrix

Use Android 4x5 ColorMatrix in OpenGL ES 2 Shader

我正在尝试在 OpenGL ES 2 中使用 Android Color Matrix。我已经能够在着色器中使用以下代码来使用 4x4 矩阵(这还添加了一个强度参数):

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);
}    

但我正在努力研究如何将 Android 4x5 矩阵转换为可在着色器中使用的 vec4 矩阵。我对 Alpha 通道不感兴趣。

最直接的方法可能是将ColorMatrix拆分为mat4vec4,其中mat4包含输入组件的乘数,并且vec4 常量偏移量。

需要注意的一个细节是内存中矩阵元素的顺序。 OpenGL 使用列主要存储,其中 ColorMatrix 似乎是行主要顺序。但看起来您已经通过在着色器代码中乘以右侧的输入向量来纠正这种差异。

着色器代码将如下所示:

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

在 Java 代码中,假设您有一个名为 mat:

ColorMatrix
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.