查看: 9011|回复: 3

FBO实现SKYBOX

[复制链接]

该用户从未签到

发表于 2012-12-7 15:34:14 | 显示全部楼层 |阅读模式
1.最近在玩Ladybug3相机。想用它现实一个AR系统,现在刚开始,要求用osg实现。但是Ladybug的例子程序是OpenGL的,我没有学过OpenGL啊。有一个程序不知道怎么改成OSG的。
2.这个程序的大概过程是,Ladybug的成像处理都在显卡中的,它直接把显卡中的某块数据做为Skybox的一个面的贴图。
ladybugRenderOffScreenImage()把图像从相机输入到显卡中
ladybugGetOpenGLTextureID()   获得显卡中OpenGL贴图的ID
glBindTexture()                            绑定贴图


希望各位能看一下,看看应该怎么把它改成osg的。我之所非要这么弄是因为先把图像保存再贴图到一个cubemap上的过程实在是太慢了,这个我已经试过了,如下:
QQ截图20121207153307.png


程序代码如下:
  1. //=============================================================================
  2. // Copyright ?2010 Point Grey Research, Inc. All Rights Reserved.
  3. //
  4. // This software is the confidential and proprietary information of Point
  5. // Grey Research, Inc. ("Confidential Information").  You shall not
  6. // disclose such Confidential Information and shall use it only in
  7. // accordance with the terms of the license agreement you entered into
  8. // with Point Grey Research, Inc. (PGR).
  9. //
  10. // PGR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  11. // SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
  12. // IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  13. // PURPOSE, OR NON-INFRINGEMENT. PGR SHALL NOT BE LIABLE FOR ANY DAMAGES
  14. // SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  15. // THIS SOFTWARE OR ITS DERIVATIVES.

  16. //=============================================================================
  17. //
  18. // ladybugEnvMap.cpp
  19. //
  20. //=============================================================================
  21. // This example illustrates how to apply cube mapping on Ladybug's spherical
  22. // images to construct a skybox.
  23. // In computer graphics, cube mapping is a type of environment mapping used to
  24. // simulate surfaces that reflect the scene at a distant location.
  25. // Here, Ladybug images are used as the environment and are updated in real
  26. // time.
  27. // For each scene, six surfaces of a cube are rendered.
  28. // This is done by rendering Ladybug's spherical view 6 times, setting the
  29. // field of view to 90 degrees and positioning the virtual camera to specific
  30. // surface directions. These rendering results are then used as textures for the
  31. // cube mapping.
  32. // The overall scene, which is comprised of the reflective objects,
  33. // is then rendered.
  34. // All calculations required to construct the cube map are handled inside the
  35. // OpenGL library.
  36. //
  37. // Note: This example must be run with freeglut.dll present.
  38. //
  39. //=============================================================================
  40. //=============================================================================
  41. // System Includes
  42. //=============================================================================
  43. #pragma warning(disable:4786) //Ignore identifier truncation warning in GLUT
  44. #pragma warning(disable:4244)  // suppress warning : conversion from 'int' to 'glh::ns_float::real', possible loss of data
  45. #pragma warning(disable:704)  // suppress warning : truncation from 'double' to 'float'

  46. #include <stdio.h>
  47. #include <stdlib.h>
  48. #include <windows.h>
  49. #include <assert.h>
  50. #include <GL/glew.h>
  51. #include <GL/freeglut.h>
  52. #include <glh/glh_glut.h>
  53. //=============================================================================
  54. // PGR Includes
  55. //=============================================================================
  56. #include <ladybug.h>
  57. #include <ladybuggeom.h>
  58. #include <ladybugRenderer.h>

  59. //=============================================================================
  60. // Project Includes
  61. //=============================================================================

  62. using namespace glh;

  63. #define UPDATE_SURFACE

  64. //
  65. // Define some error handlers
  66. //
  67. #define _HANDLE_ERROR \
  68.    if( error != LADYBUG_OK ) \
  69. { \
  70.    printf( "Error! Ladybug library reported %s\n", \
  71.    ladybugErrorToString( error ) ); \
  72.    assert( false ); \
  73.    exit( 1 ); \
  74. } \

  75. #define _DISPLAY_ERROR_MSG \
  76.    if( error != LADYBUG_OK ) \
  77. { \
  78.    printf( "Ladybug library reported %s\n", \
  79.    ladybugErrorToString( error ) ); \
  80. } \
  81.    
  82. #define _DISPLAY_ERROR_MSG_AND_RETURN \
  83.    if( error != LADYBUG_OK ) \
  84. { \
  85.    printf( "Ladybug library reported %s\n", \
  86.    ladybugErrorToString( error ) ); \
  87.    return; \
  88. } \

  89. //
  90. // Define various constants
  91. //
  92. #define            PI                    3.1415926535f

  93. #define CUBE_TEX_SIZE 512
  94. #define NUM_CUBE_SURFACES  6

  95. const GLenum cube_map_targets[ NUM_CUBE_SURFACES] = {
  96.    GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
  97.    GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
  98.    GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
  99.    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
  100.    GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
  101.    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
  102. };

  103. const double sphere_view_params[ NUM_CUBE_SURFACES][ 3] = {
  104.    { PI, 0.0, PI},
  105.    { PI, 0.0, 0.0},
  106.    { PI/2.0, PI/2.0, 0.0},
  107.    { -PI/2.0, -PI/2.0, 0.0},
  108.    { PI, 0.0, -PI/2.0},
  109.    { PI, 0.0, PI/2.0}
  110. };

  111. static const GLubyte colors[ NUM_CUBE_SURFACES][ 3] = {
  112.    { 255,   0,   0 }, // red
  113.    {   0, 255, 255 }, // cyan
  114.    {   0, 255,   0 }, // green
  115.    { 255,   0, 255 }, // magenda
  116.    {   0,   0, 255 }, // blue
  117.    { 255, 255,   0 }  // yellow
  118. };

  119. enum
  120. {
  121.    MENU_TEAPOT,
  122.    MENU_SPHERE,
  123.    MENU_CUBE,
  124.    MENU_EXIT
  125. };

  126. int displayMode = MENU_TEAPOT;

  127. //
  128. // The GLUT mouse interactor. it is used automatically to deal with
  129. // mouse inputs.
  130. //
  131. glut_simple_mouse_interactor object;

  132. //
  133. // Various global variables used in the example
  134. //
  135. LadybugContext                context;
  136. LadybugError                error;
  137. LadybugImage                image;
  138. bool                        b[256];
  139. GLuint                  fbos[NUM_CUBE_SURFACES];
  140. GLuint                  fboTexture;
  141. int                     menu;  
  142. GLUquadricObj           *quadric;  // for sphere

  143. void
  144. handleGLError( const char* pszString )
  145. {
  146.    GLenum error = glGetError();
  147.    
  148.    if ( error != GL_NO_ERROR )
  149.    {
  150.           char  pszErrorText[ 512 ];

  151.           sprintf(
  152.          pszErrorText,
  153.          "OpenGL Error: %s: #(%d) %s\n",
  154.          pszString,
  155.          error,
  156.          ::gluErrorString( error ) );

  157.           fprintf( stderr, pszErrorText );
  158.    }
  159. }

  160. //=============================================================================
  161. //
  162. // Clean up
  163. //
  164. //=============================================================================
  165. void
  166. cleanUp()
  167. {
  168.    printf( "Stopping camera...\n" );
  169.    error = ladybugStop( context );
  170.    _HANDLE_ERROR;

  171.    printf( "Release off-screen image resource...\n" );
  172.    error = ladybugReleaseOffScreenImage(context, LADYBUG_SPHERICAL );
  173.    _HANDLE_ERROR;

  174.    printf( "Destroying context...\n" );
  175.    error = ladybugDestroyContext( &context );
  176.    _HANDLE_ERROR;

  177.    gluDeleteQuadric( quadric);

  178.    glDeleteTextures( 1, &fboTexture);

  179.    glDeleteFramebuffersEXT( NUM_CUBE_SURFACES, &fbos[0]);

  180.    return;
  181. }

  182. void
  183. selectFromMenu( int iCommand )
  184. {  
  185.    if ( iCommand == MENU_EXIT )
  186.    {
  187.           cleanUp();
  188.           exit (0);
  189.    }
  190.    else
  191.    {
  192.           displayMode = iCommand;
  193.    }
  194. }

  195. int
  196. buildPopupMenu (void)
  197. {
  198.    menu = glutCreateMenu( selectFromMenu );

  199.    glutAddMenuEntry(
  200.           "Teapot",
  201.           MENU_TEAPOT );
  202.    
  203.    glutAddMenuEntry(
  204.           "Sphere",
  205.           MENU_SPHERE );

  206.    glutAddMenuEntry(
  207.           "Cube",
  208.           MENU_CUBE);

  209.    glutAddMenuEntry(
  210.           "Exit",
  211.           MENU_EXIT );

  212.    return 0;
  213. }


  214. void init_checkers( void )
  215. {
  216.    GLubyte *image = new GLubyte[ CUBE_TEX_SIZE * CUBE_TEX_SIZE * 3];
  217.    GLint i, j, f;

  218.    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  219.    /* make colored checkerboard cube faces */
  220.    for (f = 0; f < NUM_CUBE_SURFACES; f++) {
  221.           for (i = 0; i < CUBE_TEX_SIZE; i++) {
  222.                  for (j = 0; j < CUBE_TEX_SIZE; j++) {
  223.                         if ((i/4 + j/4) & 1) {
  224.                            image[ ( i + j * CUBE_TEX_SIZE) * 3 + 0 ] = colors[f][0];
  225.                            image[ ( i + j * CUBE_TEX_SIZE) * 3 + 1 ] = colors[f][1];
  226.                            image[ ( i + j * CUBE_TEX_SIZE) * 3 + 2 ] = colors[f][2];
  227.                         }
  228.                         else {
  229.                            image[ ( i + j * CUBE_TEX_SIZE) * 3 + 0 ] = 255;
  230.                            image[ ( i + j * CUBE_TEX_SIZE) * 3 + 1 ] = 255;
  231.                            image[ ( i + j * CUBE_TEX_SIZE) * 3 + 2 ] = 255;
  232.                         }
  233.                  }
  234.           }

  235.           glTexImage2D( cube_map_targets[f], 0, GL_RGB, CUBE_TEX_SIZE, CUBE_TEX_SIZE, 0,
  236.                                    GL_RGB, GL_UNSIGNED_BYTE, image);
  237.           handleGLError( "glTexImage2D");
  238.    }

  239.    delete []image;
  240. }

  241. void
  242. initEnvMap( void)
  243. {
  244.    GLenum res;

  245.    glGenTextures( 1, &fboTexture);
  246.    
  247.    glBindTexture( GL_TEXTURE_CUBE_MAP, fboTexture);
  248.    handleGLError( "glBindTexture");
  249.    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  250.    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  251.    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
  252.    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  253.    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  254.    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_LOD, 0 );
  255.    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LOD, 3 );

  256.    init_checkers();

  257.    glGenFramebuffersEXT( NUM_CUBE_SURFACES, &fbos[0]);
  258.    handleGLError( "glGenFramebuffersEXT");

  259.    for ( int i = 0; i < NUM_CUBE_SURFACES; i++){

  260.           glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbos[i]);
  261.           handleGLError( "glBindFramebufferEXT");

  262.           //Attach 2D texture to this FBO
  263.           glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, cube_map_targets[ i], fboTexture, 0);
  264.           handleGLError( "glFramebufferTexture2DEXT");

  265.           res = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT);
  266.           if ( res != GL_FRAMEBUFFER_COMPLETE_EXT)
  267.           {
  268.                  printf( "Failed - glCheckFramebufferStatusEXT = %X\n", res);
  269.           }
  270.    }
  271.    
  272.    // unbind
  273.    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  274.    handleGLError( "glBindFramebufferEXT - unbind");

  275.    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
  276.    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
  277.    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);

  278.    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  279.    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  280.    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  281.    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

  282.    // init for sphere
  283.    quadric=gluNewQuadric();
  284.    gluQuadricNormals( quadric, GLU_SMOOTH);
  285.    gluQuadricTexture( quadric, GL_TRUE);
  286. }

  287. void drawCube()
  288. {
  289.    glBegin(GL_QUADS);

  290.    // Front Face
  291.    glNormal3f( 0.0f, 0.0f, 1.0f);
  292.    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
  293.    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
  294.    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
  295.    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
  296.    // Back Face
  297.    glNormal3f( 0.0f, 0.0f,-1.0f);
  298.    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  299.    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
  300.    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
  301.    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  302.    // Top Face
  303.    glNormal3f( 0.0f, 1.0f, 0.0f);
  304.    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
  305.    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
  306.    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
  307.    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
  308.    // Bottom Face
  309.    glNormal3f( 0.0f,-1.0f, 0.0f);
  310.    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  311.    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  312.    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
  313.    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
  314.    // Right face
  315.    glNormal3f( 1.0f, 0.0f, 0.0f);
  316.    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  317.    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
  318.    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
  319.    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
  320.    // Left Face
  321.    glNormal3f(-1.0f, 0.0f, 0.0f);
  322.    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  323.    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
  324.    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
  325.    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);

  326.    glEnd();
  327. }

  328. void drawSkybox( void )
  329. {
  330.    const GLfloat br = 20.0; /* box radius */

  331.    glBegin(GL_QUADS);

  332.    /* +X side */
  333.    glTexCoord3f(1.0, -1.0, -1.0);  glVertex3f(br, -br, -br);
  334.    glTexCoord3f(1.0, -1.0,  1.0);  glVertex3f(br, -br,  br);
  335.    glTexCoord3f(1.0,  1.0,  1.0);  glVertex3f(br,  br,  br);
  336.    glTexCoord3f(1.0,  1.0, -1.0);  glVertex3f(br,  br, -br);

  337.    /* -X side */
  338.    glTexCoord3f(-1.0,  1.0, -1.0);  glVertex3f(-br,  br, -br);
  339.    glTexCoord3f(-1.0,  1.0,  1.0);  glVertex3f(-br,  br,  br);
  340.    glTexCoord3f(-1.0, -1.0,  1.0);  glVertex3f(-br, -br,  br);
  341.    glTexCoord3f(-1.0, -1.0, -1.0);  glVertex3f(-br, -br, -br);

  342.    /* +Y side */
  343.    glTexCoord3f(-1.0, 1.0, -1.0);  glVertex3f(-br,  br, -br);
  344.    glTexCoord3f(-1.0, 1.0,  1.0);  glVertex3f(-br,  br,  br);
  345.    glTexCoord3f( 1.0, 1.0,  1.0);  glVertex3f( br,  br,  br);
  346.    glTexCoord3f( 1.0, 1.0, -1.0);  glVertex3f( br,  br, -br);

  347.    /* -Y side */
  348.    glTexCoord3f(-1.0, -1.0, -1.0);  glVertex3f(-br, -br, -br);
  349.    glTexCoord3f(-1.0, -1.0,  1.0);  glVertex3f(-br, -br,  br);
  350.    glTexCoord3f( 1.0, -1.0,  1.0);  glVertex3f( br, -br,  br);
  351.    glTexCoord3f( 1.0, -1.0, -1.0);  glVertex3f( br, -br, -br);

  352.    /* +Z side */
  353.    glTexCoord3f( 1.0, -1.0, 1.0);  glVertex3f( br, -br, br);
  354.    glTexCoord3f(-1.0, -1.0, 1.0);  glVertex3f(-br, -br, br);
  355.    glTexCoord3f(-1.0,  1.0, 1.0);  glVertex3f(-br,  br, br);
  356.    glTexCoord3f( 1.0,  1.0, 1.0);  glVertex3f( br,  br, br);

  357.    /* -Z side */
  358.    glTexCoord3f( 1.0,  1.0, -1.0);  glVertex3f( br,  br, -br);
  359.    glTexCoord3f(-1.0,  1.0, -1.0);  glVertex3f(-br,  br, -br);
  360.    glTexCoord3f(-1.0, -1.0, -1.0);  glVertex3f(-br, -br, -br);
  361.    glTexCoord3f( 1.0, -1.0, -1.0);  glVertex3f( br, -br, -br);

  362.    glEnd();
  363. }

  364. void drawUnitSquare( void)
  365. {
  366.    glBegin( GL_QUADS);

  367.    glTexCoord2d( 0.0, 1.0); glVertex3f( 0.0, 0.0, 0.0);
  368.    glTexCoord2d( 1.0, 1.0); glVertex3f( 1.0, 0.0, 0.0);
  369.    glTexCoord2d( 1.0, 0.0); glVertex3f( 1.0, 1.0, 0.0);
  370.    glTexCoord2d( 0.0, 0.0); glVertex3f( 0.0, 1.0, 0.0);

  371.    glEnd();
  372. }

  373. //=============================================================================
  374. //
  375. // Start the first Ladybug camera on the bus
  376. //
  377. //=============================================================================
  378. int  
  379. startCamera()
  380. {   
  381.    //
  382.    // Initialize context.
  383.    //
  384.    printf( "Creating Ladybug context...\n" );
  385.    error = ladybugCreateContext( &context );
  386.    _HANDLE_ERROR;
  387.    
  388.    //
  389.    // Initialize the first ladybug on the bus.
  390.    //
  391.    printf( "Initializing first camera on the bus...\n" );
  392.    error = ladybugInitializeFromIndex( context, 0 );
  393.    _HANDLE_ERROR;
  394.    
  395.    //
  396.    // Start Ladybug2/Ladybug3 with JPEG data format
  397.    //
  398.    printf( "Starting camera in JPEG mode...\n" );
  399.    error = ladybugStart(
  400.           context,
  401.           LADYBUG_RESOLUTION_ANY,
  402.           LADYBUG_DATAFORMAT_COLOR_SEP_SEQUENTIAL_JPEG);
  403.    _HANDLE_ERROR;
  404.    
  405.    //
  406.    // Load config file from the head
  407.    //
  408.    printf( "Loading config info...\n" );
  409.    error = ladybugLoadConfig( context, NULL );
  410.    _HANDLE_ERROR;
  411.    
  412.    //
  413.    // Grab one image
  414.    //
  415.    printf( "Grabbing an image..\n" );
  416.    error = LADYBUG_FAILED;
  417.    for ( int i = 0; i < 10 && error != LADYBUG_OK; i++)
  418.    {
  419.           error = ladybugGrabImage( context, &image);
  420.    }
  421.    if ( error != LADYBUG_OK)
  422.    {
  423.           _HANDLE_ERROR;
  424.    }

  425.    //
  426.    // Set color processing method to quarter downsample
  427.    //
  428.    error = ladybugSetColorProcessingMethod( context, LADYBUG_DOWNSAMPLE4 );
  429.    _HANDLE_ERROR;

  430.    return 0;
  431. }

  432. //=============================================================================
  433. // Draw for environment mapping
  434. //=============================================================================
  435. void drawEnvironmentMapping( void)
  436. {
  437.    unsigned int                *puiTextureID = 0;

  438.    error = ladybugSetSphericalViewParams( context, 90.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
  439.    error = ladybugRenderOffScreenImage( context, LADYBUG_SPHERICAL, LADYBUG_BGR, NULL);
  440.    _DISPLAY_ERROR_MSG;

  441.    float validWidth, validHeight;
  442.    error = ladybugGetOpenGLTextureID(
  443.           context, LADYBUG_SPHERICAL, &puiTextureID, &validWidth, &validHeight );
  444.    _DISPLAY_ERROR_MSG;

  445.    //保存获取到的图片
  446.    LadybugProcessedImage processedImage;

  447.    glPushAttrib (GL_ALL_ATTRIB_BITS);

  448. #ifdef UPDATE_SURFACE
  449.    // update the 6 cube surfaces using the spherical view's rendering output.
  450.    for ( int f = 0; f < NUM_CUBE_SURFACES; f++)
  451.    {
  452.           // bind FBO
  453.           glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbos[ f]);
  454.           handleGLError( "glBindFramebufferEXT");

  455.           GLenum res = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT);
  456.           if ( res != GL_FRAMEBUFFER_COMPLETE_EXT)
  457.           {
  458.                  printf( "Failed - glCheckFramebufferStatusEXT = %X\n", res);
  459.           }
  460.           
  461.           glViewport( 0, 0, CUBE_TEX_SIZE, CUBE_TEX_SIZE);

  462.           glClearColor( colors[f][0], colors[f][1], colors[f][2], 0.0f);
  463.           glClearDepth( 1.0);   
  464.           glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

  465.           glDisable(GL_TEXTURE_GEN_S);
  466.           glDisable(GL_TEXTURE_GEN_T);
  467.           glDisable(GL_TEXTURE_GEN_R);

  468.           glEnable( GL_TEXTURE_2D);
  469.           glDisable( GL_TEXTURE_CUBE_MAP);

  470.           glMatrixMode( GL_PROJECTION);
  471.           glPushMatrix();
  472.           glLoadIdentity();
  473.           gluOrtho2D( 0.0, 1.0, 0.0, 1.0);

  474.           glMatrixMode( GL_MODELVIEW);
  475.           glPushMatrix();      
  476.           glLoadIdentity();

  477.           error = ladybugSetSphericalViewParams( context,
  478.                                                                                          90.0,
  479.                                                                                          sphere_view_params[ f][ 0],
  480.                                                                                          sphere_view_params[ f][ 1],
  481.                                                                                          sphere_view_params[ f][ 2],
  482.                                                                                          0.0,
  483.                                                                                          0.0,
  484.                                                                                          0.0);
  485.           //把立方体的6个面渲染到processedImage这个结构体中
  486.           error = ladybugRenderOffScreenImage( context, LADYBUG_SPHERICAL, LADYBUG_BGR, NULL/*&processedImage*/);
  487.           _DISPLAY_ERROR_MSG;

  488.           //if (error == LADYBUG_OK)
  489.           //{
  490.                  // // Save the output image to a file
  491.                  // char pszOutputName[256];
  492.                  // sprintf( pszOutputName, "PanoStitchOutput_%03d.jpg", f);
  493.                  // printf( "Writing image %s...\n", pszOutputName);
  494.                  // error = ladybugSaveImage( context, &processedImage, pszOutputName, LADYBUG_FILEFORMAT_JPG );
  495.                  // _HANDLE_ERROR
  496.           //}
  497.           
  498.           glEnable( GL_TEXTURE_2D);
  499.           
  500.           glBindTexture( GL_TEXTURE_2D, *puiTextureID);
  501.           handleGLError( "glBindTexture");

  502.           drawUnitSquare();

  503.           glPopMatrix();

  504.           glMatrixMode( GL_PROJECTION);
  505.           glPopMatrix();

  506.    }
  507. #endif

  508.    // unbind FBO
  509.    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

  510.    glPopAttrib();

  511.    //
  512.    // Render the scene
  513.    //

  514.    glEnable( GL_TEXTURE_CUBE_MAP);
  515.    if ( GLEW_EXT_framebuffer_object )
  516.    {
  517.            // Generate Mipmap
  518.            glGenerateMipmapEXT( GL_TEXTURE_CUBE_MAP);
  519.            handleGLError( "glGenerateMipmapEXT");   
  520.    }
  521.    glDisable( GL_TEXTURE_2D);

  522.    glBindTexture( GL_TEXTURE_CUBE_MAP, fboTexture);
  523.    handleGLError( "glBindTexture");   
  524.   
  525.    glDisable(GL_TEXTURE_GEN_S);
  526.    glDisable(GL_TEXTURE_GEN_T);
  527.    glDisable(GL_TEXTURE_GEN_R);

  528.    glMatrixMode( GL_MODELVIEW);
  529.    glPushMatrix();
  530.    glLoadIdentity();

  531.    drawSkybox();

  532.    glPopMatrix();

  533.    glEnable(GL_TEXTURE_GEN_S);
  534.    glEnable(GL_TEXTURE_GEN_T);
  535.    glEnable(GL_TEXTURE_GEN_R);

  536.    switch ( displayMode)
  537.    {
  538.           case MENU_TEAPOT:
  539.                  glutSolidTeapot( 1.0);  
  540.                  break;
  541.           case MENU_SPHERE:
  542.                  gluSphere( quadric, 1.0f, 32, 32);
  543.                  break;
  544.           case MENU_CUBE:
  545.                  drawCube();
  546.                  break;
  547.    }

  548.    glDisable(GL_TEXTURE_CUBE_MAP);
  549.    glEnable( GL_TEXTURE_2D);
  550. }

  551. //=============================================================================
  552. // Display Ladybug images
  553. //=============================================================================
  554. void
  555. display()
  556. {   
  557.    glClearColor((GLclampf)0.2, (GLclampf)0.2, (GLclampf)0.2, (GLclampf)0.0);
  558.    glClearDepth( 1.0);
  559.    
  560.    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  561.    
  562.    glEnable( GL_DEPTH_TEST );

  563.    glMatrixMode( GL_MODELVIEW) ;
  564.    glPushMatrix();
  565.    glLoadIdentity();
  566.    
  567.    //
  568.    // Apply transformation
  569.    //
  570.    object.apply_transform();
  571.    
  572.    glShadeModel( GL_FLAT );
  573.    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
  574.    glEnable( GL_TEXTURE_2D );
  575.    
  576.    drawEnvironmentMapping();

  577.    glPopMatrix();

  578.    //
  579.    // Make sure changes appear on screen
  580.    //
  581.    glutSwapBuffers();
  582. }

  583. //=============================================================================
  584. //
  585. // Grab image, process it and update image textures on the graphics card
  586. //
  587. //=============================================================================
  588. void
  589. grabImage()
  590. {
  591.    if ( b[' '] )
  592.    {
  593.           object.trackball.increment_rotation();
  594.    }
  595.    
  596.    //
  597.    // Grab an image
  598.    //
  599.    error = ladybugGrabImage( context, &image );
  600.    _DISPLAY_ERROR_MSG_AND_RETURN;
  601.   
  602.    //
  603.    // Parse images to arpBuffers.
  604.    //
  605.    error = ladybugConvertImage( context, &image, NULL );       
  606.    _DISPLAY_ERROR_MSG_AND_RETURN;
  607.    
  608.    //
  609.    // Update images to the graphics card
  610.    //
  611.    error = ladybugUpdateTextures(
  612.           context,
  613.           LADYBUG_NUM_CAMERAS,
  614.           NULL );
  615.    _DISPLAY_ERROR_MSG_AND_RETURN;
  616.    
  617.    //
  618.    // Mark the current window for redisplay
  619.    //
  620.    glutPostRedisplay();
  621. }

  622. void
  623. key(unsigned char k, int x, int y)
  624. {
  625.    b[k] = !b[k];
  626.    
  627.    if( k==27 || k=='q')
  628.    {
  629.           cleanUp();
  630.           exit(0);
  631.    }
  632.    
  633.    object.keyboard(k, x, y);
  634.    
  635.    glutPostRedisplay();
  636. }

  637. void
  638. resize( int w, int h )
  639. {
  640.    if (h == 0)
  641.    {
  642.           h = 1;
  643.    }
  644.    
  645.    glViewport(0, 0, w, h);
  646.    
  647.    //
  648.    // Set OpenGL projection as perspective viewing
  649.    //
  650.    glMatrixMode( GL_PROJECTION );
  651.    glLoadIdentity();
  652.    gluPerspective( 45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0 );
  653.    
  654.    glMatrixMode( GL_MODELVIEW );
  655.    glLoadIdentity();
  656.    
  657.    object.reshape( w, h );
  658. }

  659. void
  660. mouse( int button, int state, int x, int y )
  661. {
  662.    object.mouse( button, state, x, y );
  663. }

  664. void
  665. motion( int x, int y )
  666. {
  667.    object.motion( x, y );
  668. }

  669. //=============================================================================
  670. //
  671. // Main program
  672. //
  673. //=============================================================================
  674. int
  675. main(int argc, char** argv)
  676. {
  677.    //
  678.    // GLUT Window Initialization
  679.    //
  680.    glutInit( &argc, argv );
  681.    glutInitWindowSize( 800, 600 );
  682.    glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
  683.    glutInitWindowPosition( 120, 100 );
  684.    glutCreateWindow ( "Environment mapping with Ladybug" );
  685.    
  686.    //
  687.    // Initialize GLEW
  688.    //
  689.    GLenum err = glewInit();
  690.    if ( err != GLEW_OK )
  691.    {
  692.           printf( "Failed to init GLEW.\n");
  693.           return 0;
  694.    }

  695.    startCamera( );
  696.    
  697.    error = ladybugConfigureOutputImages( context, LADYBUG_SPHERICAL);
  698.    _HANDLE_ERROR;

  699.    error = ladybugSetDisplayWindow( context );
  700.    _HANDLE_ERROR

  701.    initEnvMap();

  702.    // Track ball - left buton
  703.    // Pan - Shift + left button
  704.    // Dolly - Ctrl + left
  705.    object.configure_buttons( 1 );
  706.    
  707.    //
  708.    // Move the view point back
  709.    //
  710.    object.dolly.dolly[2] = -4;
  711.    
  712.    //
  713.    // Register callbacks:
  714.    //
  715.    glutDisplayFunc( display );
  716.    glutIdleFunc( grabImage );
  717.    glutMouseFunc( mouse );
  718.    glutMotionFunc( motion );
  719.    glutKeyboardFunc( key );
  720.    glutReshapeFunc( resize );
  721.    
  722.    b[' '] = true;

  723.    buildPopupMenu( );
  724.    glutAttachMenu( GLUT_RIGHT_BUTTON );
  725.           
  726.    glutCloseFunc( cleanUp );

  727.    //
  728.    // Turn the flow of control over to GLUT
  729.    //
  730.    printf( "Grabbing and display...\n" );
  731.    glutMainLoop( );
  732.    
  733.    return 0;
  734. }
复制代码

该用户从未签到

 楼主| 发表于 2012-12-7 21:57:29 | 显示全部楼层
我觉得这个问题的关键是,osg中有没有opengl rander context 这个东西?如果有,它能不能像在OpenGL一样被第三方的代码直接进行访问到。

该用户从未签到

 楼主| 发表于 2012-12-8 17:09:26 | 显示全部楼层
如果不行,我可能要学习OpenGL了。Ladybug保存一幅图片的时间是100毫秒左右。6幅就是600毫秒。太慢了。

该用户从未签到

发表于 2012-12-11 10:55:35 | 显示全部楼层
有HGLRC,可以通过GraphicsWindowWin32得到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表