在FrameBuffer中绘制但只获得黑色

时间:2014-09-21 20:55:35

标签: opengl framebuffer glew

使用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);

1 个答案:

答案 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);