2013-03-26 110 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