窗
使用glew
我正在尝试渲染屏幕并将渲染的img opengl保存到png文件中。
我在stackoverflow上遵循了一个高度评价的答案: How to render offscreen on OpenGL?
但我得到的png文件只是一个黑屏。
这是我的相关代码:
glutCreateWindow(argv[0]);
if(GLEW_OK!=glewInit())
{
return -1;
}
initScene();
GLuint fbo, render_buf;
glGenFramebuffers(1,&fbo);
glGenRenderbuffers(1,&render_buf);
glBindRenderbuffer(GL_RENDERBUFFER,render_buf);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, viewport.w, viewport.h);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
//Before drawing
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
glClear(GL_COLOR_BUFFER_BIT); // clear the color buffer
glMatrixMode(GL_MODELVIEW); // indicate we are specifying camera transformations
glLoadIdentity(); // make sure transformation is "zero'd"
//draw...
//glBegin(GL_POINTS) glColor3f, glVertex2f
//glFlush();
glFinish();
/*glutDisplayFunc(myDisplay);
glutPostRedisplay();*/
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
savePNG(outputPNGName,0,0,viewport.w,viewport.h);
//At deinit:
glDeleteFramebuffers(1,&fbo);
glDeleteRenderbuffers(1,&render_buf);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
如何解决问题? 谢谢
savePNG(相关代码):
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)image);
答案 0 :(得分:4)
此代码中至少存在两个问题:
GL_RGB8
不是渲染缓冲区的有效格式。来自glRenderbufferStorage()
man page:
internalformat指定用于renderbuffer对象存储的内部格式,并且必须是可颜色渲染,深度渲染或模板可渲染的格式。
最新规范文档(4.5,可从https://www.opengl.org/registry下载)中的表8.13列出了所有格式,其中一列显示了哪些格式是可着色的。 RGB8
在该列中没有复选标记。您可以使用GL_RGBA8
代替,这是可以颜色渲染的。
您可能还想查看glCheckFramebufferStatus()
功能,该功能可让您检查帧缓冲设置是否有效。
虽然我们没有看到savePNG()
的代码,但是您无法知道您想要从FBO读取像素数据。它很可能使用glReadPixels()
,它从当前读取帧缓冲区读取数据,而您的代码只设置绘制帧缓冲区。在调用savePNG()
之前,添加此调用以将读取帧缓冲区设置为FBO:
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);