OpenGL的反馈

转自:http://blog.csdn.net/sgnyyy/article/details/7308078

步骤:

1、调用glFeedbackBuffer()函数,指定用于保存反馈信息的数组。用于将来保存反馈的数据

2、以GL_FEEDBACK 为参数进入到feedback模式,在这个过程中图元不会光栅化产生像素,帧缓存区的内容也不会改变

3、glPassThrough函数在返回的数据中插入标记,以方便对反馈数据进行解析

4、用GL_Render模式返回,返回的值就是反馈缓存的数据量,而反馈缓存中存储的就是反馈相关的所有数据

5、对反馈数组进行解析,也就是对反馈的缓冲进行解析。




反馈缓冲可以的类型

GL_2D, GL_3D, GL_3D_COLOR, GL_3D_COLOR_TEXTURE, GL_4D_COLOR_TEXTURE. 对于每一种类型都可能对应了一种存储的方式,比如GL_3D_COLOR, 先存储的是定点信息,然后是颜色信息,这样就是, x, y, z, r, g, b, a. 7个元素的数据。

对于一个缓存的存储结构

转自OpenGL编程指南

[cpp]
#include "stdafx.h"  
#include <GL/glut.h>  
#include <stdlib.h>  
#include <stdio.h>  
  
/*  Initialize lighting. 
 */  
void init(void)  
{  
   glEnable(GL_LIGHTING);  
   glEnable(GL_LIGHT0);  
}  
  
/* Draw a few lines and two points, one of which will  
 * be clipped.  If in feedback mode, a passthrough token  
 * is issued between the each primitive. 
 */  
void drawGeometry (GLenum mode)  
{  
      glBegin (GL_LINE_STRIP);  
    glNormal3f (0.0, 0.0, 1.0);  
    glVertex3f (30.0, 30.0, 0.0);  
    glVertex3f (50.0, 60.0, 0.0);  
    glVertex3f (70.0, 40.0, 0.0);  
    glEnd ();  
   if (mode == GL_FEEDBACK)  
      glPassThrough (1.0);  
   glBegin (GL_POINTS);  
   glVertex3f (-100.0, -100.0, -100.0);  /*  will be clipped  */  
   glEnd ();  
   if (mode == GL_FEEDBACK)  
      glPassThrough (2.0);  
     glBegin (GL_POINTS);  
   glNormal3f (0.0, 0.0, 1.0);  
   glVertex3f (50.0, 50.0, 0.0);  
   glEnd ();  
}  
  
/* Write contents of one vertex to stdout.  */  
void print3DcolorVertex (GLint size, GLint *count,   
                         GLfloat *buffer)  
{  
   int i;  
  
   printf ("  ");  
   for (i = 0; i < 7; i++) {  
      printf ("%4.2f ", buffer[size-(*count)]);  
      *count = *count - 1;  
   }  
   printf ("\n");  
}  
  
/*  Write contents of entire buffer.  (Parse tokens!)   */  
void printBuffer(GLint size, GLfloat *buffer)  
{  
   GLint count;  
   GLfloat token;  
  
   count = size;  
   while (count) {  
      token = buffer[size-count];   
      count--;  
      if (token == GL_PASS_THROUGH_TOKEN) {  
         printf ("GL_PASS_THROUGH_TOKEN\n");  
         printf ("  %4.2f\n", buffer[size-count]);  
         count--;  
      }  
      else if (token == GL_POINT_TOKEN) {  
         printf ("GL_POINT_TOKEN\n");  
         print3DcolorVertex (size, &count, buffer);  
      }  
      else if (token == GL_LINE_TOKEN) {  
         printf ("GL_LINE_TOKEN\n");  
         print3DcolorVertex (size, &count, buffer);  
         print3DcolorVertex (size, &count, buffer);  
      }  
      else if (token == GL_LINE_RESET_TOKEN) {  
         printf ("GL_LINE_RESET_TOKEN\n");  
         print3DcolorVertex (size, &count, buffer);  
         print3DcolorVertex (size, &count, buffer);  
      }  
   }  
}  
  
void display(void)  
{  
   GLfloat feedBuffer[1024];  
   GLint size;  
  
   glMatrixMode (GL_PROJECTION);  
   glLoadIdentity ();  
   glOrtho (0.0, 100.0, 0.0, 100.0, 0.0, 1.0);  
  
   glClearColor (0.0, 0.0, 0.0, 0.0);  
   glClear(GL_COLOR_BUFFER_BIT);  
   drawGeometry (GL_RENDER);  
  
   glFeedbackBuffer (1024, GL_3D_COLOR, feedBuffer);  
   (void) glRenderMode (GL_FEEDBACK);  
   drawGeometry (GL_FEEDBACK);  
  
   size = glRenderMode (GL_RENDER);  
   printBuffer (size, feedBuffer);  
}  
  
void keyboard(unsigned char key, int x, int y)  
{  
   switch (key) {  
      case 27:  
         exit(0);  
         break;  
   }  
}  
  
/*  Main Loop  */  
int main(int argc, char** argv)  
{  
   glutInit(&argc, argv);  
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
   glutInitWindowSize (300, 300);  
   glutInitWindowPosition (100, 100);  
   glutCreateWindow(argv[0]);  
   init();  
   glutDisplayFunc(display);  
   glutKeyboardFunc (keyboard);  
   glutMainLoop();  
   return 0;   
}  





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值