glFeedbackBuffer —用来控制反馈模式
void glFeedbackBuffer( |
GLsizei size, |
|
GLenum type, |
|
GLfloat * buffer); |
Size:可以被写进buffer的值的最大数量。
Type:符号常量,描述每个顶点返回的信息。有: GL_2D, GL_3D, GL_3D_COLOR, GL_3D_COLOR_TEXTURE, and GL_4D_COLOR_TEXTURE 。
Buffer:返回反馈信息。
Description:
glFeedBackBuffer函数控制反馈。反馈模式(Feedbak)和选择模式(Selection)一样,是GL模式。通过使用glRenderMode(GL_FEEDBACK)选择这个模式。在反馈模式下,不会产生光栅化的像素,而是把将会被光栅化的图元信息返回到使用GL的应用里。
glFeedbackBuffer有三个参数:buffer是一个浮点数数组的的指针,反馈信息写入到这个数组里。Size指明了这个数组的大小。Type是一个符号化常量,描述了每个顶点返回的信息。在进入GL_FEEDBACK模式之前glFeedBackBuffer必须已经被创建了。在没有创建glFeedBackBuffer之前设置GL_FEEDBACK或者在反馈模式下创建GLFeedBackBuffer都会出现错误。
当glRenderMode函数在feedback模式下被调用的时候,它返回被存入feedback数组的词目数量,并且将feedback数组的指针重新设置到feedback buffer的底部。函数的返回的值永远不会超过size。如果feedback数据需要更多的可用空间,glRenderMode函数会返回一个负值。调用glRenderMode并且选一个不是GL_FEEDBACK的参数可退出反馈模式。
在反馈模式下,每个(在绘制模式下)将会被光栅化的图元、位图或者像素三角形产生一块数值,拷贝到反馈数组里。如果这么做会导致词目的数量超过最大值,数据块会被部分地写入以填充数组(如果数组还有空间的话),然后设置一个溢出标志。每一个数据块以一条指明图元类型的代码开始,后面接着描述图元顶点和相关信息的数据。对于位图和像素三角形来说,词目也被写入了。反馈发生在多边形剔除(culling)和glPolygonMode解释三角形之后,所以被剔除的多边形没有在反馈数组中返回。它也发生在有多于三条边的多边形被分解成三角形之后,如果GL通过这种分解来渲染多边形的话。
glPassThrough 命令可以用来在反馈数组里插入一个marker。
接下来是数值块写入反馈缓存的语法。每一个图元都用一个独一无二大的数值指明,后面跟着一些顶点,多边形词目包括一个整数,指明后面跟了多少顶点。顶点以一些浮点数的形式反馈,数量取决于type。在RGBA的模式下,颜色返回四个值;在颜色索引模式下返回一个值。
feedbackList ← feedbackItem feedbackList | feedbackItem
feedbackItem ← point| lineSegment | polygon | bitmap | pixelRectangle | passThru
point ← GL_POINT_TOKEN vertex
lineSegment ← GL_LINE_TOKEN vertex vertex| GL_LINE_RESET_TOKEN vertex vertex
polygon ← GL_POLYGON_TOKEN n polySpec
polySpec ← polySpec vertex | vertex vertex vertex
bitmap ← GL_BITMAP_TOKEN vertex
pixelRectangle ← GL_DRAW_PIXEL_TOKEN vertex| GL_COPY_PIXEL_TOKEN vertex
passThru ← GL_PASS_THROUGH_TOKEN value
vertex ← 2d | 3d | 3dColor | 3dColorTexture | 4dColorTexture
2d ← value value
3d ← value value value
3dColor ← value value value color
3dColorTexture ← value value value colortex
4dColorTexture ← value value value value colortex
color ← rgba | index
rgba ← value value value value
index ← value
tex ← value value value value
Value代表一个浮点数,n是一个浮点整数,表示多边形有多少顶点。GL_POINT_TOKEN, GL_LINE_TOKEN, GL_LINE_RESET_TOKEN, GL_POLYGON_TOKEN, GL_BITMAP_TOKEN, GL_DRAW_PIXEL_TOKEN, GL_COPY_PIXEL_TOKEN andGL_PASS_THROUGH_TOKEN是符号化的浮点数常量。无论何时重新设置点画线(line stipple)模式的时候,GL_LINE_RESET_TOKEN将会被返回。数值将会以顶点的方式返回,取决于反馈type。
下面的表格给出type和每个顶点值的个数的关系。k在颜色索引模式下为1,RGBA模式下为4.
Type |
Coordinates |
Color |
Texture |
Total Number of Values |
GL_2D |
x, y |
|
|
2 |
GL_3D |
x, y, z |
|
|
3 |
GL_3D_COLOR |
x, y, z |
k |
|
3 + k |
GL_3D_COLOR_TEXTURE |
x, y, z |
k |
4 |
7 + k |
GL_4D_COLOR_TEXTURE |
x, y, z, w |
k |
4 |
8 + k |
反馈顶点的坐标是窗口坐标,除了w,也就是裁剪坐标。如果启用了灯光,feedback中的颜色是被照亮过的。如果启用了生成纹理坐标,反馈的纹理坐标被生成了。并且总是被纹理矩阵转换过的。
注意:
glFeedBackBuffer,当使用到displaylist里是,不编译进display list而是直接执行。
glFeedBackBuffer只返回GL_TEXTURE0的纹理坐标。