2 * Test GL_EXT_framebuffer_object
9 #define GL_GLEXT_PROTOTYPES
17 static int Width = 400, Height = 400;
18 static GLuint MyFB, ColorRb, DepthRb;
19 static GLboolean Animate = GL_TRUE;
20 static GLfloat Rotation = 0.0;
26 GLenum err = glGetError();
28 printf("fbotest2: GL Error 0x%x at line %d\n", (int) err, line);
36 GLubyte *buffer = malloc(Width * Height * 4);
41 /* draw to user framebuffer */
42 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
43 glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
44 glReadBuffer(GL_COLOR_ATTACHMENT1_EXT);
46 status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
47 if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
48 printf("fbotest2: Error: Framebuffer is incomplete!!!\n");
53 glClearColor(0.5, 0.5, 1.0, 0.0);
54 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
56 glEnable(GL_DEPTH_TEST);
57 glEnable(GL_LIGHTING);
61 glRotatef(30.0, 1, 0, 0);
62 glRotatef(Rotation, 0, 1, 0);
66 /* read from user framebuffer */
67 glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
70 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
71 glDisable(GL_DEPTH_TEST); /* in case window has depth buffer */
72 glWindowPos2iARB(0, 0);
73 glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
82 Reshape( int width, int height )
84 float ar = (float) width / (float) height;
86 glViewport( 0, 0, width, height );
87 glMatrixMode( GL_PROJECTION );
89 glFrustum( -ar, ar, -1.0, 1.0, 5.0, 25.0 );
91 glMatrixMode( GL_MODELVIEW );
93 glTranslatef( 0.0, 0.0, -15.0 );
95 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);
96 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, width, height);
97 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRb);
98 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
109 glDeleteFramebuffersEXT(1, &MyFB);
110 glDeleteRenderbuffersEXT(1, &ColorRb);
111 glDeleteRenderbuffersEXT(1, &DepthRb);
112 assert(!glIsFramebufferEXT(MyFB));
113 assert(!glIsRenderbufferEXT(ColorRb));
114 assert(!glIsRenderbufferEXT(DepthRb));
115 glutDestroyWindow(Win);
123 Rotation = glutGet(GLUT_ELAPSED_TIME) * 0.1;
129 Key( unsigned char key, int x, int y )
152 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
153 printf("fbotest2: GL_EXT_framebuffer_object not found!\n");
156 printf("fbotest2: GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
158 glGenFramebuffersEXT(1, &MyFB);
159 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
160 assert(glIsFramebufferEXT(MyFB));
162 /* set color buffer */
163 glGenRenderbuffersEXT(1, &ColorRb);
164 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);
165 assert(glIsRenderbufferEXT(ColorRb));
166 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
167 GL_RENDERBUFFER_EXT, ColorRb);
168 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
170 /* setup depth buffer */
171 glGenRenderbuffersEXT(1, &DepthRb);
172 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRb);
173 assert(glIsRenderbufferEXT(DepthRb));
174 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
175 GL_RENDERBUFFER_EXT, DepthRb);
176 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, Width, Height);
178 CheckError(__LINE__);
180 /* restore to default */
181 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
182 CheckError(__LINE__);
187 main( int argc, char *argv[] )
189 glutInit( &argc, argv );
190 glutInitWindowPosition( 0, 0 );
191 glutInitWindowSize(Width, Height);
192 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
193 Win = glutCreateWindow(argv[0]);
194 glutReshapeFunc( Reshape );
195 glutKeyboardFunc( Key );
196 glutDisplayFunc( Display );