2 * Test GL_EXT_framebuffer_object
17 static int Width
= 400, Height
= 400;
18 static GLuint MyFB
, MyRB
;
24 GLenum err
= glGetError();
26 printf("GL Error 0x%x at line %d\n", (int) err
, line
);
34 GLubyte
*buffer
= malloc(Width
* Height
* 4);
37 /* draw to user framebuffer */
38 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
39 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT
);
40 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT
);
42 status
= glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT
);
43 if (status
!= GL_FRAMEBUFFER_COMPLETE_EXT
) {
44 printf("Framebuffer incomplete!!!\n");
47 glClearColor(0.5, 0.5, 1.0, 0.0);
48 glClear( GL_COLOR_BUFFER_BIT
);
59 /* read from user framebuffer */
60 glReadPixels(0, 0, Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
63 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
64 glWindowPos2iARB(0, 0);
65 glDrawPixels(Width
, Height
, GL_RGBA
, GL_UNSIGNED_BYTE
, buffer
);
74 Reshape( int width
, int height
)
77 float ar
= (float) width
/ (float) height
;
79 glViewport( 0, 0, width
, height
);
80 glMatrixMode( GL_PROJECTION
);
83 glFrustum( -ar
, ar
, -1.0, 1.0, 5.0, 25.0 );
85 glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
87 glMatrixMode( GL_MODELVIEW
);
89 glTranslatef( 0.0, 0.0, -15.0 );
92 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
99 glDeleteFramebuffersEXT(1, &MyFB
);
100 glDeleteRenderbuffersEXT(1, &MyRB
);
101 assert(!glIsFramebufferEXT(MyFB
));
102 assert(!glIsRenderbufferEXT(MyRB
));
103 glutDestroyWindow(Win
);
109 Key( unsigned char key
, int x
, int y
)
125 GLboolean ARB_fbo
= glutExtensionSupported("GL_ARB_framebuffer_object");
128 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
129 printf("GL_EXT_framebuffer_object not found!\n");
132 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
134 glGenFramebuffersEXT(1, &MyFB
);
136 assert(!glIsFramebufferEXT(MyFB
));
138 glDeleteFramebuffersEXT(1, &MyFB
);
139 assert(!glIsFramebufferEXT(MyFB
));
141 /* Note, continue to use MyFB below */
143 glGenRenderbuffersEXT(1, &MyRB
);
145 assert(!glIsRenderbufferEXT(MyRB
));
147 glDeleteRenderbuffersEXT(1, &MyRB
);
148 assert(!glIsRenderbufferEXT(MyRB
));
149 MyRB
= 42; /* an arbitrary ID */
152 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
153 assert(glIsFramebufferEXT(MyFB
));
154 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, MyRB
);
155 assert(glIsRenderbufferEXT(MyRB
));
157 glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT
, &i
);
160 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT
, &i
);
163 CheckError(__LINE__
);
164 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_COLOR_ATTACHMENT0_EXT
,
165 GL_RENDERBUFFER_EXT
, MyRB
);
167 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
169 CheckError(__LINE__
);
173 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
174 GL_RENDERBUFFER_RED_SIZE_EXT
, &r
);
175 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
176 GL_RENDERBUFFER_GREEN_SIZE_EXT
, &g
);
177 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
178 GL_RENDERBUFFER_BLUE_SIZE_EXT
, &b
);
179 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
180 GL_RENDERBUFFER_ALPHA_SIZE_EXT
, &a
);
181 CheckError(__LINE__
);
182 printf("renderbuffer RGBA sizes = %d %d %d %d\n", r
, g
, b
, a
);
184 glGetIntegerv(GL_RED_BITS
, &r
);
185 glGetIntegerv(GL_GREEN_BITS
, &g
);
186 glGetIntegerv(GL_BLUE_BITS
, &b
);
187 glGetIntegerv(GL_ALPHA_BITS
, &a
);
188 printf("Visual RGBA sizes = %d %d %d %d\n", r
, g
, b
, a
);
191 /* restore to default */
192 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
193 CheckError(__LINE__
);
198 main( int argc
, char *argv
[] )
200 glutInit( &argc
, argv
);
201 glutInitWindowPosition( 0, 0 );
202 glutInitWindowSize(Width
, Height
);
203 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
204 Win
= glutCreateWindow(argv
[0]);
206 glutReshapeFunc( Reshape
);
207 glutKeyboardFunc( Key
);
208 glutDisplayFunc( Display
);