Image glReadPixels始终返回黑色图像
几天前,我在DelphiRadStudioXe7中编写了一段代码,将OpenGL场景绘制成位图,效果很好。这段代码绘制并完成一个场景,然后使用glReadPixels函数获取像素。我最近试图在Lazarus上编译完全相同的代码,但是我只得到了一个黑色的图像 这是密码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
// 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使用的缓冲区。你应该改用纹理。