glReadPixels () не может заполнить ByteBuffer - PullRequest
0 голосов
/ 22 июля 2011

Ну, я пытаюсь сделать скриншот для окна в OpenGL, используя LWJGL. Вот код:

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 +, которая отлично работает.

  • Я использую Windows 7, OpenGL 4.10 и LWJGL версии 2.7.1 на NVIDIA Corporation GeForce GTS 450 / PCI / SSE2.

Так в чем же проблема? Есть идеи? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

пиксел.позиция () и пиксел.предел () говорит нам, что в буфере ничего нет

Не так ли?Я думаю, что более надежным методом было бы посмотреть содержимое буфера.

Кроме того, Display.update меняет местами буферы.Содержимое заднего буфера не определяется после перестановки.Поэтому вы должны либо прочитать из переднего буфера (не очень хорошая идея), либо прочитать задний буфер перед заменой.

0 голосов
/ 23 июля 2011

Я дополнительно исследовал ответ Нико Боласа. И понял, что 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 () не возвращает ничего, основываясь только на своей позиции и ограничении. Спасибо, Никол Болас за полезный вклад. = D

...