0

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の結果がより青く見えることがわかりました。私のコードに何か問題がありますか?とても困りました。

4

1 に答える 1

0

GLSurfaceViewを使用してSurfaceTextureを生成し、setPreviewTextureを使用してカメラに渡してませんか?ピクセルRGBデータが必要な場合は、glReadPixelsを使用してバッファデータを取得します。

于 2013-06-16T17:14:23.383 に答える