反馈像选择一样也是一种渲染模式,不会往帧缓冲区中写数据,而是把信息填充到反馈缓冲区中。与选择模式返回名称栈不同,反馈的这些信息包括窗口坐标中经过变换的顶点数据,经过光照计算后的颜色数据,以及纹理数据和其他在光栅化图元中需要使用的数据。
通过调用glRenderMode(GL_FEEDBACK)进入反馈模式,调用glRenderMode(GL_RENDER)填充反馈缓冲区,并返回正常渲染模式。
反馈缓冲区是浮点数数组,通过glFeedbackBuffer来指定。
void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
第一个参数指定反馈缓冲区的大小,第二个参数type描述了反馈缓冲区中每个反馈顶点的信息。其可用的值如下表:
ps:如果支持多重纹理,反反馈只返回纹理单位0的纹理坐标
函数的最后一个参数,是指向反馈数据的指针。
在反馈模式下,每个将要光栅化的图元都会往反馈缓冲区中写值。写的值取决于你设置的type类型。没有光照的2D和3D图元对应的type是GL_2D和GL_3D,而有光照的3D图元使用GL_3D_COLOR, 有光照且有纹理坐标的,使用GL_3D_COLOR_TEXTURE或GL_4D_COLOR_TEXTURE.
每块反馈数据都是从一个表示图元类型的标记开始,紧接着是描述图元顶点以及相关信息的值。我们可以解析这些标记然后确定哪些类型的图元被渲染了。包含的标记如下表格
点,位图和像素的标记后面跟着的是单个顶点的数据和可能有的颜色和纹理数据(根据type类型的设置),直线标记后面跟着的是两个顶点的集合,多边形标记后面跟着的是一组顶点。用户自定义的标记(GL_PASS_THROUGH_TOKEN)后面跟着的是一个用户设置的浮点值。下面是GL_3D类型的反馈缓冲区示例:
反馈是在变换,光照,多边形剔除以及使用glPolygonMode设置多边形模式之后发生的。如果你有一些复杂的多边形是通过OpenGL内部的函数调用分解成多个三角形来绘制的(如之前讨论过的曲面细分),那么反馈的数据就可能包含了这些三角形的数据。在这种情况下反馈的数据不好分析。为了数据便于解析,我们可以在渲染该多边形之前插入一些过渡标记。通过void glPassThrough(GLfloat token);函数设置一个过渡标记。这个函数调用会在反馈缓冲区中插入一个GL_PASS_THROUGH_TOKEN的标记,并其后紧跟着函数设置的参数token值。
PS:如果不是在反馈模式下,这个函数调用不会产生任何效果。在glBegin/glEnd之间调用glPassThrough会产生GL_INVALID_OPERATION错误。
反馈模式的步骤与选择模式类似:
下面是绘制一个圆环和一个球体,通过你的鼠标选择,在你选择的物体外绘制一个矩形边框。效果图
其中绘制物体的函数如下:
鼠标点击的回调函数,处理选择
处理反馈信息的函数
渲染场景的函数