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 }

效果图

原文地址:https://www.cnblogs.com/dragon2012/p/2949677.html