2012-05-01 6 views
3

아이디어는 서로 다른 색상의 첨부 파일로 된 FrameBuffer 객체의 장면의 특정 부분을 렌더링 한 다음 최종 이미지의 깊이 버퍼를 사용하여 결합합니다. 첫 번째 단계에서는 단 하나의 첨부 파일로 렌더링 한 다음 화면에 렌더링하려고합니다. 나는이 목적을 위해 glut을 사용하고 나의 오래된 그래픽 카드 때문에 EXT_framebuffer_object 명세를 사용하고있다. 메인 함수에서 내가 가진 : 디스플레이 콜백 함수에서 FBO에서 화면으로의 OpenGL 렌더링

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(); 
} 

나는

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(); 
} 

이 출력은 빈 장면입니다.

답변

10
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); 

GL_COLOR_ATTACHMENT0_EXTglDrawBuffer()에 대한 유효한 인수가 아닙니다.

FBO를 시각화하려면 텍스처 첨부 파일을 추가하십시오. FBO와 draw a full-screen textured quad에 대한 렌더링이 끝나면 텍스처 첨부물을 묶으십시오.

+3

이야기의 도덕은 : 모든 전화 후에 오류를 확인하십시오. 적어도 디버그 빌드에서. – Flexo

+0

[BuGLe] (http://www.opengl.org/sdk/tools/BuGLe/)은 Linux를 사용하고 있다면 도움이 될 것입니다. Windows 용 glintercept (http://code.google.com/p/glintercept/)도 있습니다. – genpfault

+0

도움을 주신 데 대해 감사드립니다. 약간의 실험을 마치면 기대했던대로 작동했습니다. 또 다른 질문 : 다른 컴퓨터에 렌더링 된 여러 이미지를 다른 중앙 컴퓨터의 깊이 버퍼를 사용하여 하나의 이미지로 결합하려면 어떻게해야합니까? 깊이 버퍼의 이미지와 값을 읽고 중앙 컴퓨터로 보내야합니까? – Ray