2013-03-26 99 views
0

我想在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的结果看起来更蓝。我的代码有问题吗?我很麻烦。

+0

为什么你在着色器中做1.1643 *()?看起来你没有使用Y纹理。 – BlueVoodoo 2013-03-26 11:37:30

+0

哦,对不起。这只是一个输入错误。我已经修改了它。 – 2013-03-26 12:29:54

+0

看起来没事。你确定数据包含你的期望吗? – BlueVoodoo 2013-03-26 14:29:30

回答

0

为什么不使用GLSurfaceView并生成SurfaceTexture,然后使用setPreviewTexture将它传递到相机?如果您想要像素RGB数据,请使用glReadPixels来获取缓冲区数据。

+0

感谢您的建议。由于SurfaceTexture仅支持API 11及以上版本。我使用SurfaceTexture时也遇到了问题。它会提示警告消息“updateTexImage:清除GL错误:0x502”,但这不会影响渲染。我怎样才能删除警告? – 2013-06-17 02:27:13

+0

您是否尝试过这篇文章[使用SurfaceTexture和OpenGL修改相机输出](http://stackoverflow.com/questions/12519235/modifying-camera-output-using-surfacetexture-and-opengl)?我使用[VideoSurfaceview](https://android.googlesource.com/platform/cts/+/master/tests/tests/media/src/android/media/cts/VideoSurfaceView.java)作为我的渲染环境,并更改MediaPlayer源码到相机,我没有任何警告信息。 – 2013-06-17 18:18:24

+0

我已经看到了,但不是同样的问题。我的警告根本不会影响跑步。我只是想知道。 – 2013-06-18 05:59:33