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();
}
이 출력은 빈 장면입니다.
이야기의 도덕은 : 모든 전화 후에 오류를 확인하십시오. 적어도 디버그 빌드에서. – Flexo
[BuGLe] (http://www.opengl.org/sdk/tools/BuGLe/)은 Linux를 사용하고 있다면 도움이 될 것입니다. Windows 용 glintercept (http://code.google.com/p/glintercept/)도 있습니다. – genpfault
도움을 주신 데 대해 감사드립니다. 약간의 실험을 마치면 기대했던대로 작동했습니다. 또 다른 질문 : 다른 컴퓨터에 렌더링 된 여러 이미지를 다른 중앙 컴퓨터의 깊이 버퍼를 사용하여 하나의 이미지로 결합하려면 어떻게해야합니까? 깊이 버퍼의 이미지와 값을 읽고 중앙 컴퓨터로 보내야합니까? – Ray