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 上运行 Windows 7、OpenGL 4.10 和 LWJGL 2.7.1 版。

所以有什么问题?有任何想法吗?提前致谢。

4

2 回答 2

1

pixel.position() 和 pixel.limit() 告诉我们缓冲区中没有任何内容

他们有吗?我认为更简单的方法是查看缓冲区的内容。

此外,Display.update交换缓冲区。交换后后台缓冲区的内容未定义。因此,您应该从前缓冲区读取(不是一个好主意)或在交换之前读取后缓冲区。

于 2011-07-22T13:17:55.623 回答
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

于 2011-07-23T01:46:29.853 回答