2 * Test GL_EXT_framebuffer_object
9 #define GL_GLEXT_PROTOTYPES
16 static int Width
= 400, Height
= 400;
17 static GLuint MyFB
, MyRB
;
23 GLenum err
= glGetError();
25 printf("GL Error 0x%x at line %d\n", (int) err
, line
);
33 GLubyte
*buffer
= malloc(Width
* Height
* 4);
36 /* draw to user framebuffer */
37 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
38 glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT
);
39 glReadBuffer(GL_COLOR_ATTACHMENT1_EXT
);
41 status
= glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT
);
42 if (status
!= GL_FRAMEBUFFER_COMPLETE_EXT
) {
43 printf("Framebuffer incomplete!!!\n");
46 glClearColor(0.5, 0.5, 1.0, 0.0);
47 glClear( GL_COLOR_BUFFER_BIT
);
58 /* read from user framebuffer */
59 glReadPixels(0, 0, Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
62 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
63 glWindowPos2iARB(0, 0);
64 glDrawPixels(Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
73 Reshape( int width
, int height
)
76 float ar
= (float) width
/ (float) height
;
78 glViewport( 0, 0, width
, height
);
79 glMatrixMode( GL_PROJECTION
);
82 glFrustum( -ar
, ar
, -1.0, 1.0, 5.0, 25.0 );
84 glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
86 glMatrixMode( GL_MODELVIEW
);
88 glTranslatef( 0.0, 0.0, -15.0 );
91 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
98 glDeleteFramebuffersEXT(1, &MyFB
);
99 glDeleteRenderbuffersEXT(1, &MyRB
);
100 assert(!glIsFramebufferEXT(MyFB
));
101 assert(!glIsRenderbufferEXT(MyRB
));
107 Key( unsigned char key
, int x
, int y
)
125 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
126 printf("GL_EXT_framebuffer_object not found!\n");
129 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
131 glGenFramebuffersEXT(1, &MyFB
);
133 assert(!glIsFramebufferEXT(MyFB
));
134 glDeleteFramebuffersEXT(1, &MyFB
);
135 assert(!glIsFramebufferEXT(MyFB
));
136 /* Note, continue to use MyFB below */
138 glGenRenderbuffersEXT(1, &MyRB
);
140 assert(!glIsRenderbufferEXT(MyRB
));
141 glDeleteRenderbuffersEXT(1, &MyRB
);
142 assert(!glIsRenderbufferEXT(MyRB
));
143 MyRB
= 42; /* an arbitrary ID */
145 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
146 assert(glIsFramebufferEXT(MyFB
));
147 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, MyRB
);
148 assert(glIsRenderbufferEXT(MyRB
));
150 glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT
, &i
);
153 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT
, &i
);
156 CheckError(__LINE__
);
157 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_COLOR_ATTACHMENT1_EXT
,
158 GL_RENDERBUFFER_EXT
, MyRB
);
160 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
162 CheckError(__LINE__
);
166 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
167 GL_RENDERBUFFER_RED_SIZE_EXT
, &r
);
168 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
169 GL_RENDERBUFFER_GREEN_SIZE_EXT
, &g
);
170 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
171 GL_RENDERBUFFER_BLUE_SIZE_EXT
, &b
);
172 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
173 GL_RENDERBUFFER_ALPHA_SIZE_EXT
, &a
);
174 CheckError(__LINE__
);
175 printf("renderbuffer RGBA sizes = %d %d %d %d\n", r
, g
, b
, a
);
177 glGetIntegerv(GL_RED_BITS
, &r
);
178 glGetIntegerv(GL_GREEN_BITS
, &g
);
179 glGetIntegerv(GL_BLUE_BITS
, &b
);
180 glGetIntegerv(GL_ALPHA_BITS
, &a
);
181 printf("Visual RGBA sizes = %d %d %d %d\n", r
, g
, b
, a
);
184 /* restore to default */
185 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
186 CheckError(__LINE__
);
191 main( int argc
, char *argv
[] )
193 glutInit( &argc
, argv
);
194 glutInitWindowPosition( 0, 0 );
195 glutInitWindowSize(Width
, Height
);
196 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
197 glutCreateWindow(argv
[0]);
198 glutReshapeFunc( Reshape
);
199 glutKeyboardFunc( Key
);
200 glutDisplayFunc( Display
);