0

さて、私はLWJGLを使用してOpenGLのウィンドウのスクリーンショットを撮ろうとしています。コードは次のとおりです。

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()の前に「Screenshot」ブロックを配置するなど、さまざまなバージョンのコードをすでに試しました。また、glReadBuffer(GL_BACK / GL_FRONT)とglDrawBuffer(GL_BACK / GL_FRONT)の組み合わせを使用しても無駄になります。

  • すべてのOpenGL状態とレンダリングを無効にしたので、空白の画面のみが表示され、glReadPixelsを使用してみました。空白の画面がバッファにあると想定されますが、バッファには何もありません。

  • glGetError()はエラーを生成しません。

  • 正常に動作する同様のC+バージョンがあります。

  • NVIDIA Corporation GeForce GTS 450 / PCI /SSE2でWindows7、OpenGL 4.10、およびLWJGLバージョン2.7.1を実行しています。

だから問題は何ですか?何か案は?前もって感謝します。

4

2 に答える 2

1

pixel.position()およびpixels.limit()は、バッファーに何もないことを示します

彼らはいますか?もっと確実な方法は、バッファの内容を調べることだと思います。

また、Display.updateバッファを交換します。スワップ後、バックバッファの内容は未定義です。したがって、スワップする前に、フロントバッファから読み取るか(お勧めできません)、バックバッファを読み取る必要があります。

于 2011-07-22T13:17:55.623 に答える
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()は、その位置と制限だけに基づいて何も返さなかったという結論にすぐに飛びつきました。有益な情報を提供してくれたNicolBolasに感謝します。= D

于 2011-07-23T01:46:29.853 に答える