2017-04-18 9 views
0

Um das verarbeitete Bild mit OpenGL ES zu speichern, habe ich die Codes wie folgt erstellt. Und es funktioniert gut.Wie erhalten 24 Bit Farbinformationen von glReadPixels() auf Android?

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(); 
} 

Danach werden 24-Bit-Farbinformationen ohne Alphakanal für das Speichern von Speicher und Verarbeitungszeit zu erhalten, änderte ich die Zeile # 1 und # 2 der Codes wie folgt.

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

Und dann zusätzlich entfernte ich EGL_ALPHA_SIZE bei mGL (GL10-Instanz) EGLConfig s '. Und ich übergab GLES20.GL_RGB als internen Formatparameter, wenn GLUtils.texImage2D() -Methode aufgerufen wird.

Das Ergebnis zeigt jedoch an, dass etwas nicht stimmt. Das Ergebnisbild hat nur eine schwarze Farbe, und als ich die Daten von bb Puffer nach glReadPixels() Methode Aufruf überprüft habe, fand ich alle Daten ist Null. Ich brauche Hilfe. Hilfe, PLZ.

Antwort

0

Im Kern GLES2, die einzigen gültigen format/type Combos für glReadPixels sind:

  • GL_RGBA/GL_UNSIGNED_BYTE
  • Optional Framebuffer spezifische format/type abgefragt über glGetIntegerv mit GL_IMPLEMENTATION_COLOR_READ_FORMAT und GL_IMPLEMENTATION_COLOR_READ_TYPE jeweils

In GLES2 ohne exten sionen, wenn GL_IMPLEMENTATION_COLOR_READ_FORMAT/GL_IMPLEMENTATION_COLOR_READ_TYPE nichts nützliches ergeben, stecken Sie leider mit GL_RGBA/GL_UNSIGNED_BYTE fest.

Mit GLES3 können Sie glReadPixels in die gebundene GL_PACK_BUFFER und glMapBufferRange dass, obwohl wieder, du bist von format begrenzt.

Ich werde feststellen, dass Treiber anfällig sind, eng gepackte rgb8 24-Bit-Formate zu emulieren, stattdessen nur die besser ausgerichteten Formate wie rgba8, rgb565 und rgba4 implementieren. Ein renderbares Format, das als "rgb8" verfügbar gemacht wird, ist möglicherweise nur hinter den Kulissen rgbx8.

In hohem Maße treiberabhängig, aber wenn es Ihnen nicht wichtig ist, den Inhalt des Framebuffers beizubehalten, können Sie möglicherweise eine gewisse Speicherbandbreite mit EXT_discard_framebuffer zurückgewinnen. (oder glInvalidateFramebuffer in GLES3)

Sie könnten auch in EGL_KHR_lock_surface3 suchen.

+0

Danke für Ihre Antwort im Detail. Ich fand, dass es normalerweise auf einigen anderen Geräten funktioniert. –

Verwandte Themen