2015-02-11 109 views
0

我想在OpenGL ES 2中使用Android Color Matrix。我已经能够在着色器中使用以下代码使用4x4矩阵(这也增加了亮度参数):在OpenGL ES 2着色器中使用Android 4x5 ColorMatrix

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通道不感兴趣。

回答

1

最直接的方法是可能的ColorMatrix分成mat4vec4,其中mat4包含了输入组件的乘法器,以及vec4不断偏移。

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

着色器代码就这个样子:

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

在Java代码中,说你有一个ColorMatrix命名为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. 
+0

这个工程就像一个魅力,这是同样的方法我在阅读Android ColorFilter.cpp源代码的帖子之前发现了几分钟(他们必须在HW加速画布上做同样的事情)。谢谢! – FrankMonza 2015-02-12 07:42:50