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 glWindowPos2iARB(0, 0);
72 glDrawPixels(Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
81 Reshape( int width
, int height
)
83 float ar
= (float) width
/ (float) height
;
85 glViewport( 0, 0, width
, height
);
86 glMatrixMode( GL_PROJECTION
);
88 glFrustum( -ar
, ar
, -1.0, 1.0, 5.0, 25.0 );
90 glMatrixMode( GL_MODELVIEW
);
92 glTranslatef( 0.0, 0.0, -15.0 );
94 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, ColorRb
);
95 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, width
, height
);
96 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, DepthRb
);
97 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_DEPTH_COMPONENT
,
108 glDeleteFramebuffersEXT(1, &MyFB
);
109 glDeleteRenderbuffersEXT(1, &ColorRb
);
110 glDeleteRenderbuffersEXT(1, &DepthRb
);
111 assert(!glIsFramebufferEXT(MyFB
));
112 assert(!glIsRenderbufferEXT(ColorRb
));
113 assert(!glIsRenderbufferEXT(DepthRb
));
114 glutDestroyWindow(Win
);
122 Rotation
= glutGet(GLUT_ELAPSED_TIME
) * 0.1;
128 Key( unsigned char key
, int x
, int y
)
151 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
152 printf("fbotest2: GL_EXT_framebuffer_object not found!\n");
155 printf("fbotest2: GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
157 glGenFramebuffersEXT(1, &MyFB
);
158 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
159 assert(glIsFramebufferEXT(MyFB
));
161 /* set color buffer */
162 glGenRenderbuffersEXT(1, &ColorRb
);
163 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, ColorRb
);
164 assert(glIsRenderbufferEXT(ColorRb
));
165 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_COLOR_ATTACHMENT1_EXT
,
166 GL_RENDERBUFFER_EXT
, ColorRb
);
167 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
169 /* setup depth buffer */
170 glGenRenderbuffersEXT(1, &DepthRb
);
171 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, DepthRb
);
172 assert(glIsRenderbufferEXT(DepthRb
));
173 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_DEPTH_ATTACHMENT_EXT
,
174 GL_RENDERBUFFER_EXT
, DepthRb
);
175 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_DEPTH_COMPONENT
, Width
, Height
);
177 CheckError(__LINE__
);
179 /* restore to default */
180 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
181 CheckError(__LINE__
);
186 main( int argc
, char *argv
[] )
188 glutInit( &argc
, argv
);
189 glutInitWindowPosition( 0, 0 );
190 glutInitWindowSize(Width
, Height
);
191 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
192 Win
= glutCreateWindow(argv
[0]);
193 glutReshapeFunc( Reshape
);
194 glutKeyboardFunc( Key
);
195 glutDisplayFunc( Display
);