簡體   English   中英

Android 4.3 PBO無法正常工作

[英]Android 4.3 PBO not working

我正在使用PBO截屏。 但是,結果圖像全為黑色。 在沒有PBO情況下,它可以很好地工作。 在執行此操作之前,我需要注意什么嗎?

我什至嘗試渲染到FBO ,然后使用GLES30.glReadBuffer(GLES30.GL_COLOR_ATTACHMENT0) ,沒有希望

public void SetupPBO(){ 
    GLES30.glGenBuffers(1, pbuffers, 0);        
    GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbuffers[0]);
    int size = (int)this.mScreenHeight *  (int)this.mScreenWidth * 4;
    GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, size, null, GLES30.GL_DYNAMIC_READ);
    checkGlError("glReadBuffer");
    GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);
}

private void Render(float[] m) {
    .......//Normal render logic
    exportBitmap();
}

 private void exportBitmap() {
    int screenshotSize = (int)this.mScreenWidth * (int)this.mScreenHeight;
    ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
    bb.order(ByteOrder.nativeOrder());

    // set the target framebuffer to read
    GLES30.glReadBuffer(GLES30.GL_FRONT);
    checkGlError("glReadBuffer");
    GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbuffers[0]);
    GLES30.glReadPixels(0, 0, (int)mScreenWidth, (int)mScreenHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb);  //<------ not working ?????

    int pixelsBuffer[] = new int[screenshotSize];
    bb.asIntBuffer().get(pixelsBuffer);
    bb = null;

    for (int i = 0; i < screenshotSize; ++i) {
        // The alpha and green channels' positions are preserved while the
        // red and blue are swapped
        pixelsBuffer[i] = ((pixelsBuffer[i] & 0xff00ff00))
                    | ((pixelsBuffer[i] & 0x000000ff) << 16)
                    | ((pixelsBuffer[i] & 0x00ff0000) >> 16);
    }

    Bitmap bitmap = Bitmap.createBitmap((int)mScreenWidth, (int)mScreenHeight, Bitmap.Config.ARGB_8888);
    bitmap.setPixels(pixelsBuffer, screenshotSize - (int)mScreenWidth, -(int)mScreenWidth, 0, 0, (int)mScreenWidth, (int)mScreenHeight);
    SaveBitmap(bitmap);
}
GLES30.glReadPixels(0, 0, (int)mScreenWidth, (int)mScreenHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb);

bb解釋為您的PBO中的偏移量。 因此,您正在寫出緩沖區不足(在某些驅動程序上,此代碼會導致崩潰)。 您應該傳遞0而不是bb。 要從PBO檢索數據,請使用glMapBuffer。

暫無
暫無

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

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