2011-07-22 54 views
0

嗯,我正在嘗試使用LWJGL爲OpenGL中的窗口截圖。下面的代碼:glReadPixels()無法填充ByteBuffer

ByteBuffer pixels = ByteBuffer.allocateDirect(800*600*4); 
pixels.order(ByteOrder.nativeOrder()); 

while(!Display.isCloseRequested()) { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    render(); 
    Display.update(); 

    // "Screenshot" block 
    if(Keyboard.isKeyDown(Keyboard.KEY_Q)) { 
     pixels.clear(); 
     glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
     pixels.flip(); 

     // pixels.position() and pixels.limit() tells us that there is nothing in the buffer 
     // ... 
    } 
} 

而且......

  • 我已經嘗試過的代碼的各種版本,如Display.update之前放置了「截圖」塊()。並使用glReadBuffer(GL_BACK/GL_FRONT)和glDrawBuffer(GL_BACK/GL_FRONT)的組合無濟於事。

  • 我禁用了所有的OpenGL狀態和渲染,因此只顯示一個空白屏幕並嘗試使用glReadPixels。一個空白屏幕假設在緩衝區中,但沒有任何內容在緩衝區中。

  • glGetError()不會產生任何錯誤。

  • 我有一個類似的C +版本,工作正常。

  • 我在NVIDIA Corporation GeForce GTS 450/PCI/SSE2上運行Windows 7,OpenGL 4.10和LWJGL 2.7.1版。

那麼,什麼問題?有任何想法嗎?提前致謝。

回答

1

pixels.position()和pixels.limit()告訴我們,沒有什麼緩衝

真的嗎?我認爲更簡單的方法是查看緩衝區的內容。

另外,Display.update交換緩衝區。交換後,後臺緩衝區的內容不確定。所以你應該從前端緩衝區讀取(不是一個好主意),或者在交換之前讀取後臺緩衝區

0

我進一步研究了尼科博拉斯的回答。儘管先交換或不交換幀緩衝區,但實現glReadPixels確實返回了信息。

所以,這是我如何複製字節緩衝區。

glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

byte[] data = new byte[800*600*4]; 
while(pixels.hasRemaining()) { 
    int curr = pixels.position()/4; 
    int offset = (curr%800+(curr))*4; 
    data[offset] = pixels.get(); 
    data[offset+1] = pixels.get(); 
    data[offset+2] = pixels.get(); 
    data[offset+3] = pixels.get(); 
} 

我很快就得出結論,glReadPixels()根據其位置和限制不會返回任何東西。謝謝,Nicol Bolas提供了有用的信息。 = D