glReadPixels всегда возвращает черное изображение

Несколько раз назад я написал код для отрисовки сцены OpenGL в растровое изображение в Delphi RAD Studio XE7, который хорошо работал. Этот код рисует и завершает сцену, затем получает пиксели, используя функцию glReadPixels. Недавно я пытался скомпилировать точно такой же код на Lazarus, однако получаю только черное изображение.

Вот код

// create main render buffer
glGenFramebuffers(1, @m_OverlayFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_OverlayFrameBuffer);

// create and link color buffer to render to
glGenRenderbuffers(1, @m_OverlayRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_OverlayRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                          GL_COLOR_ATTACHMENT0,
                          GL_RENDERBUFFER,
                          m_OverlayRenderBuffer);

// create and link depth buffer to use
glGenRenderbuffers(1, @m_OverlayDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_OverlayDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                          GL_DEPTH_ATTACHMENT,
                          GL_RENDERBUFFER,
                          m_OverlayDepthBuffer);

// check if render buffers were created correctly and return result
Result := (glCheckFramebufferStatus(GL_FRAMEBUFFER) = GL_FRAMEBUFFER_COMPLETE);

...

// flush OpenGL
glFinish;
glPixelStorei(GL_PACK_ALIGNMENT,   4);
glPixelStorei(GL_PACK_ROW_LENGTH,  0);
glPixelStorei(GL_PACK_SKIP_ROWS,   0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);

// create pixels buffer
SetLength(pixels, (m_pOwner.ClientWidth * m_Factor) * (m_pOwner.ClientHeight * m_Factor) * 4);

// is alpha blending or antialiasing enabled?
if (m_Transparent or (m_Factor <> 1)) then
    // notify that pixels will be read from color buffer
    glReadBuffer(GL_COLOR_ATTACHMENT0);

// copy scene from OpenGL to pixels buffer
glReadPixels(0,
             0,
             m_pOwner.ClientWidth  * m_Factor,
             m_pOwner.ClientHeight * m_Factor,
             GL_RGBA,
             GL_UNSIGNED_BYTE,
             pixels);

Как я уже проверил, и я на 100% уверен, что что-то действительно нарисовано на моей сцене (также на стороне Lazarus), GLext хорошо инициализирован и фрейм-буфер правильно построен (условие glCheckFramebufferStatus(GL_FRAMEBUFFER) = GL_FRAMEBUFFER_COMPLETE возвращает эффективно true), Я был бы очень признателен, если бы кто-то мог указать мне, что я делаю неправильно в своем коде, еще раз зная, что на том же компьютере он хорошо работает в Delphi RAD Studio XE7, но не в Lazarus.

С уважением

0 ответов

Другие вопросы по тегам