2011-07-22 9 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

さらにNico Bolasの答えを調べました。そして実現された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

関連する問題