2013-05-31 39 views
2

我是openGL的新手,我正在使用帧缓冲区对象(FBO)进行离屏渲染,正如大多数其他问题的答案所示。将FBO渲染到外部图像文件

 GLuint fb[1],color_rb[1]; 
    glGenFramebuffersEXT(1, fb); 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb[0]); 

    glGenRenderbuffersEXT(1, color_rb); 
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, color_rb[0]); 
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, 256, 256); 
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, color_rb[0]); 

    // rendering to the FBO 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb[0]); 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glViewport(0, 0, 256, 256); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 256.0, 0.0, 256.0, -1.0, 1.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glDisable(GL_TEXTURE_2D); 
    glDisable(GL_BLEND); 
    glEnable(GL_DEPTH_TEST); 

    RenderATriangle();  // i have defined this function to render a texture in a triangular geometry 

    GLubyte pixels[4*4*4]; 
    glReadPixels(0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_BYTE, pixels); 

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

当我使用时,我没有收到任何编译错误。我也在我的Ubuntu 12.10系统中安装了glew。当我执行此代码时,分段错误即将到来。我尝试使用cout语句来检查错误在哪里,并且我发现使用glGenFramebuffersEXT(1,GLuint * array)产生帧缓冲区时会出现错误。那么任何人都可以告诉我,在我的代码中FBO的生成有什么问题。 还有一件事,如果有人可以告诉如何渲染到磁盘中的外部图像文件。

我进口:

#include <iostream> 
#include <GL/glew.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

回答

4

当我执行这个代码,分段故障即将来临。

在Linux上,OpenGL-1.2之后的任何东西都必须在运行时初始化。这称为分机加载。由于如果“手动”执行该任务有点令人生畏,已经开发了许多扩展加载程序库。流行的选择是GLEW

+0

非常感谢......你能用一小段代码来帮助我使用GLEW并使FBO初始化工作。 –

+1

@ChinmayJindal:你可能会发现我写的多年前的FBO例子很有用:https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/minimalfbo/minimalfbo.c - 它包含GLEW和FBO代码。 – datenwolf

+0

我想问你一件事... 是否有可能与基于Linux的系统上的OpenGL的帮助下生成这个输出没有窗口? –