Clone of mesa.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /*
  2. * Test GL_EXT_framebuffer_object
  3. *
  4. * Brian Paul
  5. * 19 Mar 2006
  6. */
  7. #include <assert.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11. #include <GL/glew.h>
  12. #include <GL/glut.h>
  13. static int Win = 0;
  14. static int Width = 400, Height = 400;
  15. static GLuint MyFB, ColorRb, DepthRb;
  16. static GLboolean Animate = GL_TRUE;
  17. static GLfloat Rotation = 0.0;
  18. static void
  19. CheckError(int line)
  20. {
  21. GLenum err = glGetError();
  22. if (err) {
  23. printf("fbotest2: GL Error 0x%x at line %d\n", (int) err, line);
  24. }
  25. }
  26. static void
  27. Display( void )
  28. {
  29. GLboolean copyPix = GL_FALSE;
  30. GLboolean blitPix = GL_FALSE;
  31. GLenum status;
  32. CheckError(__LINE__);
  33. /* draw to user framebuffer */
  34. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
  35. glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
  36. glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
  37. status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  38. if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
  39. printf("fbotest2: Error: Framebuffer is incomplete!!!\n");
  40. }
  41. CheckError(__LINE__);
  42. glClearColor(0.5, 0.5, 1.0, 0.0);
  43. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  44. glEnable(GL_DEPTH_TEST);
  45. glEnable(GL_LIGHTING);
  46. glEnable(GL_LIGHT0);
  47. glPushMatrix();
  48. glRotatef(30.0, 1, 0, 0);
  49. glRotatef(Rotation, 0, 1, 0);
  50. glutSolidTeapot(2.0);
  51. glPopMatrix();
  52. if (copyPix) {
  53. glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, MyFB);
  54. glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
  55. glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
  56. glDrawBuffer(GL_BACK);
  57. glDisable(GL_DEPTH_TEST); /* in case window has depth buffer */
  58. glWindowPos2iARB(0, 0);
  59. glCopyPixels(0, 0, Width, Height, GL_COLOR);
  60. }
  61. else if (blitPix) {
  62. glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, MyFB);
  63. glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
  64. glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
  65. glDrawBuffer(GL_BACK);
  66. glDisable(GL_DEPTH_TEST); /* in case window has depth buffer */
  67. glBlitFramebufferEXT(0, 0, Width, Height,
  68. 0, 0, Width, Height,
  69. GL_COLOR_BUFFER_BIT, GL_NEAREST);
  70. }
  71. else {
  72. GLubyte *buffer = malloc(Width * Height * 4);
  73. /* read from user framebuffer */
  74. glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  75. /* draw to window */
  76. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  77. glDisable(GL_DEPTH_TEST); /* in case window has depth buffer */
  78. glWindowPos2iARB(0, 0);
  79. glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  80. free(buffer);
  81. }
  82. glutSwapBuffers();
  83. CheckError(__LINE__);
  84. }
  85. static void
  86. Reshape( int width, int height )
  87. {
  88. float ar = (float) width / (float) height;
  89. glViewport( 0, 0, width, height );
  90. glMatrixMode( GL_PROJECTION );
  91. glLoadIdentity();
  92. glFrustum( -ar, ar, -1.0, 1.0, 5.0, 25.0 );
  93. glMatrixMode( GL_MODELVIEW );
  94. glLoadIdentity();
  95. glTranslatef( 0.0, 0.0, -15.0 );
  96. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);
  97. glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, width, height);
  98. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRb);
  99. glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
  100. width, height);
  101. Width = width;
  102. Height = height;
  103. }
  104. static void
  105. CleanUp(void)
  106. {
  107. glDeleteFramebuffersEXT(1, &MyFB);
  108. glDeleteRenderbuffersEXT(1, &ColorRb);
  109. glDeleteRenderbuffersEXT(1, &DepthRb);
  110. assert(!glIsFramebufferEXT(MyFB));
  111. assert(!glIsRenderbufferEXT(ColorRb));
  112. assert(!glIsRenderbufferEXT(DepthRb));
  113. glutDestroyWindow(Win);
  114. exit(0);
  115. }
  116. static void
  117. Idle(void)
  118. {
  119. Rotation = glutGet(GLUT_ELAPSED_TIME) * 0.1;
  120. glutPostRedisplay();
  121. }
  122. static void
  123. Key( unsigned char key, int x, int y )
  124. {
  125. (void) x;
  126. (void) y;
  127. switch (key) {
  128. case 'a':
  129. Animate = !Animate;
  130. if (Animate)
  131. glutIdleFunc(Idle);
  132. else
  133. glutIdleFunc(NULL);
  134. break;
  135. case 27:
  136. CleanUp();
  137. break;
  138. }
  139. glutPostRedisplay();
  140. }
  141. static void
  142. Init( void )
  143. {
  144. if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
  145. printf("fbotest2: GL_EXT_framebuffer_object not found!\n");
  146. exit(0);
  147. }
  148. printf("fbotest2: GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
  149. glGenFramebuffersEXT(1, &MyFB);
  150. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
  151. assert(glIsFramebufferEXT(MyFB));
  152. /* set color buffer */
  153. glGenRenderbuffersEXT(1, &ColorRb);
  154. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);
  155. assert(glIsRenderbufferEXT(ColorRb));
  156. glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
  157. GL_RENDERBUFFER_EXT, ColorRb);
  158. glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
  159. /* setup depth buffer */
  160. glGenRenderbuffersEXT(1, &DepthRb);
  161. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRb);
  162. assert(glIsRenderbufferEXT(DepthRb));
  163. glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
  164. GL_RENDERBUFFER_EXT, DepthRb);
  165. glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, Width, Height);
  166. CheckError(__LINE__);
  167. /* restore to default */
  168. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  169. CheckError(__LINE__);
  170. }
  171. int
  172. main( int argc, char *argv[] )
  173. {
  174. glutInit( &argc, argv );
  175. glutInitWindowPosition( 0, 0 );
  176. glutInitWindowSize(Width, Height);
  177. glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
  178. Win = glutCreateWindow(argv[0]);
  179. glewInit();
  180. glutReshapeFunc( Reshape );
  181. glutKeyboardFunc( Key );
  182. glutDisplayFunc( Display );
  183. if (Animate)
  184. glutIdleFunc(Idle);
  185. Init();
  186. glutMainLoop();
  187. return 0;
  188. }