2 * Test GL_EXT_framebuffer_object
9 #define GL_GLEXT_PROTOTYPES
16 static int Width
= 400, Height
= 400;
17 static GLuint MyFB
, ColorRb
, DepthRb
;
18 static GLboolean Animate
= GL_TRUE
;
19 static GLfloat Rotation
= 0.0;
25 GLenum err
= glGetError();
27 printf("fbotest2: GL Error 0x%x at line %d\n", (int) err
, line
);
35 GLubyte
*buffer
= malloc(Width
* Height
* 4);
40 /* draw to user framebuffer */
41 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
42 glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT
);
43 glReadBuffer(GL_COLOR_ATTACHMENT1_EXT
);
45 status
= glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT
);
46 if (status
!= GL_FRAMEBUFFER_COMPLETE_EXT
) {
47 printf("fbotest2: Error: Framebuffer is incomplete!!!\n");
52 glClearColor(0.5, 0.5, 1.0, 0.0);
53 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
55 glEnable(GL_DEPTH_TEST
);
56 glEnable(GL_LIGHTING
);
60 glRotatef(30.0, 1, 0, 0);
61 glRotatef(Rotation
, 0, 1, 0);
65 /* read from user framebuffer */
66 glReadPixels(0, 0, Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
69 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
70 glWindowPos2iARB(0, 0);
71 glDrawPixels(Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
80 Reshape( int width
, int height
)
82 float ar
= (float) width
/ (float) height
;
84 glViewport( 0, 0, width
, height
);
85 glMatrixMode( GL_PROJECTION
);
87 glFrustum( -ar
, ar
, -1.0, 1.0, 5.0, 25.0 );
89 glMatrixMode( GL_MODELVIEW
);
91 glTranslatef( 0.0, 0.0, -15.0 );
93 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, ColorRb
);
94 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, width
, height
);
95 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, DepthRb
);
96 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_DEPTH_COMPONENT
,
107 glDeleteFramebuffersEXT(1, &MyFB
);
108 glDeleteRenderbuffersEXT(1, &ColorRb
);
109 glDeleteRenderbuffersEXT(1, &DepthRb
);
110 assert(!glIsFramebufferEXT(MyFB
));
111 assert(!glIsRenderbufferEXT(ColorRb
));
112 assert(!glIsRenderbufferEXT(DepthRb
));
120 Rotation
= glutGet(GLUT_ELAPSED_TIME
) * 0.1;
126 Key( unsigned char key
, int x
, int y
)
149 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
150 printf("fbotest2: GL_EXT_framebuffer_object not found!\n");
153 printf("fbotest2: GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
155 glGenFramebuffersEXT(1, &MyFB
);
156 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
157 assert(glIsFramebufferEXT(MyFB
));
159 /* set color buffer */
160 glGenRenderbuffersEXT(1, &ColorRb
);
161 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, ColorRb
);
162 assert(glIsRenderbufferEXT(ColorRb
));
163 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_COLOR_ATTACHMENT1_EXT
,
164 GL_RENDERBUFFER_EXT
, ColorRb
);
165 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
167 /* setup depth buffer */
168 glGenRenderbuffersEXT(1, &DepthRb
);
169 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, DepthRb
);
170 assert(glIsRenderbufferEXT(DepthRb
));
171 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_DEPTH_ATTACHMENT_EXT
,
172 GL_RENDERBUFFER_EXT
, DepthRb
);
173 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_DEPTH_COMPONENT
, Width
, Height
);
175 CheckError(__LINE__
);
177 /* restore to default */
178 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
179 CheckError(__LINE__
);
184 main( int argc
, char *argv
[] )
186 glutInit( &argc
, argv
);
187 glutInitWindowPosition( 0, 0 );
188 glutInitWindowSize(Width
, Height
);
189 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
190 glutCreateWindow(argv
[0]);
191 glutReshapeFunc( Reshape
);
192 glutKeyboardFunc( Key
);
193 glutDisplayFunc( Display
);