2 * Test GL_EXT_framebuffer_object
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]);
195 glutReshapeFunc( Reshape
);
196 glutKeyboardFunc( Key
);
197 glutDisplayFunc( Display
);