fbotest1.c revision 32001f49
1/* 2 * Test GL_EXT_framebuffer_object 3 * 4 * Brian Paul 5 * 7 Feb 2005 6 */ 7 8 9#include <assert.h> 10#include <stdio.h> 11#include <stdlib.h> 12#include <math.h> 13#include <GL/glew.h> 14#include "glut_wrap.h" 15 16static int Win; 17static int Width = 400, Height = 400; 18static GLuint MyFB, MyRB; 19 20 21static void 22CheckError(int line) 23{ 24 GLenum err = glGetError(); 25 if (err) { 26 printf("GL Error 0x%x at line %d\n", (int) err, line); 27 } 28} 29 30 31static void 32Display( void ) 33{ 34 GLubyte *buffer = malloc(Width * Height * 4); 35 GLenum status; 36 37 /* draw to user framebuffer */ 38 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); 39 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); 40 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 41 42 status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); 43 if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { 44 printf("Framebuffer incomplete!!!\n"); 45 } 46 47 glClearColor(0.5, 0.5, 1.0, 0.0); 48 glClear( GL_COLOR_BUFFER_BIT ); 49 50 glBegin(GL_POLYGON); 51 glColor3f(1, 0, 0); 52 glVertex2f(-1, -1); 53 glColor3f(0, 1, 0); 54 glVertex2f(1, -1); 55 glColor3f(0, 0, 1); 56 glVertex2f(0, 1); 57 glEnd(); 58 59 /* read from user framebuffer */ 60 glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 61 62 /* draw to window */ 63 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 64 glWindowPos2iARB(0, 0); 65 glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 66 67 free(buffer); 68 glutSwapBuffers(); 69 CheckError(__LINE__); 70} 71 72 73static void 74Reshape( int width, int height ) 75{ 76#if 0 77 float ar = (float) width / (float) height; 78#endif 79 glViewport( 0, 0, width, height ); 80 glMatrixMode( GL_PROJECTION ); 81 glLoadIdentity(); 82#if 0 83 glFrustum( -ar, ar, -1.0, 1.0, 5.0, 25.0 ); 84#else 85 glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0 ); 86#endif 87 glMatrixMode( GL_MODELVIEW ); 88 glLoadIdentity(); 89 glTranslatef( 0.0, 0.0, -15.0 ); 90 Width = width; 91 Height = height; 92 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height); 93} 94 95 96static void 97CleanUp(void) 98{ 99 glDeleteFramebuffersEXT(1, &MyFB); 100 glDeleteRenderbuffersEXT(1, &MyRB); 101 assert(!glIsFramebufferEXT(MyFB)); 102 assert(!glIsRenderbufferEXT(MyRB)); 103 glutDestroyWindow(Win); 104 exit(0); 105} 106 107 108static void 109Key( unsigned char key, int x, int y ) 110{ 111 (void) x; 112 (void) y; 113 switch (key) { 114 case 27: 115 CleanUp(); 116 break; 117 } 118 glutPostRedisplay(); 119} 120 121 122static void 123Init( void ) 124{ 125 GLboolean ARB_fbo = glutExtensionSupported("GL_ARB_framebuffer_object"); 126 GLint i; 127 128 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) { 129 printf("GL_EXT_framebuffer_object not found!\n"); 130 exit(0); 131 } 132 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 133 134 glGenFramebuffersEXT(1, &MyFB); 135 assert(MyFB); 136 assert(!glIsFramebufferEXT(MyFB)); 137 if (!ARB_fbo) { 138 glDeleteFramebuffersEXT(1, &MyFB); 139 assert(!glIsFramebufferEXT(MyFB)); 140 } 141 /* Note, continue to use MyFB below */ 142 143 glGenRenderbuffersEXT(1, &MyRB); 144 assert(MyRB); 145 assert(!glIsRenderbufferEXT(MyRB)); 146 if (!ARB_fbo) { 147 glDeleteRenderbuffersEXT(1, &MyRB); 148 assert(!glIsRenderbufferEXT(MyRB)); 149 MyRB = 42; /* an arbitrary ID */ 150 } 151 152 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); 153 assert(glIsFramebufferEXT(MyFB)); 154 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, MyRB); 155 assert(glIsRenderbufferEXT(MyRB)); 156 157 glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT, &i); 158 assert(i == MyRB); 159 160 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &i); 161 assert(i == MyFB); 162 163 CheckError(__LINE__); 164 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, 165 GL_RENDERBUFFER_EXT, MyRB); 166 167 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height); 168 169 CheckError(__LINE__); 170 171 { 172 GLint r, g, b, a; 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); 183 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); 189 } 190 191 /* restore to default */ 192 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 193 CheckError(__LINE__); 194} 195 196 197int 198main( int argc, char *argv[] ) 199{ 200 glutInit( &argc, argv ); 201 glutInitWindowPosition( 0, 0 ); 202 glutInitWindowSize(Width, Height); 203 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); 204 Win = glutCreateWindow(argv[0]); 205 glewInit(); 206 glutReshapeFunc( Reshape ); 207 glutKeyboardFunc( Key ); 208 glutDisplayFunc( Display ); 209 Init(); 210 glutMainLoop(); 211 return 0; 212} 213