2014-04-29 5 views
1

PBO을 사용하여 스크린 샷을 찍었습니다. 그러나 결과 이미지는 모두 검은 색입니다. PBO 없이는 완벽하게 작동합니다. 이 일을하기 전에 돌봐야 할 것이 있습니까?Android 4.3 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); 
} 

답변

1
GLES30.glReadPixels(0, 0, (int)mScreenWidth, (int)mScreenHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb); 

BB이 당신의 PBO에 오프셋으로 해석이다 희망도를 사용합니다. 따라서 버퍼를 작성하고 있습니다 (일부 드라이버에서는이 코드가 충돌을 일으킴). bb 대신 0을 전달해야합니다. PBO에서 데이터를 검색하려면 glMapBuffer를 사용하십시오.

관련 문제