Image glReadPixels始终返回黑色图像

Image glReadPixels始终返回黑色图像,image,opengl,get,lazarus,glreadpixels,Image,Opengl,Get,Lazarus,Glreadpixels,几天前,我在DelphiRadStudioXe7中编写了一段代码,将OpenGL场景绘制成位图,效果很好。这段代码绘制并完成一个场景,然后使用glReadPixels函数获取像素。我最近试图在Lazarus上编译完全相同的代码,但是我只得到了一个黑色的图像 这是密码 // create main render buffer glGenFramebuffers(1, @m_OverlayFrameBuffer); glBindFramebuffer(GL_FRAMEBUFFER, m_Overla

几天前,我在DelphiRadStudioXe7中编写了一段代码,将OpenGL场景绘制成位图,效果很好。这段代码绘制并完成一个场景,然后使用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);
//创建主渲染缓冲区
glGenFramebuffers(1,@m_OverlayFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,m_OverlayFrameBuffer);
//创建并链接要渲染的颜色缓冲区
glGenRenderbuffers(1,@m_overlayrrenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER,m_OverlayRenderBuffer);
GLrenderBuffer存储(GL_RENDERBUFFER,GL_RGBA8,宽度,高度);
glFramebufferRenderbuffer(GLU帧缓冲区,
GL_颜色_附件0,
格兰德布弗酒店,
m_OverlayRenderBuffer);
//创建并链接要使用的深度缓冲区
glGenRenderbuffers(1,@m_OverlayDepthBuffer);
glBindRenderbuffer(GLU RENDERBUFFER,m_OVERLAYDEPTHBUFER);
GLrenderBuffer存储(GL_RENDERBUFFER、GL_DEPTH_组件、宽度、高度);
glFramebufferRenderbuffer(GLU帧缓冲区,
GL_深度_附件,
格兰德布弗酒店,
m_OverlayDepthBuffer);
//检查渲染缓冲区是否正确创建并返回结果
结果:=(glCheckFramebufferStatus(GL\U FRAMEBUFFER)=GL\U FRAMEBUFFER\U COMPLETE);
...
//刷新OpenGL
glFinish;
glPixelStorei(GLU包装校准,4);
glPixelStorei(GL_PACK_ROW_LENGTH,0);
glPixelStorei(GL\u PACK\u SKIP\u行,0);
glPixelStorei(GL_PACK_SKIP_像素,0);
//创建像素缓冲区
设置长度(像素,(m_pOwner.ClientWidth*m_因子)*(m_pOwner.ClientHeight*m_因子)*4);
//是否启用alpha混合或抗锯齿?
如果(m_透明或(m_系数1)),则
//通知将从颜色缓冲区读取像素
glReadBuffer(GL_COLOR_ATTACHMENT0);
//将场景从OpenGL复制到像素缓冲区
glReadPixels(0,
0,
m_pOwner.ClientWidth*m_因子,
m_pOwner.ClientHeight*m_因子,
格尔巴,
GL_无符号字节,
像素);
正如我已经验证过的,并且我100%确信在我的场景中确实画了一些东西(也在Lazarus一侧),GLext已经很好地初始化,帧缓冲区已经正确构建(条件glCheckFramebufferStatus(GL_framebuffer)=GL_framebuffer_COMPLETE返回真值),如果有人能指出我在代码中做错了什么,我将非常感激,因为我再一次知道,在同一台计算机上,它在Delphi RAD Studio XE7中运行良好,但在Lazarus中却没有


关于

我不确定,但Renderbuffer是一个只能由内部OpenGL使用的缓冲区。你应该改用纹理。