2 * Test GL_EXT_framebuffer_object
9 #define GL_GLEXT_PROTOTYPES
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_ATTACHMENT1_EXT
);
40 glReadBuffer(GL_COLOR_ATTACHMENT1_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
)
127 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
128 printf("GL_EXT_framebuffer_object not found!\n");
131 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
133 glGenFramebuffersEXT(1, &MyFB
);
135 assert(!glIsFramebufferEXT(MyFB
));
136 glDeleteFramebuffersEXT(1, &MyFB
);
137 assert(!glIsFramebufferEXT(MyFB
));
138 /* Note, continue to use MyFB below */
140 glGenRenderbuffersEXT(1, &MyRB
);
142 assert(!glIsRenderbufferEXT(MyRB
));
143 glDeleteRenderbuffersEXT(1, &MyRB
);
144 assert(!glIsRenderbufferEXT(MyRB
));
145 MyRB
= 42; /* an arbitrary ID */
147 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, MyFB
);
148 assert(glIsFramebufferEXT(MyFB
));
149 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT
, MyRB
);
150 assert(glIsRenderbufferEXT(MyRB
));
152 glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT
, &i
);
155 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT
, &i
);
158 CheckError(__LINE__
);
159 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT
, GL_COLOR_ATTACHMENT1_EXT
,
160 GL_RENDERBUFFER_EXT
, MyRB
);
162 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT
, GL_RGB
, Width
, Height
);
164 CheckError(__LINE__
);
168 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
169 GL_RENDERBUFFER_RED_SIZE_EXT
, &r
);
170 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
171 GL_RENDERBUFFER_GREEN_SIZE_EXT
, &g
);
172 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
173 GL_RENDERBUFFER_BLUE_SIZE_EXT
, &b
);
174 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT
,
175 GL_RENDERBUFFER_ALPHA_SIZE_EXT
, &a
);
176 CheckError(__LINE__
);
177 printf("renderbuffer RGBA sizes = %d %d %d %d\n", r
, g
, b
, a
);
179 glGetIntegerv(GL_RED_BITS
, &r
);
180 glGetIntegerv(GL_GREEN_BITS
, &g
);
181 glGetIntegerv(GL_BLUE_BITS
, &b
);
182 glGetIntegerv(GL_ALPHA_BITS
, &a
);
183 printf("Visual RGBA sizes = %d %d %d %d\n", r
, g
, b
, a
);
186 /* restore to default */
187 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT
, 0);
188 CheckError(__LINE__
);
193 main( int argc
, char *argv
[] )
195 glutInit( &argc
, argv
);
196 glutInitWindowPosition( 0, 0 );
197 glutInitWindowSize(Width
, Height
);
198 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
199 Win
= glutCreateWindow(argv
[0]);
200 glutReshapeFunc( Reshape
);
201 glutKeyboardFunc( Key
);
202 glutDisplayFunc( Display
);