簡體   English   中英

Android OpenGL ES 3.0 PBO而不是glReadPixels()

[英]Android OpenGL ES 3.0 PBO instead of glReadPixels()

我想使用PBO(對於GLES 3設備)改進glReadPixels()性能,我在這段代碼中遇到了一個問題:

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

目前它失敗了glReadPixels()方法。 我發現了這個這個 ,但我無法發送零,因為它需要一個IntBuffer參數。 我非常感謝有關這個問題的任何建議

更新:似乎不可能只為該任務使用Java API。 所以我使用ndk添加一個函數,用正確的最后一個參數調用glReadPixels() (int offset)現在沒有一個GL調用產生錯誤。

這是我的jni c代碼:

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

現在的問題是glReadPixels()調用比沒有PBO需要更多的時間,所以還沒有性能提升 我將探索為什么會發生這種情況並在找到某些內容時進行更新。

更新2我忘了更早更新它,但事實上問題是我使用pbuffer表面,這就是為什么我沒有性能提升。 我比較了不使用pbuffer表面的選項和選項,性能提升很大。

因此,如果在屏幕外渲染並使用glReadPixels,則值得使用pbuffer表面

在glReadPixels總是殺死性能之后立即映射PBO緩沖區。 您請求映射時GPU仍在工作。 因此,glMapBufferRange等待gpu完成讀取PBO的像素。 如果你繼續在glReadPixels之后渲染並且在一些幀之后進行映射,那么你將獲得性能提升。

更多信息請訪問: http//www.songho.ca/opengl/gl_pbo.html查看“映射PBO”部分。

暫無
暫無

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

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