我想在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