2017-04-18 20 views
0

処理された画像をOpenGL ESで保存するために、以下のコードを作成しました。それはうまくいく。その後androidのglReadPixels()による24ビットカラー情報の取得方法

ByteBuffer bb = ByteBuffer.allocate(mWidth * mHeight * 4); 
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, bb); 

try { 
    TJCompressor tjCompressor = new TJCompressor(bb.array(), 0, 0, mWidth, 0, mHeight, TJ.PF_RGB); 
    tjCompressor.setJPEGQuality(100); 
    tjCompressor.setSubsamp(TJ.SAMP_444); 
    return tjCompressor.compress(0); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

、メモリおよび処理時間を節約するためのアルファチャンネルなし24ビットの色情報を取得するために次のように、Iは、ライン#1と符号の#2を変更しました。

ByteBuffer bb = ByteBuffer.allocate(mWidth * mHeight * 3); 
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGB, GL_UNSIGNED_BYTE, bb); 

そしてさらに、IはMGL(GL10インスタンス)のEGLConfigでEGL_ALPHA_SIZEを除去します。 GLUtils.texImage2D()メソッドが呼び出されたときに内部フォーマットパラメータとしてGLES20.GL_RGBを渡しました。

しかし、結果は何か問題があることを示しています。結果画像は黒色で、glReadPixels()メソッド呼び出し後にbbバッファーのデータをチェックしたところ、すべてのデータがゼロであることがわかりました。私は助言が必要です。ヘルプ、plz。コアGLES2で

答えて

0

glReadPixelsためのみformat/type有効なコンボは、次のとおり

  • GL_RGBA/GL_UNSIGNED_BYTE
  • オプションフレームバッファ固有format/typeglGetIntegerv介し照会GL_IMPLEMENTATION_COLOR_READ_FORMATGL_IMPLEMENTATION_COLOR_READ_TYPEとそれぞれ

GLES2でエクステンションなしGL_IMPLEMENTATION_COLOR_READ_FORMAT/GL_IMPLEMENTATION_COLOR_READ_TYPEに何か役に立つものがない場合は、残念ながらGL_RGBA/GL_UNSIGNED_BYTEがついています。

GLES3の場合、glReadPixelsにはGL_PACK_BUFFERglMapBufferRangeにはformatの制限があります。

ドライバは、rgba8、rgb565、rgba4などのより整列したフォーマットだけを実装する代わりに、きめ細かくパックされたrgb8 24ビットフォーマットをエミュレートする傾向があることに注意してください。 「rgb8」として公開されるレンダリング可能な形式は、場面の背後にある可能性があります。

ドライバの依存度は高くなりますが、フレームバッファの内容を気にする必要がなければ、EXT_discard_framebufferでメモリ帯域幅を取り戻すことができます。 (またはGLES3のglInvalidateFramebuffer

また、EGL_KHR_lock_surface3を参照することもできます。

+0

詳細はお返事ありがとうございます。私はそれが他のいくつかのデバイスで正常に動作することを発見しました。 –

関連する問題