zoukankan      html  css  js  c++  java
  • FBO 深度测试

    opengl fbo 测试程序,前几天别人问,帮写的

    头文件

     1 const int   SCREEN_WIDTH    = 400;
     2 const int   SCREEN_HEIGHT   = 400;
     3 const float CAMERA_DISTANCE = 6.0f;
     4 const int   TEXT_WIDTH      = 8;
     5 const int   TEXT_HEIGHT     = 8;
     6 const int   TEXTURE_WIDTH   = 400;  // NOTE: texture size cannot be larger than
     7 const int   TEXTURE_HEIGHT  = 400;  // the rendering window size in non-FBO mode
     8 const int   DATA_SIZE       = TEXTURE_WIDTH * TEXTURE_HEIGHT * sizeof(float);
     9 class GAMEINFO
    10 {
    11 public:
    12     GAMEINFO(){}
    13     ~GAMEINFO(){}
    14     void init_game();
    15     void init_light();
    16     void Draw();
    17     void Clear();
    18 private:
    19     void initGL();
    20     void initFBO();
    21     
    22 
    23 private:
    24     CVector3  m_eye,m_look;
    25     
    26     
    27     
    28     
    29     
    30     glInfo       OglInfo;
    31     
    32 private:
    33     
    34   GLuint fboId;                       // ID of FBO
    35 GLuint textureId;                   // ID of texture
    36 GLuint rboId;                       // ID of Renderbuffer object
    37     GLuint pboId;
    38 };

    实现

      1 #include"GAME.h"
      2 #include"FreeType.h"
      3 #include"FreeTypeReal.h"
      4 void DrawBox();
      5 void GAMEINFO::init_game()
      6 {
      7     
      8     LOG::Instance()->OutputError("OpenGL 1.3 required");
      9     initGL();
     10     
     11     init_light();
     12     TimerInit();
     13     
     14     
     15     
     16 
     17     /*vbo_supported();
     18     FBO_supported(); */
     19     OglInfo.getInfo();
     20     //OglInfo.printSelf();
     21     
     22 
     23     
     24 
     25     if(GLEE_ARB_vertex_buffer_object)
     26     {
     27         printf("Supput VBO! \n");
     28     
     29     }
     30     if(GLEE_ARB_pixel_buffer_object)
     31     {
     32         printf("Supput PBO! \n");
     33     }
     34     if(GLEE_ARB_framebuffer_object)
     35     {
     36         printf("Supput FBO! \n");
     37 
     38         
     39     }
     40     
     41 }
     42 
     43 void GAMEINFO::initGL()
     44 {
     45     int height=WINDOWSWIDTH;
     46     if(height==0)
     47         height=1;
     48 
     49     glViewport(0, 0, WINDOWSWIDTH, WINDOWSHEIGHT);
     50 
     51     //Set up projection matrix
     52     glMatrixMode(GL_PROJECTION);
     53     glLoadIdentity();
     54     gluPerspective(    45.0f, (GLfloat)WINDOWSWIDTH/(GLfloat)WINDOWSHEIGHT,1.0f, 3000.0f);
     55                     
     56     // glOrtho(0, 500, 0, 500, -1, 100); 
     57     //Load identity modelview
     58     glMatrixMode(GL_MODELVIEW);
     59     glLoadIdentity();
     60 
     61     //Shading states
     62     glShadeModel(GL_SMOOTH);
     63     glClearColor(0.0, 0.0f, 0.0f, 1.0f);
     64     glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
     65     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
     66     glDepthFunc(GL_LEQUAL);
     67 
     68     
     69     glClearDepth(1.0f);
     70     
     71     glEnable(GL_DEPTH_TEST);
     72     glDepthFunc(GL_LEQUAL);
     73     
     74     //our_font.init("C:\\WINDOWS\\Fonts\\simhei.TTF",16);
     75     
     76     init_light();
     77     
     78     initFBO();
     79     
     80 }
     81 
     82 
     83 void GAMEINFO::initFBO()
     84 {
     85 
     86      glGenTextures(1, &textureId);
     87     glBindTexture(GL_TEXTURE_2D, textureId);
     88     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     89     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     90     //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
     91     //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
     92     //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
     93     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     94     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     95     glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4
     96     //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
     97     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
     98     //glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
     99     glBindTexture(GL_TEXTURE_2D, 0);
    100 
    101 
    102 
    103      glGenFramebuffers(1, &fboId);
    104         glBindFramebuffer(GL_FRAMEBUFFER, fboId);
    105 
    106         // create a renderbuffer object to store depth info
    107         // NOTE: A depth renderable image should be attached the FBO for depth test.
    108         // If we don't attach a depth renderable image to the FBO, then
    109         // the rendering output will be corrupted because of missing depth test.
    110         // If you also need stencil test for your rendering, then you must
    111         // attach additional image to the stencil attachement point, too.
    112         glGenRenderbuffers(1, &rboId);
    113         glBindRenderbuffer(GL_RENDERBUFFER, rboId);
    114         glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
    115         glBindRenderbuffer(GL_RENDERBUFFER, 0);
    116 
    117         // attach a texture to FBO depth attachement point
    118         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId, 0);
    119 
    120         // attach a renderbuffer to depth attachment point
    121         //glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER_EXT, rboId);
    122 
    123         //@@ disable color buffer if you don't attach any color buffer image,
    124         //@@ for example, rendering depth buffer only to a texture.
    125         //@@ Otherwise, glCheckFramebufferStatusEXT will not be complete.
    126         glDrawBuffer(GL_NONE);
    127         glReadBuffer(GL_NONE);
    128 
    129         // check FBO status
    130       
    131         glBindFramebuffer(GL_FRAMEBUFFER, 0);
    132 
    133 
    134          glGenBuffersARB(1, &pboId);
    135         glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
    136         glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, DATA_SIZE, 0, GL_STREAM_READ_ARB);
    137 
    138         glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
    139 
    140 }
    141 void GAMEINFO::init_light()
    142 {
    143     static GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };                 // 环境光参数
    144     static GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };                 // 漫射光参数
    145     static GLfloat LightPosition[]= { 0.0f, 100.0f, 2.0f, 1.0f };                 // 光源位置
    146 
    147 
    148 
    149     glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);                // 设置环境光
    150     glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);                // 设置漫射光
    151     glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);            // 设置光源位置
    152 
    153     glEnable(GL_LIGHT1);                            // 启用一号光源
    154     glEnable(GL_LIGHTING);
    155 
    156 }
    157 
    158 
    159 void GAMEINFO::Clear()
    160 {
    161     
    162 
    163 }
    164 
    165 void GAMEINFO::Draw()
    166 {
    167     static float xrot=0,yrot=0,zrot=0,angle=0.0;
    168     
    169     static  float abc;
    170 
    171     /*glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
    172     
    173     
    174     
    175     ////glOrtho(0,WINDOWSWIDTH,0,WINDOWSHEIGHT,1,1000);
    176     
    177     glMatrixMode(GL_MODELVIEW);
    178     glLoadIdentity();
    179     
    180     glTranslatef(0,0,-20);
    181     //glRotatef(xrot++,1.0f,0.0f,0.0f);
    182     //glRotatef(yrot++,0.0f,1.0f,0.0f);
    183     //glRotatef(zrot++,0.0f,0.0f,1.0f);
    184     //
    185     glEnable(GL_TEXTURE_2D);
    186     glBindTexture(GL_TEXTURE_2D,0);
    187     glEnable(GL_LIGHTING);
    188     glColor3f(1.0f,1.0f,1.0f);
    189     glPushMatrix();*/
    190     /*
    191     glScalef(0.5f,0.5f,0.5f);
    192     glBegin(GL_QUADS);
    193         // Front Face
    194     
    195         glNormal3f( 0.0f, 0.0f, 1.0f);                    // 法线指向观察者
    196         glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    197         glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    198         glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    199         glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    200         // 后侧面
    201         
    202         glNormal3f( 0.0f, 0.0f,-1.0f);                    // 法线背向观察者
    203         glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    204         glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    
    205         glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    206         glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    207         // 顶面
    208         
    209         glNormal3f( 0.0f, 1.0f, 0.0f);                    // 法线向上
    210         glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    
    211         glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    212         glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    213         glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    214         // 底面
    215         
    216         glNormal3f( 0.0f,-1.0f, 0.0f);                    // 法线朝下
    217         glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    218         glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    219         glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    220         glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    221         // 右侧面
    222         glNormal3f( 1.0f, 0.0f, 0.0f);                    // 法线朝右
    223         glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    224         glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    225         glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    226         glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    227         // 左侧面
    228         glNormal3f(-1.0f, 0.0f, 0.0f);                    // 法线朝左
    229         glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    230         glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    231         glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    232         glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
    233     glEnd();
    234     
    235     
    236     */
    237     /*
    238     glPopMatrix();
    239     glEnable(GL_DEPTH_TEST);
    240     glEnable(GL_TEXTURE_2D);
    241 
    242     glDisable(GL_LIGHTING);
    243     
    244     abc+=0.1f;
    245     //glScalef(0.5f,0.5f,0.5f);
    246     
    247     glEnable(GL_MULTISAMPLE_ARB);
    248     glColor3f(1.0,0.0f,0.0);
    249     
    250     mFont.print(100,10,"C_Dragon fps:%d ",nfps);
    251     
    252     
    253     fpsCount();*/
    254     
    255                 glViewport(0, 0, 400, 400);
    256                 glMatrixMode(GL_PROJECTION);
    257                 glLoadIdentity();
    258                 gluPerspective(60.0f, (float)(400)/400, 1.0f, 100.0f);
    259 
    260     // with FBO
    261     // render directly to a texture
    262  
    263         // set the rendering destination to FBO
    264         glBindFramebuffer(GL_FRAMEBUFFER, fboId);
    265 
    266         // clear buffer
    267         glClearColor(1, 1, 1, 1);
    268         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    269 
    270         // draw a rotating teapot
    271       glTranslatef(0, 0, -CAMERA_DISTANCE);
    272                     
    273         glRotatef(angle*0.5f, 1, 0, 0);
    274     glRotatef(angle, 0, 1, 0);
    275     glRotatef(angle*0.7f, 0, 0, 1);
    276     glEnable(GL_TEXTURE_2D);
    277         glBindTexture(GL_TEXTURE_2D, 0);
    278     // draw a cube with the dynamic texture
    279     // glScalef(10.0f,10.0f,10.0f);
    280     DrawBox();
    281         glBindTexture(GL_TEXTURE_2D, 0);
    282         
    283         // back to normal window-system-provided framebuffer
    284         glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind
    285 
    286        
    287         glBindTexture(GL_TEXTURE_2D, textureId);
    288         glGenerateMipmap(GL_TEXTURE_2D);
    289         glBindTexture(GL_TEXTURE_2D, 0);
    290           glClearColor(0, 0, 0, 1);
    291 // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    292           glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    293     glColor3f(1.0f,0.0f,0.0);
    294         for(int ii=0 ;ii<2 ;ii++)
    295         {
    296             if(ii==0)
    297             {
    298                  glViewport(0, 0, 400, 400);
    299                 glMatrixMode(GL_PROJECTION);
    300                 glLoadIdentity();
    301                 gluPerspective(60.0f, (float)(400)/400, 1.0f, 100.0f);
    302                 
    303             }
    304 
    305             if(ii==1)
    306             {
    307                  glViewport(400, 0, 800, 400);
    308                 glMatrixMode(GL_PROJECTION);
    309                 glLoadIdentity();
    310                 glOrtho(0, 400, 0, 400, -1, 100); 
    311                 //gluPerspective(60.0f, (float)(400)/400, 1.0f, 100.0f);
    312                 
    313             
    314             }
    315 
    316             glMatrixMode (GL_MODELVIEW);                                    // Select The Modelview Matrix
    317             glLoadIdentity ();        
    318             
    319              glClear (GL_DEPTH_BUFFER_BIT);
    320              // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    321             if(ii==0)
    322             {
    323                     glTranslatef(0, 0, -CAMERA_DISTANCE);
    324                     
    325                      glRotatef(angle*0.5f, 1, 0, 0);
    326                     glRotatef(angle, 0, 1, 0);
    327                     glRotatef(angle*0.7f, 0, 0, 1);
    328                     glEnable(GL_TEXTURE_2D);
    329                      glBindTexture(GL_TEXTURE_2D, 0);
    330                     // draw a cube with the dynamic texture
    331                     // glScalef(10.0f,10.0f,10.0f);
    332                     DrawBox();
    333                      glBindTexture(GL_TEXTURE_2D, 0);
    334 
    335     
    336                 
    337             
    338             }
    339 
    340             if(ii==1)
    341             {
    342                         
    343     
    344                         glEnable(GL_TEXTURE_2D);
    345                          glBindTexture(GL_TEXTURE_2D,textureId);
    346                         // draw a cube with the dynamic texture
    347                          glBegin(GL_QUADS);    
    348                              glNormal3f( 0.0f, 0.0f, 1.0f);                    // 法线指向观察者
    349                             glTexCoord2f(0.0f, 0.0f); glVertex3f(    0.0f,      0.0f,  0.0f);    
    350                             glTexCoord2f(1.0f, 0.0f); glVertex3f( 200.0f,     0.0f,  0.0f);    
    351                             glTexCoord2f(1.0f, 1.0f); glVertex3f( 200.0f,  400.0f,  0.0f);    
    352                             glTexCoord2f(0.0f, 1.0f); glVertex3f(     0.0f,  400.0f,  0.0f);    
    353                             glEnd();
    354                          glBindTexture(GL_TEXTURE_2D, 0);
    355 
    356     
    357                         
    358             
    359             }
    360         
    361         }
    362 
    363          angle+=5.0f;
    364 
    365 }
    366 void DrawBox()
    367 {
    368 
    369     glBegin(GL_QUADS);
    370         // Front Face
    371         glNormal3f( 0.0f, 0.0f, 1.0f);                    // 法线指向观察者
    372         glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    373         glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    374         glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    375         glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    376         // 后侧面
    377         glNormal3f( 0.0f, 0.0f,-1.0f);                    // 法线背向观察者
    378         glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    379         glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    
    380         glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    381         glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    382         // 顶面
    383         glNormal3f( 0.0f, 1.0f, 0.0f);                    // 法线向上
    384         glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    
    385         glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    386         glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    387         glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    388         // 底面
    389         glNormal3f( 0.0f,-1.0f, 0.0f);                    // 法线朝下
    390         glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    391         glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    392         glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    393         glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    394         // 右侧面
    395         glNormal3f( 1.0f, 0.0f, 0.0f);                    // 法线朝右
    396         glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    397         glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    398         glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    399         glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    400         // 左侧面
    401         glNormal3f(-1.0f, 0.0f, 0.0f);                    // 法线朝左
    402         glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    403         glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    404         glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    405         glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
    406     glEnd();
    407 
    408 }

    效果图

  • 相关阅读:
    <置顶>Eclipse和myeclipse常用快捷键-操作-设置
    Eclipse : Loading descriptor for ...错误解决
    ORA-00937: 不是单组分组函数
    An error has occurred,See error log for more details 错误解决办法
    [Error Code: 942, SQL State: 42000] ORA-00942: 表或视图不存在
    ORA-00001: 违反唯一约束条件
    eclipse 出现user operation is waiting
    [空格][空白][特殊]字符/文字
    powerdesigner16.5安装教程及破解步骤
    mybatis遇到日期类型数据时String到date的转化
  • 原文地址:https://www.cnblogs.com/dragon2012/p/2949677.html
Copyright © 2011-2022 走看看