簡體   English   中英

Android OpenGL ES將yuv預覽處理為RGBA

[英]Android OpenGL ES process yuv preview as RGBA

我想使用OpenGL處理​​來自Android平台上格式為NV21的相機中的數據。

我的代碼如下:

頂點着色器:

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格式字節數組,然后發送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中的結果看起來更藍。 我的代碼有什么問題嗎? 我很麻煩

為什么不使用GLSurfaceView並生成SurfaceTexture ,然后使用setPreviewTexture將其傳遞到相機中呢? 如果要像素RGB數據,請使用glReadPixels獲取緩沖區數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM