2015-02-11 3 views
0

Я пытаюсь использовать Android Color Matrix в OpenGL ES 2. Я был в состоянии использовать 4x4 Matrix с помощью следующего кода в шейдере (это добавляет также параметр интенсивности):Использование Android 4x5 ColorMatrix в OpenGL ES 2 Shader

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, которую можно использовать в шейдере. Меня не интересует канал Альфа.

ответ

1

Наиболее прямой подход, вероятно, чтобы разделить ColorMatrix в mat4 и vec4, где 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

Смежные вопросы