Android OpenGL ES 3.0 PBO anstelle von glReadPixels()

Möchte ich verbessern glReadPixels() Leistung mit PBO (für die GLES-3-Geräte) und ich lief in ein problem in diesem Stück code:

final ByteBuffer pboByteBuffer = ByteBuffer.allocateDirect(4 * mWidth * mHeight);
pboByteBuffer.order(ByteOrder.nativeOrder());

//set framebuffer to read from
GLES30.glReadBuffer(GLES30.GL_BACK);

//bind pbo
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, mPboHandleContainer[0]);

//read pixels(should be instant)
GLES30.glReadPixels(0, 0, mWidth, mHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, pboByteBuffer);

//map pbo to bb
ByteBuffer byteBuffer =
        ((ByteBuffer) GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, 4 * mWidth * mHeight,
                                              GLES30.GL_MAP_READ_BIT)).order(ByteOrder.nativeOrder());

//unmap pbo
GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER);

//unbind pbo
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);

Im moment scheitert es glReadPixels() Methode. Ich fand diese & diese, aber ich bin nicht in der Lage zu senden, eine null, weil Sie ein IntBuffer argument. Ich würde es sehr schätzen, Anregungen, über das Thema

UPDATE: Es scheint unmöglich zu sein, nur Java-API für diese Aufgabe. Also ich habe ndk hinzufügen, eine Funktion, die nennt glReadPixels() mit korrekten Letzte argument(int offset)
Nun keiner meiner GL-Aufrufe, wird ein Fehler erzeugt.

Das ist meine jni c-code:

#include <jni.h>

#include <GLES3/gl3.h>

#ifdef __cplusplus
extern "C" {
    JNIEXPORT void JNICALL Java_somepackage_GLES3PBOReadPixelsFix_glReadPixelsPBO(JNIEnv * env, jobject obj, jint x, jint y, jint width, jint height, jint format, jint type, jint offsetPBO);
};
#endif

JNIEXPORT void JNICALL Java_somepackage_GLES3PBOReadPixelsFix_glReadPixelsPBO(JNIEnv * env, jobject obj, jint x, jint y, jint width, jint height, jint format, jint type, jint offsetPBO)
{
    glReadPixels(x, y, width, height, format, type, offsetPBO);
}

Nun problem ist, dass glReadPixels() aufrufen, dauert auch mehr Zeit als ohne PBo, so es gibt keinen performance-Gewinn noch. Ich werde untersuchen, warum das geschieht und zu aktualisieren, wenn ich etwas finden.

UPDATE 2
Ich vergaß zu aktualisieren es früher, aber in der Tat das problem war, dass ich mit pbuffer Oberfläche, die ist, warum ich hatte keine performance-Gewinn. Ich verglich diese option und die option der Verwendung von nicht pbuffer Oberfläche und der performance-Gewinn war riesig.

Also im Falle offscreen-rendering und mit glReadPixels es lohnt sich, mit pbuffer Oberfläche

  • Komisch. Sieht aus wie die Java entry point zu verwenden PBo für glReadPixels() fehlt. Wenn das tatsächlich der Fall, es ist nicht das erste mal geschah dies in Android. Die Verwendung von native code gibt immer eine Lösung. Das heißt, wenn Sie sich unmittelbar auf das Ergebnis warten, mit PBO wird wahrscheinlich nicht viel helfen. Die ganze Idee ist, dass die glReadPixels() Aufruf nicht blockieren. Wenn Sie Sie sofort sperren hinterher, dass nicht viel gutes tun.
  • Vielen Dank für das feedback! Noch nativer code ist nicht eine option in meinem Fall. Und das einzige, was wirklich zählt, ist wie viel Zeit nimmt meinen code-block im Vergleich zu einfachen glReadPixels () - Aufruf
  • Ich habe festgestellt das gleiche Problem auf Android nicht zu sehen, performance-Gewinn durch die Verwendung von PBO. Können Sie bitte erklären, wie nicht zu benutzen, pbuffer-Oberfläche auf Android zu ermöglichen die schnelle und asynchrone glReadPixels der PBO? Danke.
InformationsquelleAutor Sam | 2015-02-17
Schreibe einen Kommentar