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 GLboolean copyPix
= GL_FALSE
;
37 GLboolean blitPix
= GL_FALSE
;
42 /* draw to user framebuffer */
43 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
44 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT
);
45 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT
);
47 status
= glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT
);
48 if (status
!= GL_FRAMEBUFFER_COMPLETE_EXT
) {
49 printf("fbotest2: Error: Framebuffer is incomplete!!!\n");
54 glClearColor(0.5, 0.5, 1.0, 0.0);
55 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
57 glEnable(GL_DEPTH_TEST
);
58 glEnable(GL_LIGHTING
);
62 glRotatef(30.0, 1, 0, 0);
63 glRotatef(Rotation
, 0, 1, 0);
68 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT
, MyFB
);
69 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT
);
70 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT
, 0);
71 glDrawBuffer(GL_BACK
);
73 glDisable(GL_DEPTH_TEST
); /* in case window has depth buffer */
75 glWindowPos2iARB(0, 0);
76 glCopyPixels(0, 0, Width
, Height
, GL_COLOR
);
79 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT
, MyFB
);
80 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT
);
81 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT
, 0);
82 glDrawBuffer(GL_BACK
);
84 glDisable(GL_DEPTH_TEST
); /* in case window has depth buffer */
86 glBlitFramebufferEXT(0, 0, Width
, Height
,
88 GL_COLOR_BUFFER_BIT
, GL_NEAREST
);
91 GLubyte
*buffer
= malloc(Width
* Height
* 4);
92 /* read from user framebuffer */
93 glReadPixels(0, 0, Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
96 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
97 glDisable(GL_DEPTH_TEST
); /* in case window has depth buffer */
98 glWindowPos2iARB(0, 0);
99 glDrawPixels(Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
105 CheckError(__LINE__
);
110 Reshape( int width
, int height
)
112 float ar
= (float) width
/ (float) height
;
114 glViewport( 0, 0, width
, height
);
115 glMatrixMode( GL_PROJECTION
);
117 glFrustum( -ar
, ar
, -1.0, 1.0, 5.0, 25.0 );
119 glMatrixMode( GL_MODELVIEW
);
121 glTranslatef( 0.0, 0.0, -15.0 );
123 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, ColorRb
);
124 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, width
, height
);
125 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, DepthRb
);
126 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_DEPTH_COMPONENT
,
137 glDeleteFramebuffersEXT(1, &MyFB
);
138 glDeleteRenderbuffersEXT(1, &ColorRb
);
139 glDeleteRenderbuffersEXT(1, &DepthRb
);
140 assert(!glIsFramebufferEXT(MyFB
));
141 assert(!glIsRenderbufferEXT(ColorRb
));
142 assert(!glIsRenderbufferEXT(DepthRb
));
143 glutDestroyWindow(Win
);
151 Rotation
= glutGet(GLUT_ELAPSED_TIME
) * 0.1;
157 Key( unsigned char key
, int x
, int y
)
180 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
181 printf("fbotest2: GL_EXT_framebuffer_object not found!\n");
184 printf("fbotest2: GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
186 glGenFramebuffersEXT(1, &MyFB
);
187 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
188 assert(glIsFramebufferEXT(MyFB
));
190 /* set color buffer */
191 glGenRenderbuffersEXT(1, &ColorRb
);
192 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, ColorRb
);
193 assert(glIsRenderbufferEXT(ColorRb
));
194 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_COLOR_ATTACHMENT0_EXT
,
195 GL_RENDERBUFFER_EXT
, ColorRb
);
196 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
198 /* setup depth buffer */
199 glGenRenderbuffersEXT(1, &DepthRb
);
200 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, DepthRb
);
201 assert(glIsRenderbufferEXT(DepthRb
));
202 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_DEPTH_ATTACHMENT_EXT
,
203 GL_RENDERBUFFER_EXT
, DepthRb
);
204 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_DEPTH_COMPONENT
, Width
, Height
);
206 CheckError(__LINE__
);
208 /* restore to default */
209 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
210 CheckError(__LINE__
);
215 main( int argc
, char *argv
[] )
217 glutInit( &argc
, argv
);
218 glutInitWindowPosition( 0, 0 );
219 glutInitWindowSize(Width
, Height
);
220 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
221 Win
= glutCreateWindow(argv
[0]);
223 glutReshapeFunc( Reshape
);
224 glutKeyboardFunc( Key
);
225 glutDisplayFunc( Display
);