我想在Android平臺上使用OpenGL處理來自相機的格式爲NV21的數據。Android OpenGL ES處理yuv預覽爲RGBA
我的代碼是下面:
頂點着色器:
attribute vec4 position;
attribute vec2 inputTextureCoordinate;
varying vec2 v_texCoord;
void main()
{
gl_Position = position;
v_texCoord = inputTextureCoordinate;
}
片段着色器:
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D yTexture;
uniform sampler2D uvTexture;
const mat3 yuv2rgb = mat3(
1, 0, 1.2802,
1, -0.214821, -0.380589,
1, 2.127982, 0
);
void main() {
vec3 yuv = vec3(
1.1643 * (texture2D(yTexture, v_texCoord).r - 0.0627),
texture2D(uvTexture, v_texCoord).a - 0.5,
texture2D(uvTexture, v_texCoord).r - 0.5
);
vec3 rgb = yuv * yuv2rgb;
gl_FragColor = vec4(rgb, 1.0);
}
我送yTexture:
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, w, h, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(data));
,其中數據是NV21格式c的字節數組相機預覽 我送uvTexture:
byte[] luminanceAlpha = new byte[w * h/2];
System.arraycopy(data, w * h, luminanceAlpha, 0, w * h/2);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE_ALPHA, w/2, h/2, 0, GLES20.GL_LUMINANCE_ALPHA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(luminanceAlpha));
這就是我認爲的代碼是很重要的。但是當我運行程序時,我發現GLSurfaceView的結果看起來更藍。我的代碼有問題嗎?我很麻煩。
爲什麼你在着色器中做1.1643 *()?看起來你沒有使用Y紋理。 – BlueVoodoo 2013-03-26 11:37:30
哦,對不起。這只是一個輸入錯誤。我已經修改了它。 – 2013-03-26 12:29:54
看起來沒事。你確定數據包含你的期望嗎? – BlueVoodoo 2013-03-26 14:29:30