从FBO到屏幕的OpenGL渲染

从FBO到屏幕的OpenGL渲染,opengl,rendering,framebuffer,Opengl,Rendering,Framebuffer,其思想是以不同的颜色附件渲染帧缓冲区对象中场景的特定部分,然后使用深度缓冲区对最终图像进行组合。在第一步中,我只想渲染到单个附件,然后渲染到屏幕。为此,我使用glut和EXT\u framebuffer\u object规范,因为我的旧图形卡。在主要功能中,我有: int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(600, 512); glutInitDispla

其思想是以不同的颜色附件渲染帧缓冲区对象中场景的特定部分,然后使用深度缓冲区对最终图像进行组合。在第一步中,我只想渲染到单个附件,然后渲染到屏幕。为此,我使用glut和
EXT\u framebuffer\u object
规范,因为我的旧图形卡。在主要功能中,我有:

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(600, 512);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    int mainHandle = glutCreateWindow("Demo");
    glutSetWindow(mainHandle);
    glutDisplayFunc(RenderCallback);
    glutReshapeFunc(ReshapeCallback);
    glutIdleFunc(IdleCallback);
    glutKeyboardFunc(KeyboardCallback);
    glutSpecialFunc(ArrowKeyCallback);
    glutMouseFunc(MouseCallback);
    glutMotionFunc(MotionCallback);

    MotionCallback(0,0);
    atexit(ExitNx);

    // Setup default render states
    glClearColor(0.3f, 0.4f, 0.5f, 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);

    // Setup lighting
    glEnable(GL_LIGHTING);
    float ambientColor[]    = { 0.0f, 0.1f, 0.2f, 0.0f };
    float diffuseColor[]    = { 1.0f, 1.0f, 1.0f, 0.0f };       
    float specularColor[]   = { 0.0f, 0.0f, 0.0f, 0.0f };       
    float position[]        = { 100.0f, 100.0f, 400.0f, 1.0f };     
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientColor);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseColor);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularColor);
    glLightfv(GL_LIGHT0, GL_POSITION, position);
    glEnable(GL_LIGHT0);
    GLenum status,st1,st2;                                            
    GLint colorBufferCount ;
    glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &colorBufferCount);   
    printf("Max number of attachments:%d \n " ,colorBufferCount);
    //initialising FBO
    glGenFramebuffersEXT(1,&fb);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fb);
    //attaching an image to render to
    glGenRenderbuffersEXT(1,&colorbf);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,colorbf);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,GL_RGBA8,600,512);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,   GL_RENDERBUFFER_EXT, colorbf);
    //creating depht buffer
    glGenRenderbuffersEXT(1, &depth_rb);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 600, 512);
    //attaching the depth buffer to the FBO
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb);
    st1=glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    //checking for errors
    st2=glGetError();
    if(st1==GL_FRAMEBUFFER_COMPLETE_EXT)
        printf("so far so good\n ");
    else
        if(st1==GL_FRAMEBUFFER_UNSUPPORTED_EXT)
            printf("not good");
    const GLubyte *sir= new GLubyte [256];
    sir=gluErrorString(st1);
    printf("error received %s \n", sir);

    glutMainLoop();
}
在display回调函数中

void RenderCallback()
{
    // Setup projection matrix
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0f, (float)glutGet(GLUT_WINDOW_WIDTH)/(float)glutGet(GLUT_WINDOW_HEIGHT), 1.0f, 10000.0f);
    gluLookAt(gEye.x, gEye.y, gEye.z, gEye.x + gDir.x, gEye.y + gDir.y, gEye.z + gDir.z, 0.0f, 1.0f, 0.0f);

    // Setup modelview matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); //setting our FBO to render to
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  
    //render code 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0); //unbiding

    //now I wish to see what I have written in the colorbf attachment , most likely my mistake is in the following to come
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();
    //should I have done something else before?
    glutSwapBuffers();
}
输出为空场景

glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
GL\u COLOR\u ATTACHMENT0\u EXT
不是的有效参数


如果要可视化FBO,请添加纹理附件。渲染完成后,只需将纹理附件绑定到FBO和。

故事的寓意是:每次调用后检查错误。至少在调试版本中。如果你在Linux上,应该会有帮助。还有一个是针对Windows的。谢谢你的帮助,经过一段时间的试验,它的工作方式与我期望的一样。如果我可以问另一个问题:我应该如何使用另一台中央计算机上的深度缓冲区将在不同计算机上渲染的多个图像组合成一个图像。我必须读取图像和深度缓冲区的值并将其发送到中央计算机吗?如果您不想自己进行网络步法,您可以试一试。遗憾的是,我必须进行网络连接,在这个范围内,我使用MPI,但在测试之前,我想在同一台计算机上进行实验,以便了解和查看结果。如果你知道一些可以给我指出正确方向的链接,你能分享一下吗?